zorro_esp, was Re: m68k v3.16 status update

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, 19 Dec 2017, Michael Schmitz wrote:


Contrary to the Mac driver, esp->command_block and 
esp->command_block_dma are not identical addresses on Amiga.

Why not make them identical, depending on the length of the tranfer? 
(Then choose PIO or DMA by testing for the same threshold.)

esp->command_block_dma is mapped at driver init time so we don't get to 
chose at command submission time.

You could set esp->command_block_dma to an address like 0xffffffff. Then 
when zorro_esp's ops->send_dma_cmd method is to do a DMA to or from that 
address, check the transfer length. If the length is small, use 
esp->command_block as the address for a PIO transfer. Otherwise, use the 
mapped esp->command_block (which you saved somewhere at driver init time) 
for a DMA transfer.

This is a hack, of course. Perhaps we can avoid the hack if we pass the 
virtual address as an argument to ops->send_dma_cmd.

(Or *sg could be passed, if we cook up a couple of scattergather structs 
to replace ent->sense_ptr and esp->command_block. This might allow for the 
elimination of ops->map_single and ops->unmap_single altogether...)


(I can use esp->command_block in the reconnect message special case 
but not otherwise ...)

Maybe something like this...

	struct esp_cmd_entry *ent = esp->active_cmd;
	struct esp_cmd_priv *spriv = ESP_CMD_PRIV(ent->cmd);
	struct scatterlist *sg = spriv->cur_sg;
	unsigned long addr = sg_page(sg) + sg->offset;

but that doesn't work for the esp_autosense() case, which doesn't 
involve esp->ops->map_sg...

HTH

I'll give that a try to see if this works for regular transfers.

Will look at ways to identify autosense as well (do sense data fit into 
the ESP FIFO usually?)

You can identify the autosense case easily enough,

	struct esp_cmd_entry *ent = esp->active_cmd;
	struct esp_cmd_priv *spriv = ESP_CMD_PRIV(ent->cmd);
	unsigned long addr;

	if (ent->flags & ESP_CMD_FLAG_AUTOSENSE)
		addr = spriv->sense_ptr;
	else {
		struct scatterlist *sg = spriv->cur_sg;

		addr = sg_page(sg) + sg->offset;
	}

But that still leaves the command_block case unhandled (I don't think we 
can use spriv->cur_sg for that, so we'd need a hack like the one above). 

All this complexity doesn't really belong in the ops->send_dma_cmd method, 
so I think we are back to passing in the virtual pointer as a parameter. 

That change would touch every esp driver. But it could improve mac_esp, 
since mac_esp would no longer have to do any fake dma mapping. Maybe I 
should do a patch for this?

-- 


Cheers,

	Michael


--
To unsubscribe from this list: send the line "unsubscribe linux-m68k" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Video for Linux]     [Yosemite News]     [Linux S/390]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux