> +static void myrb_monitor(struct work_struct *work);
> +static inline void DAC960_P_To_PD_TranslateDeviceState(void *DeviceState);

Can you please use normal kernel function names and a normal prefix?

Also there seems to be no good reason to need a forward declaration for
this function.

> +static struct myrb_devstate_name_entry {
> +     enum myrb_devstate state;
> +     char *name;
> +} myrb_devstate_name_list[] = {
> +     { DAC960_V1_Device_Dead, "Dead" },
> +     { DAC960_V1_Device_WriteOnly, "WriteOnly" },
> +     { DAC960_V1_Device_Online, "Online" },
> +     { DAC960_V1_Device_Critical, "Critical" },
> +     { DAC960_V1_Device_Standby, "Standby" },
> +     { DAC960_V1_Device_Offline, NULL },
> +};

Please use MYRB_ as prefix.

> +static char *myrb_devstate_name(enum myrb_devstate state)
> +{
> +     struct myrb_devstate_name_entry *entry = myrb_devstate_name_list;
> +
> +     while (entry && entry->name) {
> +             if (entry->state == state)
> +                     return entry->name;
> +             entry++;
> +     }
> +     return (state == DAC960_V1_Device_Offline) ? "Offline" : "Unknown";

Why not use ARRAY_SIZE and use a proper list entry for Offline?

> +static char *myrb_raidlevel_name(enum myrb_raidlevel level)
> +{
> +     struct myrb_raidlevel_name_entry *entry = myrb_raidlevel_name_list;
> +
> +     while (entry && entry->name) {
> +             if (entry->level == level)
> +                     return entry->name;
> +             entry++;
> +     }
> +     return NULL;

Same here - please use ARRAY_SIZE.

> +/**
> + * myrb_exec_cmd - executes command block and waits for completion.
> + *
> + * Return: command status
> + */
> +static unsigned short myrb_exec_cmd(struct myrb_hba *cb, struct myrb_cmdblk 
> *cmd_blk)
> +{
> +     DECLARE_COMPLETION_ONSTACK(Completion);
> +     unsigned long flags;
> +
> +     cmd_blk->Completion = &Completion;
> +
> +     spin_lock_irqsave(&cb->queue_lock, flags);
> +     cb->qcmd(cb, cmd_blk);
> +     spin_unlock_irqrestore(&cb->queue_lock, flags);
> +
> +     wait_for_completion(&Completion);
> +     return cmd_blk->status;
> +}

My comment from ast time here is not addressed:

https://patchwork.kernel.org/comment/21613427/

> +     static char *DAC960_EventMessages[] =
> +             { "killed because write recovery failed",
> +               "killed because of SCSI bus reset failure",
> +               "killed because of double check condition",
> +               "killed because it was removed",
> +               "killed because of gross error on SCSI chip",
> +               "killed because of bad tag returned from drive",
> +               "killed because of timeout on SCSI command",
> +               "killed because of reset SCSI command issued from system",
> +               "killed because busy or parity error count exceeded limit",
> +               "killed because of 'kill drive' command from system",
> +               "killed because of selection timeout",
> +               "killed due to SCSI phase sequence error",
> +               "killed due to unknown status" };

Rather odd indentation.  It might also look a lot nicer if moved outside
the function.

> +     mbox->Type3E.addr = ev_addr;
> +     status = myrb_exec_cmd(cb, cmd_blk);
> +     if (status == DAC960_V1_NormalCompletion) {
> +             if (ev_buf->SequenceNumber == event) {

...

> +                     }
> +             }
> +     } else
> +             shost_printk(KERN_INFO, cb->host,
> +                          "Failed to get event log %d, status %04x\n",
> +                          event, status);
> +

Why not:

        if (status != DAC960_V1_NormalCompletion) {
                shost_printk(KERN_INFO, cb->host,
                             "Failed to get event log %d, status %04x\n",
                             event, status);
        } else if (ev_buf->SequenceNumber == event) {
                ...
        }

to reduce the indentation a bit?

> +     for (ldev_num = 0; ldev_num < ldev_cnt; ldev_num++) {
> +             struct myrb_ldev_info *old = NULL;
> +             struct myrb_ldev_info *new = cb->ldev_info_buf + ldev_num;
> +             struct scsi_device *sdev;
> +             enum myrb_devstate old_state = DAC960_V1_Device_Offline;
> +
> +             sdev = scsi_device_lookup(shost, myrb_logical_channel(shost),
> +                                       ldev_num, 0);
> +             if (sdev && sdev->hostdata)
> +                     old = sdev->hostdata;
> +             else if (new->State != DAC960_V1_Device_Offline) {
> +                     if (sdev)
> +                             scsi_device_put(sdev);
> +                     shost_printk(KERN_INFO, shost,
> +                                  "Adding Logical Drive %d in state %s\n",
> +                                  ldev_num, myrb_devstate_name(new->State));
> +                     scsi_add_device(shost, myrb_logical_channel(shost),
> +                                     ldev_num, 0);
> +                     break;
> +             }

I don't think finding a device but not having a hostdata can happen
here, as we always set it up in slave_alloc.

So this could become something like:

                sdev = scsi_device_lookup(shost, myrb_logical_channel(shost),
                                          ldev_num, 0);
                if (!sdev) {
                        if (new->State == DAC960_V1_Device_Offline)
                                continue;
                        shost_printk(KERN_INFO, shost,
                                     "Adding Logical Drive %d in state %s\n",
                                     ldev_num, myrb_devstate_name(new->State));
                        scsi_add_device(shost, myrb_logical_channel(shost),
                                        ldev_num, 0);
                        break;
                }

                old = sdev->hostdata;
                if (new->State != old->State)
                        shost_printk(KERN_INFO, shost,
                                     "Logical Drive %d is now %s\n",
                                     ldev_num, myrb_devstate_name(new->State));
                if (new->WriteBack != old->WriteBack)
                        sdev_printk(KERN_INFO, sdev,
                                    "Logical Drive is now WRITE %s\n",
                                    new->WriteBack ? "BACK" : "THRU");
                memcpy(old, new, sizeof(*new));
                scsi_device_put(sdev);
        }

But the break when adding the new device also looks odd to me.  Is
it gurantee we only see a single new device per call?

> +     /*
> +       Initialize the Controller Firmware Version field and verify that it
> +       is a supported firmware version.  The supported firmware versions are:
> +
> +       DAC1164P                  5.06 and above
> +       DAC960PTL/PRL/PJ/PG       4.06 and above
> +       DAC960PU/PD/PL            3.51 and above
> +       DAC960PU/PD/PL/P          2.73 and above
> +     */

Please switch to normal kernel comment style.

> +#if defined(CONFIG_ALPHA)

#ifdef CONFIG_ALPHA

> +static int myrb_host_reset(struct scsi_cmnd *scmd)
> +{
> +     struct Scsi_Host *shost = scmd->device->host;
> +     struct myrb_hba *cb = (struct myrb_hba *)shost->hostdata;

cb is an odd variable name for this type.  Also please use shost_priv()

> +     ldev_info = sdev->hostdata;
> +     if (!ldev_info ||

again, there should be no way for this to be NULL

> +     if (sdev->channel == myrb_logical_channel(sdev->host)) {

Maybe split some ldev/pdev alloc_slave helpers out here?

> +static void myrb_slave_destroy(struct scsi_device *sdev)
> +{
> +     void *hostdata = sdev->hostdata;
> +
> +     if (hostdata) {
> +             kfree(hostdata);
> +             sdev->hostdata = NULL;
> +     }

No need to check for NULL before kfree, and no need to zero a pointer
about to get freed itself.  This could just be:

static void myrb_slave_destroy(struct scsi_device *sdev)
{
        kfree(sdev->hostdata);
}

> +struct scsi_host_template myrb_template = {
> +     .module = THIS_MODULE,
> +     .name = "DAC960",
> +     .proc_name = "myrb",
> +     .queuecommand = myrb_queuecommand,
> +     .eh_host_reset_handler = myrb_host_reset,
> +     .slave_alloc = myrb_slave_alloc,
> +     .slave_configure = myrb_slave_configure,
> +     .slave_destroy = myrb_slave_destroy,
> +     .bios_param = myrb_biosparam,
> +     .cmd_size = sizeof(struct myrb_cmdblk),
> +     .shost_attrs = myrb_shost_attrs,
> +     .sdev_attrs = myrb_sdev_attrs,
> +     .this_id = -1,
> +};

Would be nice to aligned the = with tabs.

> +static int
> +myrb_is_raid(struct device *dev)
> +{
> +     struct scsi_device *sdev = to_scsi_device(dev);
> +
> +     return (sdev->channel == myrb_logical_channel(sdev->host)) ? 1 : 0;

No need for the ? 1 : 0:

        return sdev->channel == myrb_logical_channel(sdev->host);

> +static inline
> +void DAC960_LA_HardwareMailboxNewCommand(void __iomem *base)
> +{
> +     writeb(DAC960_LA_IDB_HWMBOX_NEW_CMD,
> +            base + DAC960_LA_InboundDoorBellRegisterOffset);
> +}

Please user proper linux style naming (also for constants and struct
members).

> +static inline
> +void DAC960_P_To_PD_TranslateReadWriteCommand(struct myrb_cmdblk *cmd_blk)

static inline void function();

or

static inline void
function()

please, but not the above.

> +static void DAC960_P_QueueCommand(struct myrb_hba *cb, struct myrb_cmdblk 
> *cmd_blk)

Overly long line.

> +static const struct pci_device_id myrb_id_table[] = {
> +     {
> +             .vendor         = PCI_VENDOR_ID_DEC,
> +             .device         = PCI_DEVICE_ID_DEC_21285,
> +             .subvendor      = PCI_SUBVENDOR_ID_MYLEX,
> +             .subdevice      = PCI_SUBDEVICE_ID_MYLEX_DAC960_LA,
> +             .driver_data    = (unsigned long) &DAC960_LA_privdata,
> +     },
> +     {
> +             .vendor         = PCI_VENDOR_ID_MYLEX,
> +             .device         = PCI_DEVICE_ID_MYLEX_DAC960_PG,
> +             .subvendor      = PCI_ANY_ID,
> +             .subdevice      = PCI_ANY_ID,
> +             .driver_data    = (unsigned long) &DAC960_PG_privdata,
> +     },

Please use the PCI_DEVICE_SUB and PCI_VDEVICE macros.

Reply via email to