Hi Finn,
Am 12.03.2018 um 22:04 schrieb Finn Thain:
>> + if (addr == esp->command_block_dma)
>> + addr = (u32) esp->command_block;
>
> Since you've removed the alternative branch and phys_to_virt(), I suggest
> you do this at function invocation... (see below)
Keeps it together with the phase and address tests, so easier to follow.
>> +static int zorro_esp_probe(struct zorro_dev *z,
>> + const struct zorro_device_id *ent)
>> +{
>> + struct scsi_host_template *tpnt = &scsi_esp_template;
>> + struct Scsi_Host *host;
>> + struct esp *esp;
>> + struct zorro_driver_data *zdd;
>> + struct zorro_esp_priv *zep;
>> + unsigned long board, ioaddr, dmaaddr;
>> + int err;
>> +
>> + board = zorro_resource_start(z);
>> + zdd = (struct zorro_driver_data *)ent->driver_data;
>> +
>> + pr_info("%s found at address 0x%lx.\n", zdd->name, board);
>> +
>> + zep = kmalloc(sizeof(*zep), GFP_KERNEL);
>> + if (!zep) {
>> + pr_err("Can't allocate device private data!\n");
>> + return -ENOMEM;
>> + }
>> +
>> + /* let's figure out whether we have a Zorro II or Zorro III board */
>> + if ((z->rom.er_Type & ERT_TYPEMASK) == ERT_ZORROIII) {
>> + /* note this is a Zorro III board */
>> + if (board > 0xffffff)
>> + zep->zorro3 = 1;
>
> The comment here seems to be redundant (?)
Not the only one.
> More importantly, I think you have to initialize zep->zorro3 = 0 in the
> other branch, or else use kzalloc() instead of kmalloc() above.
Using kzalloc() saves the zep->error=0 initialization later on so it's a
win.
>> + case
>> ZORRO_PROD_PHASE5_BLIZZARD_1230_II_FASTLANE_Z3_CYBERSCSI_CYBERSTORM060:
>> + if (zep->zorro3) {
>> + /* Fastlane Zorro III board */
>> + /* map address space up to ESP address for DMA */
>
> Same here?
I've left the comment explaining what the board low address space is
used for.
>> + zep->board_base = ioremap_nocache(board,
>> + FASTLANE_ESP_ADDR-1);
>> + if (!zep->board_base) {
>> + pr_err("Cannot allocate board address space\n");
>> + err = -ENOMEM;
>> + goto fail_free_host;
>> + }
>> + /* initialize DMA control shadow register */
>> + zep->ctrl_data = (FASTLANE_DMA_FCODE |
>> + FASTLANE_DMA_EDI | FASTLANE_DMA_ESI);
>> + zorro_esp_ops.send_dma_cmd =
>> + zorro_esp_send_fastlane_dma_cmd;
>> + zorro_esp_ops.irq_pending = fastlane_esp_irq_pending;
>> + zorro_esp_ops.dma_invalidate =
>> + fastlane_esp_dma_invalidate;
>> + } else {
>> + /* Blizzard 1230 II Zorro II board */
and that one - the board might be a Cyberstorm060 which would require
replacement of driver data, and replacement of the ESP register mapping.
Might need to clarify that here again...
>> + zorro_esp_ops.send_dma_cmd =
>> + zorro_esp_send_blz1230II_dma_cmd;
>> + //zorro_set_drvdata(z, host);
>> +
>
> Can that be deleted?
Leftover from when private data were static, so can go now.
>> +static void zorro_esp_remove(struct zorro_dev *z)
>> +{
>> + /* equivalent to dev_get_drvdata(z->dev) */
>
> If zorro_get_drvdata(z) needs a comment to explain it then why not just
> write dev_get_drvdata(z->dev) instead?
dev_get_drvdata(&z->dev) (struct zorro device incorporates the whole
struct device, not a pointer), but yes.
>> + struct zorro_esp_priv *zep = zorro_get_drvdata(z);
>> + struct esp *esp = zep->esp;
>> + struct Scsi_Host *host = esp->host;
>> +
>> + scsi_esp_unregister(esp);
>> +
>> + /* Disable interrupts. Perhaps use disable_irq instead ... */
>> +
>
> Can you clarify? free_irq() calls irq_shutdown()...
Which calls disable_irq() eventually if it's the last of shared
interrupts, true. disable_irq() would clearly be wrong here.
>
> Thanks!
>
My pleasure. I forgot to add your Reviewed-by tag - will do that for the
next version, OK?
Cheers,
Michael