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

Reply via email to