Lines Matching refs:qpti

140 static inline void qlogicpti_enable_irqs(struct qlogicpti *qpti)
143 qpti->qregs + SBUS_CTRL);
146 static inline void qlogicpti_disable_irqs(struct qlogicpti *qpti)
148 sbus_writew(0, qpti->qregs + SBUS_CTRL);
151 static inline void set_sbus_cfg1(struct qlogicpti *qpti)
154 u8 bursts = qpti->bursts;
174 sbus_writew(val, qpti->qregs + SBUS_CFG1);
177 static int qlogicpti_mbox_command(struct qlogicpti *qpti, u_short param[], int force)
186 tmp = sbus_readw(qpti->qregs + SBUS_SEMAPHORE);
188 sbus_writew(tmp, qpti->qregs + SBUS_SEMAPHORE);
192 while (--loop_count && (sbus_readw(qpti->qregs + HCCTRL) & HCCTRL_HIRQ)) {
198 qpti->qpti_id);
202 case 6: sbus_writew(param[5], qpti->qregs + MBOX5);
204 case 5: sbus_writew(param[4], qpti->qregs + MBOX4);
206 case 4: sbus_writew(param[3], qpti->qregs + MBOX3);
208 case 3: sbus_writew(param[2], qpti->qregs + MBOX2);
210 case 2: sbus_writew(param[1], qpti->qregs + MBOX1);
212 case 1: sbus_writew(param[0], qpti->qregs + MBOX0);
216 tmp = sbus_readw(qpti->qregs + HCCTRL);
218 sbus_writew(tmp, qpti->qregs + HCCTRL);
221 sbus_writew(0, qpti->qregs + SBUS_SEMAPHORE);
224 tmp = sbus_readw(qpti->qregs + HCCTRL);
226 sbus_writew(tmp, qpti->qregs + HCCTRL);
231 (sbus_readw(qpti->qregs + HCCTRL) & HCCTRL_CRIRQ))
235 qpti->qpti_id, param[0]);
240 !(sbus_readw(qpti->qregs + SBUS_SEMAPHORE) & SBUS_SEMAPHORE_LCK)) {
244 if (sbus_readw(qpti->qregs + MBOX0) & 0x4000)
249 qpti->qpti_id, param[0]);
253 while (--loop_count && (sbus_readw(qpti->qregs + MBOX0) == 0x04))
257 qpti->qpti_id, param[0]);
261 case 6: param[5] = sbus_readw(qpti->qregs + MBOX5);
263 case 5: param[4] = sbus_readw(qpti->qregs + MBOX4);
265 case 4: param[3] = sbus_readw(qpti->qregs + MBOX3);
267 case 3: param[2] = sbus_readw(qpti->qregs + MBOX2);
269 case 2: param[1] = sbus_readw(qpti->qregs + MBOX1);
271 case 1: param[0] = sbus_readw(qpti->qregs + MBOX0);
275 tmp = sbus_readw(qpti->qregs + HCCTRL);
277 sbus_writew(tmp, qpti->qregs + HCCTRL);
280 tmp = sbus_readw(qpti->qregs + SBUS_SEMAPHORE);
282 sbus_writew(tmp, qpti->qregs + SBUS_SEMAPHORE);
288 static inline void qlogicpti_set_hostdev_defaults(struct qlogicpti *qpti)
292 qpti->host_param.initiator_scsi_id = qpti->scsi_id;
293 qpti->host_param.bus_reset_delay = 3;
294 qpti->host_param.retry_count = 0;
295 qpti->host_param.retry_delay = 5;
296 qpti->host_param.async_data_setup_time = 3;
297 qpti->host_param.req_ack_active_negation = 1;
298 qpti->host_param.data_line_active_negation = 1;
299 qpti->host_param.data_dma_burst_enable = 1;
300 qpti->host_param.command_dma_burst_enable = 1;
301 qpti->host_param.tag_aging = 8;
302 qpti->host_param.selection_timeout = 250;
303 qpti->host_param.max_queue_depth = 256;
313 qpti->dev_param[i].device_flags = 0xcd;
314 qpti->dev_param[i].execution_throttle = 16;
315 if (qpti->ultra) {
316 qpti->dev_param[i].synchronous_period = 12;
317 qpti->dev_param[i].synchronous_offset = 8;
319 qpti->dev_param[i].synchronous_period = 25;
320 qpti->dev_param[i].synchronous_offset = 12;
322 qpti->dev_param[i].device_enable = 1;
328 struct qlogicpti *qpti = (struct qlogicpti *) host->hostdata;
338 sbus_writew(HCCTRL_PAUSE, qpti->qregs + HCCTRL);
341 if (sbus_readw(qpti->qregs + CPU_PCTRL) & CPU_PCTRL_BSY) {
342 sbus_writew(CPU_ORIDE_RMOD, qpti->qregs + CPU_ORIDE);
343 sbus_writew(CPU_CMD_BRESET, qpti->qregs + CPU_CMD);
347 sbus_writew(SBUS_CTRL_RESET, qpti->qregs + SBUS_CTRL);
348 sbus_writew((DMA_CTRL_CCLEAR | DMA_CTRL_CIRQ), qpti->qregs + CMD_DMA_CTRL);
349 sbus_writew((DMA_CTRL_CCLEAR | DMA_CTRL_CIRQ), qpti->qregs + DATA_DMA_CTRL);
352 while (--loop_count && ((sbus_readw(qpti->qregs + MBOX0) & 0xff) == 0x04))
356 qpti->qpti_id);
358 sbus_writew(HCCTRL_PAUSE, qpti->qregs + HCCTRL);
359 set_sbus_cfg1(qpti);
360 qlogicpti_enable_irqs(qpti);
362 if (sbus_readw(qpti->qregs + RISC_PSR) & RISC_PSR_ULTRA) {
363 qpti->ultra = 1;
365 qpti->qregs + RISC_MTREG);
367 qpti->ultra = 0;
369 qpti->qregs + RISC_MTREG);
374 qlogicpti_set_hostdev_defaults(qpti);
377 sbus_writew(HCCTRL_REL, qpti->qregs + HCCTRL);
382 if (qlogicpti_mbox_command(qpti, param, 1)) {
384 qpti->qpti_id);
391 param[1] = qpti->host_param.initiator_scsi_id;
392 if (qlogicpti_mbox_command(qpti, param, 1) ||
395 qpti->qpti_id);
401 qpti->req_in_ptr = qpti->res_out_ptr = 0;
405 param[2] = (u_short) (qpti->res_dvma >> 16);
406 param[3] = (u_short) (qpti->res_dvma & 0xffff);
408 if (qlogicpti_mbox_command(qpti, param, 1)) {
410 qpti->qpti_id);
417 param[2] = (u_short) (qpti->req_dvma >> 16);
418 param[3] = (u_short) (qpti->req_dvma & 0xffff);
420 if (qlogicpti_mbox_command(qpti, param, 1)) {
422 qpti->qpti_id);
428 param[1] = qpti->host_param.retry_count;
429 param[2] = qpti->host_param.retry_delay;
430 qlogicpti_mbox_command(qpti, param, 0);
433 param[1] = qpti->host_param.tag_aging;
434 qlogicpti_mbox_command(qpti, param, 0);
439 qlogicpti_mbox_command(qpti, param, 0);
443 qlogicpti_mbox_command(qpti, param, 0);
446 param[1] = qpti->host_param.selection_timeout;
447 qlogicpti_mbox_command(qpti, param, 0);
452 param[2] = (qpti->dev_param[i].device_flags << 8);
458 qlogicpti_mbox_command(qpti, param, 0);
465 param[1] = qpti->host_param.bus_reset_delay;
466 qlogicpti_mbox_command(qpti, param, 0);
467 qpti->send_marker = 1;
475 static int qlogicpti_load_firmware(struct qlogicpti *qpti)
480 struct Scsi_Host *host = qpti->qhost;
488 err = request_firmware(&fw, fwname, &qpti->op->dev);
513 qpti->qpti_id);
517 sbus_writew(SBUS_CTRL_RESET, qpti->qregs + SBUS_CTRL);
518 sbus_writew((DMA_CTRL_CCLEAR | DMA_CTRL_CIRQ), qpti->qregs + CMD_DMA_CTRL);
519 sbus_writew((DMA_CTRL_CCLEAR | DMA_CTRL_CIRQ), qpti->qregs + DATA_DMA_CTRL);
521 while (--timeout && (sbus_readw(qpti->qregs + SBUS_CTRL) & SBUS_CTRL_RESET))
524 printk(KERN_EMERG "qlogicpti%d: Cannot reset the ISP.", qpti->qpti_id);
529 sbus_writew(HCCTRL_RESET, qpti->qregs + HCCTRL);
532 sbus_writew((SBUS_CTRL_GENAB | SBUS_CTRL_ERIRQ), qpti->qregs + SBUS_CTRL);
533 set_sbus_cfg1(qpti);
534 sbus_writew(0, qpti->qregs + SBUS_SEMAPHORE);
536 if (sbus_readw(qpti->qregs + RISC_PSR) & RISC_PSR_ULTRA) {
537 qpti->ultra = 1;
539 qpti->qregs + RISC_MTREG);
541 qpti->ultra = 0;
543 qpti->qregs + RISC_MTREG);
546 sbus_writew(HCCTRL_REL, qpti->qregs + HCCTRL);
549 sbus_writew(HCCTRL_PAUSE, qpti->qregs + HCCTRL);
550 if (sbus_readw(qpti->qregs + CPU_PDIFF) & CPU_PDIFF_MODE)
551 qpti->differential = 1;
553 qpti->differential = 0;
554 sbus_writew(HCCTRL_REL, qpti->qregs + HCCTRL);
561 if (qlogicpti_mbox_command(qpti, param, 1)) {
563 qpti->qpti_id);
573 if (qlogicpti_mbox_command(qpti, param, 1) ||
576 qpti->qpti_id);
583 sbus_writew(HCCTRL_RESET, qpti->qregs + HCCTRL);
586 qlogicpti_enable_irqs(qpti);
587 sbus_writew(0, qpti->qregs + SBUS_SEMAPHORE);
588 sbus_writew(HCCTRL_REL, qpti->qregs + HCCTRL);
593 if (qlogicpti_mbox_command(qpti, param, 1) ||
596 qpti->qpti_id);
604 qlogicpti_mbox_command(qpti, param, 1);
607 if (qlogicpti_mbox_command(qpti, param, 1) ||
610 qpti->qpti_id);
616 qpti->fware_majrev = param[1];
617 qpti->fware_minrev = param[2];
618 qpti->fware_micrev = param[3];
622 param[1] = qpti->clock;
623 if (qlogicpti_mbox_command(qpti, param, 1) ||
626 qpti->qpti_id);
631 if (qpti->is_pti != 0) {
635 param[2] = (unsigned short) qpti->scsi_id;
636 qlogicpti_mbox_command(qpti, param, 1);
641 qlogicpti_mbox_command(qpti, param, 1);
651 static int qlogicpti_verify_tmon(struct qlogicpti *qpti)
653 int curstat = sbus_readb(qpti->sreg);
656 if (!(curstat & SREG_FUSE) && (qpti->swsreg & SREG_FUSE))
657 printk("qlogicpti%d: Fuse returned to normal state.\n", qpti->qpti_id);
658 if (!(curstat & SREG_TPOWER) && (qpti->swsreg & SREG_TPOWER))
659 printk("qlogicpti%d: termpwr back to normal state.\n", qpti->qpti_id);
660 if (curstat != qpti->swsreg) {
664 printk("qlogicpti%d: Fuse is open!\n", qpti->qpti_id);
668 printk("qlogicpti%d: termpwr failure\n", qpti->qpti_id);
670 if (qpti->differential &&
674 "differential bus! Please fix!\n", qpti->qpti_id);
676 qpti->swsreg = curstat;
684 static void qpti_chain_add(struct qlogicpti *qpti)
692 qlink->next = qpti;
694 qptichain = qpti;
696 qpti->next = NULL;
700 static void qpti_chain_del(struct qlogicpti *qpti)
703 if (qptichain == qpti) {
704 qptichain = qpti->next;
707 while(qlink->next != qpti)
709 qlink->next = qpti->next;
711 qpti->next = NULL;
715 static int qpti_map_regs(struct qlogicpti *qpti)
717 struct platform_device *op = qpti->op;
719 qpti->qregs = of_ioremap(&op->resource[0], 0,
722 if (!qpti->qregs) {
726 if (qpti->is_pti) {
727 qpti->sreg = of_ioremap(&op->resource[0], (16 * 4096),
730 if (!qpti->sreg) {
738 static int qpti_register_irq(struct qlogicpti *qpti)
740 struct platform_device *op = qpti->op;
742 qpti->qhost->irq = qpti->irq = op->archdata.irqs[0];
750 if (request_irq(qpti->irq, qpti_intr,
751 IRQF_SHARED, "QlogicPTI", qpti))
754 printk("qlogicpti%d: IRQ %d ", qpti->qpti_id, qpti->irq);
759 printk("qlogicpti%d: Cannot acquire irq line\n", qpti->qpti_id);
763 static void qpti_get_scsi_id(struct qlogicpti *qpti)
765 struct platform_device *op = qpti->op;
770 qpti->scsi_id = of_getintprop_default(dp, "initiator-id", -1);
771 if (qpti->scsi_id == -1)
772 qpti->scsi_id = of_getintprop_default(dp, "scsi-initiator-id",
774 if (qpti->scsi_id == -1)
775 qpti->scsi_id =
778 qpti->qhost->this_id = qpti->scsi_id;
779 qpti->qhost->max_sectors = 64;
781 printk("SCSI ID %d ", qpti->scsi_id);
784 static void qpti_get_bursts(struct qlogicpti *qpti)
786 struct platform_device *op = qpti->op;
798 qpti->bursts = bursts;
801 static void qpti_get_clock(struct qlogicpti *qpti)
808 cfreq = prom_getintdefault(qpti->prom_node,"clock-frequency",40000000);
809 qpti->clock = (cfreq + 500000)/1000000;
810 if (qpti->clock == 0) /* bullshit */
811 qpti->clock = 40;
817 static int qpti_map_queues(struct qlogicpti *qpti)
819 struct platform_device *op = qpti->op;
822 qpti->res_cpu = dma_alloc_coherent(&op->dev,
824 &qpti->res_dvma, GFP_ATOMIC);
825 if (qpti->res_cpu == NULL ||
826 qpti->res_dvma == 0) {
831 qpti->req_cpu = dma_alloc_coherent(&op->dev,
833 &qpti->req_dvma, GFP_ATOMIC);
834 if (qpti->req_cpu == NULL ||
835 qpti->req_dvma == 0) {
837 qpti->res_cpu, qpti->res_dvma);
841 memset(qpti->res_cpu, 0, QSIZE(RES_QUEUE_LEN));
842 memset(qpti->req_cpu, 0, QSIZE(QLOGICPTI_REQ_QUEUE_LEN));
849 struct qlogicpti *qpti = (struct qlogicpti *) host->hostdata;
852 qpti->qhost->irq, qpti->qregs);
869 struct qlogicpti *qpti)
879 if (qpti->cmd_count[Cmnd->device->id] == 0)
880 qpti->tag_ages[Cmnd->device->id] = jiffies;
881 if (time_after(jiffies, qpti->tag_ages[Cmnd->device->id] + (5*HZ))) {
883 qpti->tag_ages[Cmnd->device->id] = jiffies;
899 struct qlogicpti *qpti, u_int in_ptr, u_int out_ptr)
909 sg_count = dma_map_sg(&qpti->op->dev, sg,
931 cont = (struct Continuation_Entry *) &qpti->req_cpu[in_ptr];
960 qpti->cmd_slots[in_ptr] = Cmnd;
962 qpti->cmd_count[Cmnd->device->id]++;
963 sbus_writew(in_ptr, qpti->qregs + MBOX4);
964 qpti->req_in_ptr = in_ptr;
980 struct qlogicpti *qpti = shost_priv(sdev->host);
987 qpti->dev_param[tgt].device_flags |= 0x10;
989 qpti->dev_param[tgt].synchronous_offset = 0;
990 qpti->dev_param[tgt].synchronous_period = 0;
994 qpti->dev_param[tgt].device_flags |= 0x20;
998 param[2] = (qpti->dev_param[tgt].device_flags << 8);
999 if (qpti->dev_param[tgt].device_flags & 0x10) {
1000 param[3] = (qpti->dev_param[tgt].synchronous_offset << 8) |
1001 qpti->dev_param[tgt].synchronous_period;
1005 qlogicpti_mbox_command(qpti, param, 0);
1021 struct qlogicpti *qpti = (struct qlogicpti *) host->hostdata;
1026 in_ptr = qpti->req_in_ptr;
1027 cmd = (struct Command_Entry *) &qpti->req_cpu[in_ptr];
1028 out_ptr = sbus_readw(qpti->qregs + MBOX4);
1033 if (qpti->send_marker) {
1035 qpti->send_marker = 0;
1037 sbus_writew(in_ptr, qpti->qregs + MBOX4);
1038 qpti->req_in_ptr = in_ptr;
1041 cmd = (struct Command_Entry *) &qpti->req_cpu[in_ptr];
1044 cmd_frob(cmd, Cmnd, qpti);
1045 if ((in_ptr = load_cmd(Cmnd, cmd, qpti, in_ptr, out_ptr)) == -1)
1054 qpti->qpti_id);
1131 static struct scsi_cmnd *qlogicpti_intr_handler(struct qlogicpti *qpti)
1137 if (!(sbus_readw(qpti->qregs + SBUS_STAT) & SBUS_STAT_RINT))
1140 in_ptr = sbus_readw(qpti->qregs + MBOX5);
1141 sbus_writew(HCCTRL_CRIRQ, qpti->qregs + HCCTRL);
1142 if (sbus_readw(qpti->qregs + SBUS_SEMAPHORE) & SBUS_SEMAPHORE_LCK) {
1143 switch (sbus_readw(qpti->qregs + MBOX0)) {
1146 qpti->send_marker = 1;
1154 sbus_writew(0, qpti->qregs + SBUS_SEMAPHORE);
1158 out_ptr = qpti->res_out_ptr;
1162 sts = (struct Status_Entry *) &qpti->res_cpu[out_ptr];
1170 Cmnd = qpti->cmd_slots[cmd_slot];
1171 qpti->cmd_slots[cmd_slot] = NULL;
1176 qpti->send_marker = 1;
1184 qlogicpti_return_status(sts, qpti->qpti_id);
1189 dma_unmap_sg(&qpti->op->dev,
1193 qpti->cmd_count[Cmnd->device->id]--;
1194 sbus_writew(out_ptr, qpti->qregs + MBOX5);
1198 qpti->res_out_ptr = out_ptr;
1205 struct qlogicpti *qpti = dev_id;
1209 spin_lock_irqsave(qpti->qhost->host_lock, flags);
1210 dq = qlogicpti_intr_handler(qpti);
1221 spin_unlock_irqrestore(qpti->qhost->host_lock, flags);
1230 struct qlogicpti *qpti = (struct qlogicpti *) host->hostdata;
1236 qpti->qpti_id, (int)Cmnd->device->id, (int)Cmnd->device->lun);
1238 qlogicpti_disable_irqs(qpti);
1244 if (qpti->cmd_slots[i] == Cmnd)
1252 if (qlogicpti_mbox_command(qpti, param, 0) ||
1255 qpti->qpti_id, param[0]);
1259 qlogicpti_enable_irqs(qpti);
1268 struct qlogicpti *qpti = (struct qlogicpti *) host->hostdata;
1272 qpti->qpti_id);
1274 qlogicpti_disable_irqs(qpti);
1277 param[1] = qpti->host_param.bus_reset_delay;
1278 if (qlogicpti_mbox_command(qpti, param, 0) ||
1281 qpti->qpti_id, param[0]);
1285 qlogicpti_enable_irqs(qpti);
1308 struct qlogicpti *qpti;
1322 qpti = shost_priv(host);
1325 qpti->qhost = host;
1326 qpti->op = op;
1327 qpti->qpti_id = nqptis;
1328 qpti->is_pti = !of_node_name_eq(op->dev.of_node, "QLGC,isp");
1330 if (qpti_map_regs(qpti) < 0)
1333 if (qpti_register_irq(qpti) < 0)
1336 qpti_get_scsi_id(qpti);
1337 qpti_get_bursts(qpti);
1338 qpti_get_clock(qpti);
1341 memset(qpti->cmd_slots, 0, sizeof(qpti->cmd_slots));
1343 if (qpti_map_queues(qpti) < 0)
1347 if (qlogicpti_load_firmware(qpti))
1349 if (qpti->is_pti) {
1351 if (qlogicpti_verify_tmon(qpti))
1359 printk("(Firmware v%d.%d.%d)", qpti->fware_majrev,
1360 qpti->fware_minrev, qpti->fware_micrev);
1365 qpti->differential = of_property_read_bool(dp, "differential");
1368 qpti->qpti_id,
1369 (qpti->ultra ? "Ultra" : "Fast"),
1370 (qpti->differential ? "differential" : "single ended"));
1373 printk("qlogicpti%d: Failed scsi_add_host\n", qpti->qpti_id);
1377 dev_set_drvdata(&op->dev, qpti);
1379 qpti_chain_add(qpti);
1390 qpti->res_cpu, qpti->res_dvma);
1393 qpti->req_cpu, qpti->req_dvma);
1397 free_irq(qpti->irq, qpti);
1400 of_iounmap(&op->resource[0], qpti->qregs,
1402 if (qpti->is_pti)
1403 of_iounmap(&op->resource[0], qpti->sreg,
1414 struct qlogicpti *qpti = dev_get_drvdata(&op->dev);
1416 qpti_chain_del(qpti);
1418 scsi_remove_host(qpti->qhost);
1421 sbus_writew(0, qpti->qregs + SBUS_CTRL);
1424 free_irq(qpti->irq, qpti);
1429 qpti->res_cpu, qpti->res_dvma);
1432 qpti->req_cpu, qpti->req_dvma);
1435 of_iounmap(&op->resource[0], qpti->qregs,
1437 if (qpti->is_pti)
1438 of_iounmap(&op->resource[0], qpti->sreg, sizeof(unsigned char));
1440 scsi_host_put(qpti->qhost);
1464 .name = "qpti",