diff options
Diffstat (limited to 'drivers/scsi/aacraid/rx.c')
-rw-r--r-- | drivers/scsi/aacraid/rx.c | 90 |
1 files changed, 63 insertions, 27 deletions
diff --git a/drivers/scsi/aacraid/rx.c b/drivers/scsi/aacraid/rx.c index c715c4b2442d..a1d214d770eb 100644 --- a/drivers/scsi/aacraid/rx.c +++ b/drivers/scsi/aacraid/rx.c | |||
@@ -79,7 +79,7 @@ static irqreturn_t aac_rx_intr(int irq, void *dev_id, struct pt_regs *regs) | |||
79 | { | 79 | { |
80 | bellbits = rx_readl(dev, OutboundDoorbellReg); | 80 | bellbits = rx_readl(dev, OutboundDoorbellReg); |
81 | if (bellbits & DoorBellPrintfReady) { | 81 | if (bellbits & DoorBellPrintfReady) { |
82 | aac_printf(dev, rx_readl (dev, IndexRegs.Mailbox[5])); | 82 | aac_printf(dev, readl (&dev->IndexRegs->Mailbox[5])); |
83 | rx_writel(dev, MUnit.ODR,DoorBellPrintfReady); | 83 | rx_writel(dev, MUnit.ODR,DoorBellPrintfReady); |
84 | rx_writel(dev, InboundDoorbellReg,DoorBellPrintfDone); | 84 | rx_writel(dev, InboundDoorbellReg,DoorBellPrintfDone); |
85 | } | 85 | } |
@@ -134,14 +134,14 @@ static int rx_sync_cmd(struct aac_dev *dev, u32 command, | |||
134 | /* | 134 | /* |
135 | * Write the command into Mailbox 0 | 135 | * Write the command into Mailbox 0 |
136 | */ | 136 | */ |
137 | rx_writel(dev, InboundMailbox0, command); | 137 | writel(command, &dev->IndexRegs->Mailbox[0]); |
138 | /* | 138 | /* |
139 | * Write the parameters into Mailboxes 1 - 6 | 139 | * Write the parameters into Mailboxes 1 - 6 |
140 | */ | 140 | */ |
141 | rx_writel(dev, InboundMailbox1, p1); | 141 | writel(p1, &dev->IndexRegs->Mailbox[1]); |
142 | rx_writel(dev, InboundMailbox2, p2); | 142 | writel(p2, &dev->IndexRegs->Mailbox[2]); |
143 | rx_writel(dev, InboundMailbox3, p3); | 143 | writel(p3, &dev->IndexRegs->Mailbox[3]); |
144 | rx_writel(dev, InboundMailbox4, p4); | 144 | writel(p4, &dev->IndexRegs->Mailbox[4]); |
145 | /* | 145 | /* |
146 | * Clear the synch command doorbell to start on a clean slate. | 146 | * Clear the synch command doorbell to start on a clean slate. |
147 | */ | 147 | */ |
@@ -199,15 +199,15 @@ static int rx_sync_cmd(struct aac_dev *dev, u32 command, | |||
199 | * Pull the synch status from Mailbox 0. | 199 | * Pull the synch status from Mailbox 0. |
200 | */ | 200 | */ |
201 | if (status) | 201 | if (status) |
202 | *status = rx_readl(dev, IndexRegs.Mailbox[0]); | 202 | *status = readl(&dev->IndexRegs->Mailbox[0]); |
203 | if (r1) | 203 | if (r1) |
204 | *r1 = rx_readl(dev, IndexRegs.Mailbox[1]); | 204 | *r1 = readl(&dev->IndexRegs->Mailbox[1]); |
205 | if (r2) | 205 | if (r2) |
206 | *r2 = rx_readl(dev, IndexRegs.Mailbox[2]); | 206 | *r2 = readl(&dev->IndexRegs->Mailbox[2]); |
207 | if (r3) | 207 | if (r3) |
208 | *r3 = rx_readl(dev, IndexRegs.Mailbox[3]); | 208 | *r3 = readl(&dev->IndexRegs->Mailbox[3]); |
209 | if (r4) | 209 | if (r4) |
210 | *r4 = rx_readl(dev, IndexRegs.Mailbox[4]); | 210 | *r4 = readl(&dev->IndexRegs->Mailbox[4]); |
211 | /* | 211 | /* |
212 | * Clear the synch command doorbell. | 212 | * Clear the synch command doorbell. |
213 | */ | 213 | */ |
@@ -261,8 +261,6 @@ static void aac_rx_notify_adapter(struct aac_dev *dev, u32 event) | |||
261 | rx_writel(dev, MUnit.IDR,INBOUNDDOORBELL_3); | 261 | rx_writel(dev, MUnit.IDR,INBOUNDDOORBELL_3); |
262 | break; | 262 | break; |
263 | case HostShutdown: | 263 | case HostShutdown: |
264 | // rx_sync_cmd(dev, HOST_CRASHING, 0, 0, 0, 0, 0, 0, | ||
265 | // NULL, NULL, NULL, NULL, NULL); | ||
266 | break; | 264 | break; |
267 | case FastIo: | 265 | case FastIo: |
268 | rx_writel(dev, MUnit.IDR,INBOUNDDOORBELL_6); | 266 | rx_writel(dev, MUnit.IDR,INBOUNDDOORBELL_6); |
@@ -283,7 +281,7 @@ static void aac_rx_notify_adapter(struct aac_dev *dev, u32 event) | |||
283 | * Start up processing on an i960 based AAC adapter | 281 | * Start up processing on an i960 based AAC adapter |
284 | */ | 282 | */ |
285 | 283 | ||
286 | static void aac_rx_start_adapter(struct aac_dev *dev) | 284 | void aac_rx_start_adapter(struct aac_dev *dev) |
287 | { | 285 | { |
288 | struct aac_init *init; | 286 | struct aac_init *init; |
289 | 287 | ||
@@ -381,7 +379,7 @@ static int aac_rx_send(struct fib * fib) | |||
381 | dprintk((KERN_DEBUG "Index = 0x%x\n", Index)); | 379 | dprintk((KERN_DEBUG "Index = 0x%x\n", Index)); |
382 | if (Index == 0xFFFFFFFFL) | 380 | if (Index == 0xFFFFFFFFL) |
383 | return Index; | 381 | return Index; |
384 | device += Index; | 382 | device = dev->base + Index; |
385 | dprintk((KERN_DEBUG "entry = %x %x %u\n", (u32)(addr & 0xffffffff), | 383 | dprintk((KERN_DEBUG "entry = %x %x %u\n", (u32)(addr & 0xffffffff), |
386 | (u32)(addr >> 32), (u32)le16_to_cpu(fib->hw_fib->header.Size))); | 384 | (u32)(addr >> 32), (u32)le16_to_cpu(fib->hw_fib->header.Size))); |
387 | writel((u32)(addr & 0xffffffff), device); | 385 | writel((u32)(addr & 0xffffffff), device); |
@@ -394,6 +392,24 @@ static int aac_rx_send(struct fib * fib) | |||
394 | return 0; | 392 | return 0; |
395 | } | 393 | } |
396 | 394 | ||
395 | /** | ||
396 | * aac_rx_ioremap | ||
397 | * @size: mapping resize request | ||
398 | * | ||
399 | */ | ||
400 | static int aac_rx_ioremap(struct aac_dev * dev, u32 size) | ||
401 | { | ||
402 | if (!size) { | ||
403 | iounmap(dev->regs.rx); | ||
404 | return 0; | ||
405 | } | ||
406 | dev->base = dev->regs.rx = ioremap(dev->scsi_host_ptr->base, size); | ||
407 | if (dev->base == NULL) | ||
408 | return -1; | ||
409 | dev->IndexRegs = &dev->regs.rx->IndexRegs; | ||
410 | return 0; | ||
411 | } | ||
412 | |||
397 | static int aac_rx_restart_adapter(struct aac_dev *dev) | 413 | static int aac_rx_restart_adapter(struct aac_dev *dev) |
398 | { | 414 | { |
399 | u32 var; | 415 | u32 var; |
@@ -422,7 +438,7 @@ static int aac_rx_restart_adapter(struct aac_dev *dev) | |||
422 | * to the comm region. | 438 | * to the comm region. |
423 | */ | 439 | */ |
424 | 440 | ||
425 | int aac_rx_init(struct aac_dev *dev) | 441 | int _aac_rx_init(struct aac_dev *dev) |
426 | { | 442 | { |
427 | unsigned long start; | 443 | unsigned long start; |
428 | unsigned long status; | 444 | unsigned long status; |
@@ -432,23 +448,30 @@ int aac_rx_init(struct aac_dev *dev) | |||
432 | instance = dev->id; | 448 | instance = dev->id; |
433 | name = dev->name; | 449 | name = dev->name; |
434 | 450 | ||
451 | if (aac_adapter_ioremap(dev, dev->base_size)) { | ||
452 | printk(KERN_WARNING "%s: unable to map adapter.\n", name); | ||
453 | goto error_iounmap; | ||
454 | } | ||
455 | |||
435 | /* | 456 | /* |
436 | * Check to see if the board panic'd while booting. | 457 | * Check to see if the board panic'd while booting. |
437 | */ | 458 | */ |
438 | if (rx_readl(dev, MUnit.OMRx[0]) & KERNEL_PANIC) | 459 | status = rx_readl(dev, MUnit.OMRx[0]); |
460 | if (status & KERNEL_PANIC) | ||
439 | if (aac_rx_restart_adapter(dev)) | 461 | if (aac_rx_restart_adapter(dev)) |
440 | goto error_iounmap; | 462 | goto error_iounmap; |
441 | /* | 463 | /* |
442 | * Check to see if the board failed any self tests. | 464 | * Check to see if the board failed any self tests. |
443 | */ | 465 | */ |
444 | if (rx_readl(dev, MUnit.OMRx[0]) & SELF_TEST_FAILED) { | 466 | status = rx_readl(dev, MUnit.OMRx[0]); |
467 | if (status & SELF_TEST_FAILED) { | ||
445 | printk(KERN_ERR "%s%d: adapter self-test failed.\n", dev->name, instance); | 468 | printk(KERN_ERR "%s%d: adapter self-test failed.\n", dev->name, instance); |
446 | goto error_iounmap; | 469 | goto error_iounmap; |
447 | } | 470 | } |
448 | /* | 471 | /* |
449 | * Check to see if the monitor panic'd while booting. | 472 | * Check to see if the monitor panic'd while booting. |
450 | */ | 473 | */ |
451 | if (rx_readl(dev, MUnit.OMRx[0]) & MONITOR_PANIC) { | 474 | if (status & MONITOR_PANIC) { |
452 | printk(KERN_ERR "%s%d: adapter monitor panic.\n", dev->name, instance); | 475 | printk(KERN_ERR "%s%d: adapter monitor panic.\n", dev->name, instance); |
453 | goto error_iounmap; | 476 | goto error_iounmap; |
454 | } | 477 | } |
@@ -456,12 +479,10 @@ int aac_rx_init(struct aac_dev *dev) | |||
456 | /* | 479 | /* |
457 | * Wait for the adapter to be up and running. Wait up to 3 minutes | 480 | * Wait for the adapter to be up and running. Wait up to 3 minutes |
458 | */ | 481 | */ |
459 | while ((!(rx_readl(dev, IndexRegs.Mailbox[7]) & KERNEL_UP_AND_RUNNING)) | 482 | while (!((status = rx_readl(dev, MUnit.OMRx[0])) & KERNEL_UP_AND_RUNNING)) |
460 | || (!(rx_readl(dev, MUnit.OMRx[0]) & KERNEL_UP_AND_RUNNING))) | ||
461 | { | 483 | { |
462 | if(time_after(jiffies, start+startup_timeout*HZ)) | 484 | if(time_after(jiffies, start+startup_timeout*HZ)) |
463 | { | 485 | { |
464 | status = rx_readl(dev, IndexRegs.Mailbox[7]); | ||
465 | printk(KERN_ERR "%s%d: adapter kernel failed to start, init status = %lx.\n", | 486 | printk(KERN_ERR "%s%d: adapter kernel failed to start, init status = %lx.\n", |
466 | dev->name, instance, status); | 487 | dev->name, instance, status); |
467 | goto error_iounmap; | 488 | goto error_iounmap; |
@@ -496,11 +517,6 @@ int aac_rx_init(struct aac_dev *dev) | |||
496 | if (dev->new_comm_interface) | 517 | if (dev->new_comm_interface) |
497 | rx_writeb(dev, MUnit.OIMR, dev->OIMR = 0xf7); | 518 | rx_writeb(dev, MUnit.OIMR, dev->OIMR = 0xf7); |
498 | 519 | ||
499 | /* | ||
500 | * Tell the adapter that all is configured, and it can start | ||
501 | * accepting requests | ||
502 | */ | ||
503 | aac_rx_start_adapter(dev); | ||
504 | return 0; | 520 | return 0; |
505 | 521 | ||
506 | error_irq: | 522 | error_irq: |
@@ -511,3 +527,23 @@ error_iounmap: | |||
511 | 527 | ||
512 | return -1; | 528 | return -1; |
513 | } | 529 | } |
530 | |||
531 | int aac_rx_init(struct aac_dev *dev) | ||
532 | { | ||
533 | int retval; | ||
534 | |||
535 | /* | ||
536 | * Fill in the function dispatch table. | ||
537 | */ | ||
538 | dev->a_ops.adapter_ioremap = aac_rx_ioremap; | ||
539 | |||
540 | retval = _aac_rx_init(dev); | ||
541 | if (!retval) { | ||
542 | /* | ||
543 | * Tell the adapter that all is configured, and it can | ||
544 | * start accepting requests | ||
545 | */ | ||
546 | aac_rx_start_adapter(dev); | ||
547 | } | ||
548 | return retval; | ||
549 | } | ||