diff options
Diffstat (limited to 'drivers/scsi/qlogicpti.c')
| -rw-r--r-- | drivers/scsi/qlogicpti.c | 87 |
1 files changed, 40 insertions, 47 deletions
diff --git a/drivers/scsi/qlogicpti.c b/drivers/scsi/qlogicpti.c index 6d48d30bed05..c9984ef57f26 100644 --- a/drivers/scsi/qlogicpti.c +++ b/drivers/scsi/qlogicpti.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0-only /* qlogicpti.c: Performance Technologies QlogicISP sbus card driver. * * Copyright (C) 1996, 2006, 2008 David S. Miller (davem@davemloft.net) @@ -27,8 +28,9 @@ #include <linux/jiffies.h> #include <linux/dma-mapping.h> #include <linux/of.h> -#include <linux/of_device.h> +#include <linux/platform_device.h> #include <linux/firmware.h> +#include <linux/pgtable.h> #include <asm/byteorder.h> @@ -36,7 +38,6 @@ #include <asm/dma.h> #include <asm/ptrace.h> -#include <asm/pgtable.h> #include <asm/oplib.h> #include <asm/io.h> #include <asm/irq.h> @@ -199,10 +200,15 @@ static int qlogicpti_mbox_command(struct qlogicpti *qpti, u_short param[], int f /* Write mailbox command registers. */ switch (mbox_param[param[0]] >> 4) { case 6: sbus_writew(param[5], qpti->qregs + MBOX5); + fallthrough; case 5: sbus_writew(param[4], qpti->qregs + MBOX4); + fallthrough; case 4: sbus_writew(param[3], qpti->qregs + MBOX3); + fallthrough; case 3: sbus_writew(param[2], qpti->qregs + MBOX2); + fallthrough; case 2: sbus_writew(param[1], qpti->qregs + MBOX1); + fallthrough; case 1: sbus_writew(param[0], qpti->qregs + MBOX0); } @@ -253,10 +259,15 @@ static int qlogicpti_mbox_command(struct qlogicpti *qpti, u_short param[], int f /* Read back output parameters. */ switch (mbox_param[param[0]] & 0xf) { case 6: param[5] = sbus_readw(qpti->qregs + MBOX5); + fallthrough; case 5: param[4] = sbus_readw(qpti->qregs + MBOX4); + fallthrough; case 4: param[3] = sbus_readw(qpti->qregs + MBOX3); + fallthrough; case 3: param[2] = sbus_readw(qpti->qregs + MBOX2); + fallthrough; case 2: param[1] = sbus_readw(qpti->qregs + MBOX1); + fallthrough; case 1: param[0] = sbus_readw(qpti->qregs + MBOX0); } @@ -502,7 +513,7 @@ static int qlogicpti_load_firmware(struct qlogicpti *qpti) qpti->qpti_id); err = 1; goto out; - } + } sbus_writew(SBUS_CTRL_RESET, qpti->qregs + SBUS_CTRL); sbus_writew((DMA_CTRL_CCLEAR | DMA_CTRL_CIRQ), qpti->qregs + CMD_DMA_CTRL); sbus_writew((DMA_CTRL_CCLEAR | DMA_CTRL_CIRQ), qpti->qregs + DATA_DMA_CTRL); @@ -552,7 +563,7 @@ static int qlogicpti_load_firmware(struct qlogicpti *qpti) qpti->qpti_id); err = 1; goto out; - } + } /* Load it up.. */ for (i = 0; i < risc_code_length; i++) { @@ -710,7 +721,7 @@ static int qpti_map_regs(struct qlogicpti *qpti) "PTI Qlogic/ISP"); if (!qpti->qregs) { printk("PTI: Qlogic/ISP registers are unmappable\n"); - return -1; + return -ENODEV; } if (qpti->is_pti) { qpti->sreg = of_ioremap(&op->resource[0], (16 * 4096), @@ -718,7 +729,7 @@ static int qpti_map_regs(struct qlogicpti *qpti) "PTI Qlogic/ISP statreg"); if (!qpti->sreg) { printk("PTI: Qlogic/ISP status register is unmappable\n"); - return -1; + return -ENODEV; } } return 0; @@ -832,7 +843,7 @@ static int qpti_map_queues(struct qlogicpti *qpti) return 0; } -const char *qlogicpti_info(struct Scsi_Host *host) +static const char *qlogicpti_info(struct Scsi_Host *host) { static char buf[80]; struct qlogicpti *qpti = (struct qlogicpti *) host->hostdata; @@ -879,7 +890,7 @@ static inline void cmd_frob(struct Command_Entry *cmd, struct scsi_cmnd *Cmnd, cmd->control_flags |= CFLAG_WRITE; else cmd->control_flags |= CFLAG_READ; - cmd->time_out = Cmnd->request->timeout/HZ; + cmd->time_out = scsi_cmd_to_rq(Cmnd)->timeout / HZ; memcpy(cmd->cdb, Cmnd->cmnd, Cmnd->cmd_len); } @@ -898,7 +909,8 @@ static inline int load_cmd(struct scsi_cmnd *Cmnd, struct Command_Entry *cmd, sg_count = dma_map_sg(&qpti->op->dev, sg, scsi_sg_count(Cmnd), Cmnd->sc_data_direction); - + if (!sg_count) + return -1; ds = cmd->dataseg; cmd->segment_cnt = sg_count; @@ -959,11 +971,12 @@ static inline void update_can_queue(struct Scsi_Host *host, u_int in_ptr, u_int /* Temporary workaround until bug is found and fixed (one bug has been found already, but fixing it makes things even worse) -jj */ int num_free = QLOGICPTI_REQ_QUEUE_LEN - REQ_QUEUE_DEPTH(in_ptr, out_ptr) - 64; - host->can_queue = host->host_busy + num_free; + host->can_queue = scsi_host_busy(host) + num_free; host->sg_tablesize = QLOGICPTI_MAX_SG(num_free); } -static int qlogicpti_slave_configure(struct scsi_device *sdev) +static int qlogicpti_sdev_configure(struct scsi_device *sdev, + struct queue_limits *lim) { struct qlogicpti *qpti = shost_priv(sdev->host); int tgt = sdev->id; @@ -1002,16 +1015,15 @@ static int qlogicpti_slave_configure(struct scsi_device *sdev) * * "This code must fly." -davem */ -static int qlogicpti_queuecommand_lck(struct scsi_cmnd *Cmnd, void (*done)(struct scsi_cmnd *)) +static int qlogicpti_queuecommand_lck(struct scsi_cmnd *Cmnd) { + void (*done)(struct scsi_cmnd *) = scsi_done; struct Scsi_Host *host = Cmnd->device->host; struct qlogicpti *qpti = (struct qlogicpti *) host->hostdata; struct Command_Entry *cmd; u_int out_ptr; int in_ptr; - Cmnd->scsi_done = done; - in_ptr = qpti->req_in_ptr; cmd = (struct Command_Entry *) &qpti->req_cpu[in_ptr]; out_ptr = sbus_readw(qpti->qregs + MBOX4); @@ -1125,7 +1137,7 @@ static struct scsi_cmnd *qlogicpti_intr_handler(struct qlogicpti *qpti) if (!(sbus_readw(qpti->qregs + SBUS_STAT) & SBUS_STAT_RINT)) return NULL; - + in_ptr = sbus_readw(qpti->qregs + MBOX5); sbus_writew(HCCTRL_CRIRQ, qpti->qregs + HCCTRL); if (sbus_readw(qpti->qregs + SBUS_SEMAPHORE) & SBUS_SEMAPHORE_LCK) { @@ -1203,7 +1215,7 @@ static irqreturn_t qpti_intr(int irq, void *dev_id) struct scsi_cmnd *next; next = (struct scsi_cmnd *) dq->host_scribble; - dq->scsi_done(dq); + scsi_done(dq); dq = next; } while (dq != NULL); } @@ -1276,19 +1288,17 @@ static int qlogicpti_reset(struct scsi_cmnd *Cmnd) return return_status; } -static struct scsi_host_template qpti_template = { +static const struct scsi_host_template qpti_template = { .module = THIS_MODULE, .name = "qlogicpti", .info = qlogicpti_info, .queuecommand = qlogicpti_queuecommand, - .slave_configure = qlogicpti_slave_configure, + .sdev_configure = qlogicpti_sdev_configure, .eh_abort_handler = qlogicpti_abort, - .eh_bus_reset_handler = qlogicpti_reset, + .eh_host_reset_handler = qlogicpti_reset, .can_queue = QLOGICPTI_REQ_QUEUE_LEN, .this_id = 7, .sg_tablesize = QLOGICPTI_MAX_SG(QLOGICPTI_REQ_QUEUE_LEN), - .cmd_per_lun = 1, - .use_clustering = ENABLE_CLUSTERING, }; static const struct of_device_id qpti_match[]; @@ -1316,8 +1326,7 @@ static int qpti_sbus_probe(struct platform_device *op) qpti->qhost = host; qpti->op = op; qpti->qpti_id = nqptis; - strcpy(qpti->prom_name, op->dev.of_node->name); - qpti->is_pti = strcmp(qpti->prom_name, "QLGC,isp"); + qpti->is_pti = !of_node_name_eq(op->dev.of_node, "QLGC,isp"); if (qpti_map_regs(qpti) < 0) goto fail_unlink; @@ -1354,9 +1363,8 @@ static int qpti_sbus_probe(struct platform_device *op) fcode = of_get_property(dp, "isp-fcode", NULL); if (fcode && fcode[0]) printk("(FCode %s)", fcode); - if (of_find_property(dp, "differential", NULL) != NULL) - qpti->differential = 1; - + qpti->differential = of_property_read_bool(dp, "differential"); + printk("\nqlogicpti%d: [%s Wide, using %s interface]\n", qpti->qpti_id, (qpti->ultra ? "Ultra" : "Fast"), @@ -1386,6 +1394,9 @@ fail_unmap_queues: qpti->req_cpu, qpti->req_dvma); #undef QSIZE +fail_free_irq: + free_irq(qpti->irq, qpti); + fail_unmap_regs: of_iounmap(&op->resource[0], qpti->qregs, resource_size(&op->resource[0])); @@ -1393,16 +1404,13 @@ fail_unmap_regs: of_iounmap(&op->resource[0], qpti->sreg, sizeof(unsigned char)); -fail_free_irq: - free_irq(qpti->irq, qpti); - fail_unlink: scsi_host_put(host); return -ENODEV; } -static int qpti_sbus_remove(struct platform_device *op) +static void qpti_sbus_remove(struct platform_device *op) { struct qlogicpti *qpti = dev_get_drvdata(&op->dev); @@ -1431,8 +1439,6 @@ static int qpti_sbus_remove(struct platform_device *op) of_iounmap(&op->resource[0], qpti->sreg, sizeof(unsigned char)); scsi_host_put(qpti->qhost); - - return 0; } static const struct of_device_id qpti_match[] = { @@ -1455,28 +1461,15 @@ MODULE_DEVICE_TABLE(of, qpti_match); static struct platform_driver qpti_sbus_driver = { .driver = { .name = "qpti", - .owner = THIS_MODULE, .of_match_table = qpti_match, }, .probe = qpti_sbus_probe, .remove = qpti_sbus_remove, }; - -static int __init qpti_init(void) -{ - return platform_driver_register(&qpti_sbus_driver); -} - -static void __exit qpti_exit(void) -{ - platform_driver_unregister(&qpti_sbus_driver); -} +module_platform_driver(qpti_sbus_driver); MODULE_DESCRIPTION("QlogicISP SBUS driver"); -MODULE_AUTHOR("David S. Miller (davem@davemloft.net)"); +MODULE_AUTHOR("David S. Miller <davem@davemloft.net>"); MODULE_LICENSE("GPL"); MODULE_VERSION("2.1"); MODULE_FIRMWARE("qlogic/isp1000.bin"); - -module_init(qpti_init); -module_exit(qpti_exit); |
