···11/* qlogicpti.c: Performance Technologies QlogicISP sbus card driver.22 *33- * Copyright (C) 1996, 2006 David S. Miller (davem@davemloft.net)33+ * Copyright (C) 1996, 2006, 2008 David S. Miller (davem@davemloft.net)44 *55 * A lot of this driver was directly stolen from Erik H. Moe's PCI66 * Qlogic ISP driver. Mucho kudos to him for this code.···2626#include <linux/module.h>2727#include <linux/jiffies.h>2828#include <linux/dma-mapping.h>2929+#include <linux/of.h>3030+#include <linux/of_device.h>29313032#include <asm/byteorder.h>31333234#include "qlogicpti.h"33353434-#include <asm/sbus.h>3536#include <asm/dma.h>3637#include <asm/system.h>3738#include <asm/ptrace.h>···686685687686static int __devinit qpti_map_regs(struct qlogicpti *qpti)688687{689689- struct sbus_dev *sdev = qpti->sdev;688688+ struct of_device *op = qpti->op;690689691691- qpti->qregs = sbus_ioremap(&sdev->resource[0], 0,692692- sdev->reg_addrs[0].reg_size,693693- "PTI Qlogic/ISP");690690+ qpti->qregs = of_ioremap(&op->resource[0], 0,691691+ resource_size(&op->resource[0]),692692+ "PTI Qlogic/ISP");694693 if (!qpti->qregs) {695694 printk("PTI: Qlogic/ISP registers are unmappable\n");696695 return -1;697696 }698697 if (qpti->is_pti) {699699- qpti->sreg = sbus_ioremap(&sdev->resource[0], (16 * 4096),700700- sizeof(unsigned char),701701- "PTI Qlogic/ISP statreg");698698+ qpti->sreg = of_ioremap(&op->resource[0], (16 * 4096),699699+ sizeof(unsigned char),700700+ "PTI Qlogic/ISP statreg");702701 if (!qpti->sreg) {703702 printk("PTI: Qlogic/ISP status register is unmappable\n");704703 return -1;···709708710709static int __devinit qpti_register_irq(struct qlogicpti *qpti)711710{712712- struct sbus_dev *sdev = qpti->sdev;711711+ struct of_device *op = qpti->op;713712714714- qpti->qhost->irq = qpti->irq = sdev->irqs[0];713713+ qpti->qhost->irq = qpti->irq = op->irqs[0];715714716715 /* We used to try various overly-clever things to717716 * reduce the interrupt processing overhead on···734733735734static void __devinit qpti_get_scsi_id(struct qlogicpti *qpti)736735{737737- qpti->scsi_id = prom_getintdefault(qpti->prom_node,738738- "initiator-id",739739- -1);736736+ struct of_device *op = qpti->op;737737+ struct device_node *dp;738738+739739+ dp = op->node;740740+741741+ qpti->scsi_id = of_getintprop_default(dp, "initiator-id", -1);740742 if (qpti->scsi_id == -1)741741- qpti->scsi_id = prom_getintdefault(qpti->prom_node,742742- "scsi-initiator-id",743743- -1);743743+ qpti->scsi_id = of_getintprop_default(dp, "scsi-initiator-id",744744+ -1);744745 if (qpti->scsi_id == -1)745746 qpti->scsi_id =746746- prom_getintdefault(qpti->sdev->bus->prom_node,747747- "scsi-initiator-id", 7);747747+ of_getintprop_default(dp->parent,748748+ "scsi-initiator-id", 7);748749 qpti->qhost->this_id = qpti->scsi_id;749750 qpti->qhost->max_sectors = 64;750751···755752756753static void qpti_get_bursts(struct qlogicpti *qpti)757754{758758- struct sbus_dev *sdev = qpti->sdev;755755+ struct of_device *op = qpti->op;759756 u8 bursts, bmask;760757761761- bursts = prom_getintdefault(qpti->prom_node, "burst-sizes", 0xff);762762- bmask = prom_getintdefault(sdev->bus->prom_node,763763- "burst-sizes", 0xff);758758+ bursts = of_getintprop_default(op->node, "burst-sizes", 0xff);759759+ bmask = of_getintprop_default(op->node->parent, "burst-sizes", 0xff);764760 if (bmask != 0xff)765761 bursts &= bmask;766762 if (bursts == 0xff ||···788786 */789787static int __devinit qpti_map_queues(struct qlogicpti *qpti)790788{791791- struct sbus_dev *sdev = qpti->sdev;789789+ struct of_device *op = qpti->op;792790793791#define QSIZE(entries) (((entries) + 1) * QUEUE_ENTRY_LEN)794794- qpti->res_cpu = dma_alloc_coherent(&sdev->ofdev.dev,792792+ qpti->res_cpu = dma_alloc_coherent(&op->dev,795793 QSIZE(RES_QUEUE_LEN),796794 &qpti->res_dvma, GFP_ATOMIC);797795 if (qpti->res_cpu == NULL ||···800798 return -1;801799 }802800803803- qpti->req_cpu = dma_alloc_coherent(&sdev->ofdev.dev,801801+ qpti->req_cpu = dma_alloc_coherent(&op->dev,804802 QSIZE(QLOGICPTI_REQ_QUEUE_LEN),805803 &qpti->req_dvma, GFP_ATOMIC);806804 if (qpti->req_cpu == NULL ||807805 qpti->req_dvma == 0) {808808- dma_free_coherent(&sdev->ofdev.dev, QSIZE(RES_QUEUE_LEN),806806+ dma_free_coherent(&op->dev, QSIZE(RES_QUEUE_LEN),809807 qpti->res_cpu, qpti->res_dvma);810808 printk("QPTI: Cannot map request queue.\n");811809 return -1;···878876 int sg_count;879877880878 sg = scsi_sglist(Cmnd);881881- sg_count = dma_map_sg(&qpti->sdev->ofdev.dev, sg,879879+ sg_count = dma_map_sg(&qpti->op->dev, sg,882880 scsi_sg_count(Cmnd),883881 Cmnd->sc_data_direction);884882···11551153 Cmnd->result = DID_ERROR << 16;1156115411571155 if (scsi_bufflen(Cmnd))11581158- dma_unmap_sg(&qpti->sdev->ofdev.dev,11561156+ dma_unmap_sg(&qpti->op->dev,11591157 scsi_sglist(Cmnd), scsi_sg_count(Cmnd),11601158 Cmnd->sc_data_direction);11611159···12711269 .use_clustering = ENABLE_CLUSTERING,12721270};1273127112741274-static int __devinit qpti_sbus_probe(struct of_device *dev, const struct of_device_id *match)12721272+static int __devinit qpti_sbus_probe(struct of_device *op, const struct of_device_id *match)12751273{12761276- static int nqptis;12771277- struct sbus_dev *sdev = to_sbus_device(&dev->dev);12781278- struct device_node *dp = dev->node;12791274 struct scsi_host_template *tpnt = match->data;12751275+ struct device_node *dp = op->node;12801276 struct Scsi_Host *host;12811277 struct qlogicpti *qpti;12781278+ static int nqptis;12821279 const char *fcode;1283128012841281 /* Sometimes Antares cards come up not completely12851282 * setup, and we get a report of a zero IRQ.12861283 */12871287- if (sdev->irqs[0] == 0)12841284+ if (op->irqs[0] == 0)12881285 return -ENODEV;1289128612901287 host = scsi_host_alloc(tpnt, sizeof(struct qlogicpti));12911288 if (!host)12921289 return -ENOMEM;1293129012941294- qpti = (struct qlogicpti *) host->hostdata;12911291+ qpti = shost_priv(host);1295129212961293 host->max_id = MAX_TARGETS;12971294 qpti->qhost = host;12981298- qpti->sdev = sdev;12951295+ qpti->op = op;12991296 qpti->qpti_id = nqptis;13001300- qpti->prom_node = sdev->prom_node;13011301- strcpy(qpti->prom_name, sdev->ofdev.node->name);12971297+ strcpy(qpti->prom_name, op->node->name);13021298 qpti->is_pti = strcmp(qpti->prom_name, "QLGC,isp");1303129913041300 if (qpti_map_regs(qpti) < 0)···13421342 (qpti->ultra ? "Ultra" : "Fast"),13431343 (qpti->differential ? "differential" : "single ended"));1344134413451345- if (scsi_add_host(host, &dev->dev)) {13451345+ if (scsi_add_host(host, &op->dev)) {13461346 printk("qlogicpti%d: Failed scsi_add_host\n", qpti->qpti_id);13471347 goto fail_unmap_queues;13481348 }1349134913501350- dev_set_drvdata(&sdev->ofdev.dev, qpti);13501350+ dev_set_drvdata(&op->dev, qpti);1351135113521352 qpti_chain_add(qpti);13531353···1358135813591359fail_unmap_queues:13601360#define QSIZE(entries) (((entries) + 1) * QUEUE_ENTRY_LEN)13611361- dma_free_coherent(&qpti->sdev->ofdev.dev,13611361+ dma_free_coherent(&op->dev,13621362 QSIZE(RES_QUEUE_LEN),13631363 qpti->res_cpu, qpti->res_dvma);13641364- dma_free_coherent(&qpti->sdev->ofdev.dev,13641364+ dma_free_coherent(&op->dev,13651365 QSIZE(QLOGICPTI_REQ_QUEUE_LEN),13661366 qpti->req_cpu, qpti->req_dvma);13671367#undef QSIZE1368136813691369fail_unmap_regs:13701370- sbus_iounmap(qpti->qregs,13711371- qpti->sdev->reg_addrs[0].reg_size);13701370+ of_iounmap(&op->resource[0], qpti->qregs,13711371+ resource_size(&op->resource[0]));13721372 if (qpti->is_pti)13731373- sbus_iounmap(qpti->sreg, sizeof(unsigned char));13731373+ of_iounmap(&op->resource[0], qpti->sreg,13741374+ sizeof(unsigned char));1374137513751376fail_free_irq:13761377 free_irq(qpti->irq, qpti);···13821381 return -ENODEV;13831382}1384138313851385-static int __devexit qpti_sbus_remove(struct of_device *dev)13841384+static int __devexit qpti_sbus_remove(struct of_device *op)13861385{13871387- struct qlogicpti *qpti = dev_get_drvdata(&dev->dev);13861386+ struct qlogicpti *qpti = dev_get_drvdata(&op->dev);1388138713891388 qpti_chain_del(qpti);13901389···13971396 free_irq(qpti->irq, qpti);1398139713991398#define QSIZE(entries) (((entries) + 1) * QUEUE_ENTRY_LEN)14001400- dma_free_coherent(&qpti->sdev->ofdev.dev,13991399+ dma_free_coherent(&op->dev,14011400 QSIZE(RES_QUEUE_LEN),14021401 qpti->res_cpu, qpti->res_dvma);14031403- dma_free_coherent(&qpti->sdev->ofdev.dev,14021402+ dma_free_coherent(&op->dev,14041403 QSIZE(QLOGICPTI_REQ_QUEUE_LEN),14051404 qpti->req_cpu, qpti->req_dvma);14061405#undef QSIZE1407140614081408- sbus_iounmap(qpti->qregs, qpti->sdev->reg_addrs[0].reg_size);14071407+ of_iounmap(&op->resource[0], qpti->qregs,14081408+ resource_size(&op->resource[0]));14091409 if (qpti->is_pti)14101410- sbus_iounmap(qpti->sreg, sizeof(unsigned char));14101410+ of_iounmap(&op->resource[0], qpti->sreg, sizeof(unsigned char));1411141114121412 scsi_host_put(qpti->qhost);14131413···1445144314461444static int __init qpti_init(void)14471445{14481448- return of_register_driver(&qpti_sbus_driver, &sbus_bus_type);14461446+ return of_register_driver(&qpti_sbus_driver, &of_bus_type);14491447}1450144814511449static void __exit qpti_exit(void)···14561454MODULE_DESCRIPTION("QlogicISP SBUS driver");14571455MODULE_AUTHOR("David S. Miller (davem@davemloft.net)");14581456MODULE_LICENSE("GPL");14591459-MODULE_VERSION("2.0");14571457+MODULE_VERSION("2.1");1460145814611459module_init(qpti_init);14621460module_exit(qpti_exit);
+1-1
drivers/scsi/qlogicpti.h
···342342 u_int req_in_ptr; /* index of next request slot */343343 u_int res_out_ptr; /* index of next result slot */344344 long send_marker; /* must we send a marker? */345345- struct sbus_dev *sdev;345345+ struct of_device *op;346346 unsigned long __pad;347347348348 int cmd_count[MAX_TARGETS];