aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/block/cciss_scsi.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/block/cciss_scsi.c')
-rw-r--r--drivers/block/cciss_scsi.c591
1 files changed, 288 insertions, 303 deletions
diff --git a/drivers/block/cciss_scsi.c b/drivers/block/cciss_scsi.c
index 3604b72f2af9..9133ad4c7b1b 100644
--- a/drivers/block/cciss_scsi.c
+++ b/drivers/block/cciss_scsi.c
@@ -44,7 +44,7 @@
44#define CCISS_ABORT_MSG 0x00 44#define CCISS_ABORT_MSG 0x00
45#define CCISS_RESET_MSG 0x01 45#define CCISS_RESET_MSG 0x01
46 46
47static int fill_cmd(CommandList_struct *c, __u8 cmd, int ctlr, void *buff, 47static int fill_cmd(ctlr_info_t *h, CommandList_struct *c, __u8 cmd, void *buff,
48 size_t size, 48 size_t size,
49 __u8 page_code, unsigned char *scsi3addr, 49 __u8 page_code, unsigned char *scsi3addr,
50 int cmd_type); 50 int cmd_type);
@@ -127,16 +127,16 @@ struct cciss_scsi_adapter_data_t {
127 spinlock_t lock; // to protect ccissscsi[ctlr]; 127 spinlock_t lock; // to protect ccissscsi[ctlr];
128}; 128};
129 129
130#define CPQ_TAPE_LOCK(ctlr, flags) spin_lock_irqsave( \ 130#define CPQ_TAPE_LOCK(h, flags) spin_lock_irqsave( \
131 &hba[ctlr]->scsi_ctlr->lock, flags); 131 &h->scsi_ctlr->lock, flags);
132#define CPQ_TAPE_UNLOCK(ctlr, flags) spin_unlock_irqrestore( \ 132#define CPQ_TAPE_UNLOCK(h, flags) spin_unlock_irqrestore( \
133 &hba[ctlr]->scsi_ctlr->lock, flags); 133 &h->scsi_ctlr->lock, flags);
134 134
135static CommandList_struct * 135static CommandList_struct *
136scsi_cmd_alloc(ctlr_info_t *h) 136scsi_cmd_alloc(ctlr_info_t *h)
137{ 137{
138 /* assume only one process in here at a time, locking done by caller. */ 138 /* assume only one process in here at a time, locking done by caller. */
139 /* use CCISS_LOCK(ctlr) */ 139 /* use h->lock */
140 /* might be better to rewrite how we allocate scsi commands in a way that */ 140 /* might be better to rewrite how we allocate scsi commands in a way that */
141 /* needs no locking at all. */ 141 /* needs no locking at all. */
142 142
@@ -177,10 +177,10 @@ scsi_cmd_alloc(ctlr_info_t *h)
177} 177}
178 178
179static void 179static void
180scsi_cmd_free(ctlr_info_t *h, CommandList_struct *cmd) 180scsi_cmd_free(ctlr_info_t *h, CommandList_struct *c)
181{ 181{
182 /* assume only one process in here at a time, locking done by caller. */ 182 /* assume only one process in here at a time, locking done by caller. */
183 /* use CCISS_LOCK(ctlr) */ 183 /* use h->lock */
184 /* drop the free memory chunk on top of the stack. */ 184 /* drop the free memory chunk on top of the stack. */
185 185
186 struct cciss_scsi_adapter_data_t *sa; 186 struct cciss_scsi_adapter_data_t *sa;
@@ -193,19 +193,19 @@ scsi_cmd_free(ctlr_info_t *h, CommandList_struct *cmd)
193 printk("cciss: scsi_cmd_free called too many times.\n"); 193 printk("cciss: scsi_cmd_free called too many times.\n");
194 BUG(); 194 BUG();
195 } 195 }
196 stk->elem[stk->top] = (struct cciss_scsi_cmd_stack_elem_t *) cmd; 196 stk->elem[stk->top] = (struct cciss_scsi_cmd_stack_elem_t *) c;
197} 197}
198 198
199static int 199static int
200scsi_cmd_stack_setup(int ctlr, struct cciss_scsi_adapter_data_t *sa) 200scsi_cmd_stack_setup(ctlr_info_t *h, struct cciss_scsi_adapter_data_t *sa)
201{ 201{
202 int i; 202 int i;
203 struct cciss_scsi_cmd_stack_t *stk; 203 struct cciss_scsi_cmd_stack_t *stk;
204 size_t size; 204 size_t size;
205 205
206 sa->cmd_sg_list = cciss_allocate_sg_chain_blocks(hba[ctlr], 206 sa->cmd_sg_list = cciss_allocate_sg_chain_blocks(h,
207 hba[ctlr]->chainsize, CMD_STACK_SIZE); 207 h->chainsize, CMD_STACK_SIZE);
208 if (!sa->cmd_sg_list && hba[ctlr]->chainsize > 0) 208 if (!sa->cmd_sg_list && h->chainsize > 0)
209 return -ENOMEM; 209 return -ENOMEM;
210 210
211 stk = &sa->cmd_stack; 211 stk = &sa->cmd_stack;
@@ -215,7 +215,7 @@ scsi_cmd_stack_setup(int ctlr, struct cciss_scsi_adapter_data_t *sa)
215 BUILD_BUG_ON((sizeof(*stk->pool) % COMMANDLIST_ALIGNMENT) != 0); 215 BUILD_BUG_ON((sizeof(*stk->pool) % COMMANDLIST_ALIGNMENT) != 0);
216 /* pci_alloc_consistent guarantees 32-bit DMA address will be used */ 216 /* pci_alloc_consistent guarantees 32-bit DMA address will be used */
217 stk->pool = (struct cciss_scsi_cmd_stack_elem_t *) 217 stk->pool = (struct cciss_scsi_cmd_stack_elem_t *)
218 pci_alloc_consistent(hba[ctlr]->pdev, size, &stk->cmd_pool_handle); 218 pci_alloc_consistent(h->pdev, size, &stk->cmd_pool_handle);
219 219
220 if (stk->pool == NULL) { 220 if (stk->pool == NULL) {
221 cciss_free_sg_chain_blocks(sa->cmd_sg_list, CMD_STACK_SIZE); 221 cciss_free_sg_chain_blocks(sa->cmd_sg_list, CMD_STACK_SIZE);
@@ -234,13 +234,13 @@ scsi_cmd_stack_setup(int ctlr, struct cciss_scsi_adapter_data_t *sa)
234} 234}
235 235
236static void 236static void
237scsi_cmd_stack_free(int ctlr) 237scsi_cmd_stack_free(ctlr_info_t *h)
238{ 238{
239 struct cciss_scsi_adapter_data_t *sa; 239 struct cciss_scsi_adapter_data_t *sa;
240 struct cciss_scsi_cmd_stack_t *stk; 240 struct cciss_scsi_cmd_stack_t *stk;
241 size_t size; 241 size_t size;
242 242
243 sa = hba[ctlr]->scsi_ctlr; 243 sa = h->scsi_ctlr;
244 stk = &sa->cmd_stack; 244 stk = &sa->cmd_stack;
245 if (stk->top != CMD_STACK_SIZE-1) { 245 if (stk->top != CMD_STACK_SIZE-1) {
246 printk( "cciss: %d scsi commands are still outstanding.\n", 246 printk( "cciss: %d scsi commands are still outstanding.\n",
@@ -250,7 +250,7 @@ scsi_cmd_stack_free(int ctlr)
250 } 250 }
251 size = sizeof(struct cciss_scsi_cmd_stack_elem_t) * CMD_STACK_SIZE; 251 size = sizeof(struct cciss_scsi_cmd_stack_elem_t) * CMD_STACK_SIZE;
252 252
253 pci_free_consistent(hba[ctlr]->pdev, size, stk->pool, stk->cmd_pool_handle); 253 pci_free_consistent(h->pdev, size, stk->pool, stk->cmd_pool_handle);
254 stk->pool = NULL; 254 stk->pool = NULL;
255 cciss_free_sg_chain_blocks(sa->cmd_sg_list, CMD_STACK_SIZE); 255 cciss_free_sg_chain_blocks(sa->cmd_sg_list, CMD_STACK_SIZE);
256} 256}
@@ -342,20 +342,20 @@ print_cmd(CommandList_struct *cp)
342#endif 342#endif
343 343
344static int 344static int
345find_bus_target_lun(int ctlr, int *bus, int *target, int *lun) 345find_bus_target_lun(ctlr_info_t *h, int *bus, int *target, int *lun)
346{ 346{
347 /* finds an unused bus, target, lun for a new device */ 347 /* finds an unused bus, target, lun for a new device */
348 /* assumes hba[ctlr]->scsi_ctlr->lock is held */ 348 /* assumes h->scsi_ctlr->lock is held */
349 int i, found=0; 349 int i, found=0;
350 unsigned char target_taken[CCISS_MAX_SCSI_DEVS_PER_HBA]; 350 unsigned char target_taken[CCISS_MAX_SCSI_DEVS_PER_HBA];
351 351
352 memset(&target_taken[0], 0, CCISS_MAX_SCSI_DEVS_PER_HBA); 352 memset(&target_taken[0], 0, CCISS_MAX_SCSI_DEVS_PER_HBA);
353 353
354 target_taken[SELF_SCSI_ID] = 1; 354 target_taken[SELF_SCSI_ID] = 1;
355 for (i=0;i<ccissscsi[ctlr].ndevices;i++) 355 for (i = 0; i < ccissscsi[h->ctlr].ndevices; i++)
356 target_taken[ccissscsi[ctlr].dev[i].target] = 1; 356 target_taken[ccissscsi[h->ctlr].dev[i].target] = 1;
357 357
358 for (i=0;i<CCISS_MAX_SCSI_DEVS_PER_HBA;i++) { 358 for (i = 0; i < CCISS_MAX_SCSI_DEVS_PER_HBA; i++) {
359 if (!target_taken[i]) { 359 if (!target_taken[i]) {
360 *bus = 0; *target=i; *lun = 0; found=1; 360 *bus = 0; *target=i; *lun = 0; found=1;
361 break; 361 break;
@@ -369,19 +369,19 @@ struct scsi2map {
369}; 369};
370 370
371static int 371static int
372cciss_scsi_add_entry(int ctlr, int hostno, 372cciss_scsi_add_entry(ctlr_info_t *h, int hostno,
373 struct cciss_scsi_dev_t *device, 373 struct cciss_scsi_dev_t *device,
374 struct scsi2map *added, int *nadded) 374 struct scsi2map *added, int *nadded)
375{ 375{
376 /* assumes hba[ctlr]->scsi_ctlr->lock is held */ 376 /* assumes h->scsi_ctlr->lock is held */
377 int n = ccissscsi[ctlr].ndevices; 377 int n = ccissscsi[h->ctlr].ndevices;
378 struct cciss_scsi_dev_t *sd; 378 struct cciss_scsi_dev_t *sd;
379 int i, bus, target, lun; 379 int i, bus, target, lun;
380 unsigned char addr1[8], addr2[8]; 380 unsigned char addr1[8], addr2[8];
381 381
382 if (n >= CCISS_MAX_SCSI_DEVS_PER_HBA) { 382 if (n >= CCISS_MAX_SCSI_DEVS_PER_HBA) {
383 printk("cciss%d: Too many devices, " 383 printk("cciss%d: Too many devices, "
384 "some will be inaccessible.\n", ctlr); 384 "some will be inaccessible.\n", h->ctlr);
385 return -1; 385 return -1;
386 } 386 }
387 387
@@ -397,7 +397,7 @@ cciss_scsi_add_entry(int ctlr, int hostno,
397 memcpy(addr1, device->scsi3addr, 8); 397 memcpy(addr1, device->scsi3addr, 8);
398 addr1[4] = 0; 398 addr1[4] = 0;
399 for (i = 0; i < n; i++) { 399 for (i = 0; i < n; i++) {
400 sd = &ccissscsi[ctlr].dev[i]; 400 sd = &ccissscsi[h->ctlr].dev[i];
401 memcpy(addr2, sd->scsi3addr, 8); 401 memcpy(addr2, sd->scsi3addr, 8);
402 addr2[4] = 0; 402 addr2[4] = 0;
403 /* differ only in byte 4? */ 403 /* differ only in byte 4? */
@@ -410,9 +410,9 @@ cciss_scsi_add_entry(int ctlr, int hostno,
410 } 410 }
411 } 411 }
412 412
413 sd = &ccissscsi[ctlr].dev[n]; 413 sd = &ccissscsi[h->ctlr].dev[n];
414 if (lun == 0) { 414 if (lun == 0) {
415 if (find_bus_target_lun(ctlr, 415 if (find_bus_target_lun(h,
416 &sd->bus, &sd->target, &sd->lun) != 0) 416 &sd->bus, &sd->target, &sd->lun) != 0)
417 return -1; 417 return -1;
418 } else { 418 } else {
@@ -431,37 +431,37 @@ cciss_scsi_add_entry(int ctlr, int hostno,
431 memcpy(sd->device_id, device->device_id, sizeof(sd->device_id)); 431 memcpy(sd->device_id, device->device_id, sizeof(sd->device_id));
432 sd->devtype = device->devtype; 432 sd->devtype = device->devtype;
433 433
434 ccissscsi[ctlr].ndevices++; 434 ccissscsi[h->ctlr].ndevices++;
435 435
436 /* initially, (before registering with scsi layer) we don't 436 /* initially, (before registering with scsi layer) we don't
437 know our hostno and we don't want to print anything first 437 know our hostno and we don't want to print anything first
438 time anyway (the scsi layer's inquiries will show that info) */ 438 time anyway (the scsi layer's inquiries will show that info) */
439 if (hostno != -1) 439 if (hostno != -1)
440 printk("cciss%d: %s device c%db%dt%dl%d added.\n", 440 printk("cciss%d: %s device c%db%dt%dl%d added.\n",
441 ctlr, scsi_device_type(sd->devtype), hostno, 441 h->ctlr, scsi_device_type(sd->devtype), hostno,
442 sd->bus, sd->target, sd->lun); 442 sd->bus, sd->target, sd->lun);
443 return 0; 443 return 0;
444} 444}
445 445
446static void 446static void
447cciss_scsi_remove_entry(int ctlr, int hostno, int entry, 447cciss_scsi_remove_entry(ctlr_info_t *h, int hostno, int entry,
448 struct scsi2map *removed, int *nremoved) 448 struct scsi2map *removed, int *nremoved)
449{ 449{
450 /* assumes hba[ctlr]->scsi_ctlr->lock is held */ 450 /* assumes h->ctlr]->scsi_ctlr->lock is held */
451 int i; 451 int i;
452 struct cciss_scsi_dev_t sd; 452 struct cciss_scsi_dev_t sd;
453 453
454 if (entry < 0 || entry >= CCISS_MAX_SCSI_DEVS_PER_HBA) return; 454 if (entry < 0 || entry >= CCISS_MAX_SCSI_DEVS_PER_HBA) return;
455 sd = ccissscsi[ctlr].dev[entry]; 455 sd = ccissscsi[h->ctlr].dev[entry];
456 removed[*nremoved].bus = sd.bus; 456 removed[*nremoved].bus = sd.bus;
457 removed[*nremoved].target = sd.target; 457 removed[*nremoved].target = sd.target;
458 removed[*nremoved].lun = sd.lun; 458 removed[*nremoved].lun = sd.lun;
459 (*nremoved)++; 459 (*nremoved)++;
460 for (i=entry;i<ccissscsi[ctlr].ndevices-1;i++) 460 for (i = entry; i < ccissscsi[h->ctlr].ndevices-1; i++)
461 ccissscsi[ctlr].dev[i] = ccissscsi[ctlr].dev[i+1]; 461 ccissscsi[h->ctlr].dev[i] = ccissscsi[h->ctlr].dev[i+1];
462 ccissscsi[ctlr].ndevices--; 462 ccissscsi[h->ctlr].ndevices--;
463 printk("cciss%d: %s device c%db%dt%dl%d removed.\n", 463 printk("cciss%d: %s device c%db%dt%dl%d removed.\n",
464 ctlr, scsi_device_type(sd.devtype), hostno, 464 h->ctlr, scsi_device_type(sd.devtype), hostno,
465 sd.bus, sd.target, sd.lun); 465 sd.bus, sd.target, sd.lun);
466} 466}
467 467
@@ -476,24 +476,24 @@ cciss_scsi_remove_entry(int ctlr, int hostno, int entry,
476 (a)[1] == (b)[1] && \ 476 (a)[1] == (b)[1] && \
477 (a)[0] == (b)[0]) 477 (a)[0] == (b)[0])
478 478
479static void fixup_botched_add(int ctlr, char *scsi3addr) 479static void fixup_botched_add(ctlr_info_t *h, char *scsi3addr)
480{ 480{
481 /* called when scsi_add_device fails in order to re-adjust */ 481 /* called when scsi_add_device fails in order to re-adjust */
482 /* ccissscsi[] to match the mid layer's view. */ 482 /* ccissscsi[] to match the mid layer's view. */
483 unsigned long flags; 483 unsigned long flags;
484 int i, j; 484 int i, j;
485 CPQ_TAPE_LOCK(ctlr, flags); 485 CPQ_TAPE_LOCK(h, flags);
486 for (i = 0; i < ccissscsi[ctlr].ndevices; i++) { 486 for (i = 0; i < ccissscsi[h->ctlr].ndevices; i++) {
487 if (memcmp(scsi3addr, 487 if (memcmp(scsi3addr,
488 ccissscsi[ctlr].dev[i].scsi3addr, 8) == 0) { 488 ccissscsi[h->ctlr].dev[i].scsi3addr, 8) == 0) {
489 for (j = i; j < ccissscsi[ctlr].ndevices-1; j++) 489 for (j = i; j < ccissscsi[h->ctlr].ndevices-1; j++)
490 ccissscsi[ctlr].dev[j] = 490 ccissscsi[h->ctlr].dev[j] =
491 ccissscsi[ctlr].dev[j+1]; 491 ccissscsi[h->ctlr].dev[j+1];
492 ccissscsi[ctlr].ndevices--; 492 ccissscsi[h->ctlr].ndevices--;
493 break; 493 break;
494 } 494 }
495 } 495 }
496 CPQ_TAPE_UNLOCK(ctlr, flags); 496 CPQ_TAPE_UNLOCK(h, flags);
497} 497}
498 498
499static int device_is_the_same(struct cciss_scsi_dev_t *dev1, 499static int device_is_the_same(struct cciss_scsi_dev_t *dev1,
@@ -513,7 +513,7 @@ static int device_is_the_same(struct cciss_scsi_dev_t *dev1,
513} 513}
514 514
515static int 515static int
516adjust_cciss_scsi_table(int ctlr, int hostno, 516adjust_cciss_scsi_table(ctlr_info_t *h, int hostno,
517 struct cciss_scsi_dev_t sd[], int nsds) 517 struct cciss_scsi_dev_t sd[], int nsds)
518{ 518{
519 /* sd contains scsi3 addresses and devtypes, but 519 /* sd contains scsi3 addresses and devtypes, but
@@ -535,14 +535,14 @@ adjust_cciss_scsi_table(int ctlr, int hostno,
535 535
536 if (!added || !removed) { 536 if (!added || !removed) {
537 printk(KERN_WARNING "cciss%d: Out of memory in " 537 printk(KERN_WARNING "cciss%d: Out of memory in "
538 "adjust_cciss_scsi_table\n", ctlr); 538 "adjust_cciss_scsi_table\n", h->ctlr);
539 goto free_and_out; 539 goto free_and_out;
540 } 540 }
541 541
542 CPQ_TAPE_LOCK(ctlr, flags); 542 CPQ_TAPE_LOCK(h, flags);
543 543
544 if (hostno != -1) /* if it's not the first time... */ 544 if (hostno != -1) /* if it's not the first time... */
545 sh = hba[ctlr]->scsi_ctlr->scsi_host; 545 sh = h->scsi_ctlr->scsi_host;
546 546
547 /* find any devices in ccissscsi[] that are not in 547 /* find any devices in ccissscsi[] that are not in
548 sd[] and remove them from ccissscsi[] */ 548 sd[] and remove them from ccissscsi[] */
@@ -550,8 +550,8 @@ adjust_cciss_scsi_table(int ctlr, int hostno,
550 i = 0; 550 i = 0;
551 nremoved = 0; 551 nremoved = 0;
552 nadded = 0; 552 nadded = 0;
553 while(i<ccissscsi[ctlr].ndevices) { 553 while (i < ccissscsi[h->ctlr].ndevices) {
554 csd = &ccissscsi[ctlr].dev[i]; 554 csd = &ccissscsi[h->ctlr].dev[i];
555 found=0; 555 found=0;
556 for (j=0;j<nsds;j++) { 556 for (j=0;j<nsds;j++) {
557 if (SCSI3ADDR_EQ(sd[j].scsi3addr, 557 if (SCSI3ADDR_EQ(sd[j].scsi3addr,
@@ -567,19 +567,20 @@ adjust_cciss_scsi_table(int ctlr, int hostno,
567 if (found == 0) { /* device no longer present. */ 567 if (found == 0) { /* device no longer present. */
568 changes++; 568 changes++;
569 /* printk("cciss%d: %s device c%db%dt%dl%d removed.\n", 569 /* printk("cciss%d: %s device c%db%dt%dl%d removed.\n",
570 ctlr, scsi_device_type(csd->devtype), hostno, 570 h->ctlr, scsi_device_type(csd->devtype), hostno,
571 csd->bus, csd->target, csd->lun); */ 571 csd->bus, csd->target, csd->lun); */
572 cciss_scsi_remove_entry(ctlr, hostno, i, 572 cciss_scsi_remove_entry(h, hostno, i,
573 removed, &nremoved); 573 removed, &nremoved);
574 /* remove ^^^, hence i not incremented */ 574 /* remove ^^^, hence i not incremented */
575 } else if (found == 1) { /* device is different in some way */ 575 } else if (found == 1) { /* device is different in some way */
576 changes++; 576 changes++;
577 printk("cciss%d: device c%db%dt%dl%d has changed.\n", 577 printk("cciss%d: device c%db%dt%dl%d has changed.\n",
578 ctlr, hostno, csd->bus, csd->target, csd->lun); 578 h->ctlr, hostno,
579 cciss_scsi_remove_entry(ctlr, hostno, i, 579 csd->bus, csd->target, csd->lun);
580 cciss_scsi_remove_entry(h, hostno, i,
580 removed, &nremoved); 581 removed, &nremoved);
581 /* remove ^^^, hence i not incremented */ 582 /* remove ^^^, hence i not incremented */
582 if (cciss_scsi_add_entry(ctlr, hostno, &sd[j], 583 if (cciss_scsi_add_entry(h, hostno, &sd[j],
583 added, &nadded) != 0) 584 added, &nadded) != 0)
584 /* we just removed one, so add can't fail. */ 585 /* we just removed one, so add can't fail. */
585 BUG(); 586 BUG();
@@ -601,8 +602,8 @@ adjust_cciss_scsi_table(int ctlr, int hostno,
601 602
602 for (i=0;i<nsds;i++) { 603 for (i=0;i<nsds;i++) {
603 found=0; 604 found=0;
604 for (j=0;j<ccissscsi[ctlr].ndevices;j++) { 605 for (j = 0; j < ccissscsi[h->ctlr].ndevices; j++) {
605 csd = &ccissscsi[ctlr].dev[j]; 606 csd = &ccissscsi[h->ctlr].dev[j];
606 if (SCSI3ADDR_EQ(sd[i].scsi3addr, 607 if (SCSI3ADDR_EQ(sd[i].scsi3addr,
607 csd->scsi3addr)) { 608 csd->scsi3addr)) {
608 if (device_is_the_same(&sd[i], csd)) 609 if (device_is_the_same(&sd[i], csd))
@@ -614,18 +615,18 @@ adjust_cciss_scsi_table(int ctlr, int hostno,
614 } 615 }
615 if (!found) { 616 if (!found) {
616 changes++; 617 changes++;
617 if (cciss_scsi_add_entry(ctlr, hostno, &sd[i], 618 if (cciss_scsi_add_entry(h, hostno, &sd[i],
618 added, &nadded) != 0) 619 added, &nadded) != 0)
619 break; 620 break;
620 } else if (found == 1) { 621 } else if (found == 1) {
621 /* should never happen... */ 622 /* should never happen... */
622 changes++; 623 changes++;
623 printk(KERN_WARNING "cciss%d: device " 624 printk(KERN_WARNING "cciss%d: device "
624 "unexpectedly changed\n", ctlr); 625 "unexpectedly changed\n", h->ctlr);
625 /* but if it does happen, we just ignore that device */ 626 /* but if it does happen, we just ignore that device */
626 } 627 }
627 } 628 }
628 CPQ_TAPE_UNLOCK(ctlr, flags); 629 CPQ_TAPE_UNLOCK(h, flags);
629 630
630 /* Don't notify scsi mid layer of any changes the first time through */ 631 /* Don't notify scsi mid layer of any changes the first time through */
631 /* (or if there are no changes) scsi_scan_host will do it later the */ 632 /* (or if there are no changes) scsi_scan_host will do it later the */
@@ -647,7 +648,7 @@ adjust_cciss_scsi_table(int ctlr, int hostno,
647 /* timeout as if the device was gone. */ 648 /* timeout as if the device was gone. */
648 printk(KERN_WARNING "cciss%d: didn't find " 649 printk(KERN_WARNING "cciss%d: didn't find "
649 "c%db%dt%dl%d\n for removal.", 650 "c%db%dt%dl%d\n for removal.",
650 ctlr, hostno, removed[i].bus, 651 h->ctlr, hostno, removed[i].bus,
651 removed[i].target, removed[i].lun); 652 removed[i].target, removed[i].lun);
652 } 653 }
653 } 654 }
@@ -661,11 +662,11 @@ adjust_cciss_scsi_table(int ctlr, int hostno,
661 continue; 662 continue;
662 printk(KERN_WARNING "cciss%d: scsi_add_device " 663 printk(KERN_WARNING "cciss%d: scsi_add_device "
663 "c%db%dt%dl%d failed, device not added.\n", 664 "c%db%dt%dl%d failed, device not added.\n",
664 ctlr, hostno, 665 h->ctlr, hostno,
665 added[i].bus, added[i].target, added[i].lun); 666 added[i].bus, added[i].target, added[i].lun);
666 /* now we have to remove it from ccissscsi, */ 667 /* now we have to remove it from ccissscsi, */
667 /* since it didn't get added to scsi mid layer */ 668 /* since it didn't get added to scsi mid layer */
668 fixup_botched_add(ctlr, added[i].scsi3addr); 669 fixup_botched_add(h, added[i].scsi3addr);
669 } 670 }
670 671
671free_and_out: 672free_and_out:
@@ -675,33 +676,33 @@ free_and_out:
675} 676}
676 677
677static int 678static int
678lookup_scsi3addr(int ctlr, int bus, int target, int lun, char *scsi3addr) 679lookup_scsi3addr(ctlr_info_t *h, int bus, int target, int lun, char *scsi3addr)
679{ 680{
680 int i; 681 int i;
681 struct cciss_scsi_dev_t *sd; 682 struct cciss_scsi_dev_t *sd;
682 unsigned long flags; 683 unsigned long flags;
683 684
684 CPQ_TAPE_LOCK(ctlr, flags); 685 CPQ_TAPE_LOCK(h, flags);
685 for (i=0;i<ccissscsi[ctlr].ndevices;i++) { 686 for (i = 0; i < ccissscsi[h->ctlr].ndevices; i++) {
686 sd = &ccissscsi[ctlr].dev[i]; 687 sd = &ccissscsi[h->ctlr].dev[i];
687 if (sd->bus == bus && 688 if (sd->bus == bus &&
688 sd->target == target && 689 sd->target == target &&
689 sd->lun == lun) { 690 sd->lun == lun) {
690 memcpy(scsi3addr, &sd->scsi3addr[0], 8); 691 memcpy(scsi3addr, &sd->scsi3addr[0], 8);
691 CPQ_TAPE_UNLOCK(ctlr, flags); 692 CPQ_TAPE_UNLOCK(h, flags);
692 return 0; 693 return 0;
693 } 694 }
694 } 695 }
695 CPQ_TAPE_UNLOCK(ctlr, flags); 696 CPQ_TAPE_UNLOCK(h, flags);
696 return -1; 697 return -1;
697} 698}
698 699
699static void 700static void
700cciss_scsi_setup(int cntl_num) 701cciss_scsi_setup(ctlr_info_t *h)
701{ 702{
702 struct cciss_scsi_adapter_data_t * shba; 703 struct cciss_scsi_adapter_data_t * shba;
703 704
704 ccissscsi[cntl_num].ndevices = 0; 705 ccissscsi[h->ctlr].ndevices = 0;
705 shba = (struct cciss_scsi_adapter_data_t *) 706 shba = (struct cciss_scsi_adapter_data_t *)
706 kmalloc(sizeof(*shba), GFP_KERNEL); 707 kmalloc(sizeof(*shba), GFP_KERNEL);
707 if (shba == NULL) 708 if (shba == NULL)
@@ -709,35 +710,35 @@ cciss_scsi_setup(int cntl_num)
709 shba->scsi_host = NULL; 710 shba->scsi_host = NULL;
710 spin_lock_init(&shba->lock); 711 spin_lock_init(&shba->lock);
711 shba->registered = 0; 712 shba->registered = 0;
712 if (scsi_cmd_stack_setup(cntl_num, shba) != 0) { 713 if (scsi_cmd_stack_setup(h, shba) != 0) {
713 kfree(shba); 714 kfree(shba);
714 shba = NULL; 715 shba = NULL;
715 } 716 }
716 hba[cntl_num]->scsi_ctlr = shba; 717 h->scsi_ctlr = shba;
717 return; 718 return;
718} 719}
719 720
720static void 721static void complete_scsi_command(CommandList_struct *c, int timeout,
721complete_scsi_command( CommandList_struct *cp, int timeout, __u32 tag) 722 __u32 tag)
722{ 723{
723 struct scsi_cmnd *cmd; 724 struct scsi_cmnd *cmd;
724 ctlr_info_t *ctlr; 725 ctlr_info_t *h;
725 ErrorInfo_struct *ei; 726 ErrorInfo_struct *ei;
726 727
727 ei = cp->err_info; 728 ei = c->err_info;
728 729
729 /* First, see if it was a message rather than a command */ 730 /* First, see if it was a message rather than a command */
730 if (cp->Request.Type.Type == TYPE_MSG) { 731 if (c->Request.Type.Type == TYPE_MSG) {
731 cp->cmd_type = CMD_MSG_DONE; 732 c->cmd_type = CMD_MSG_DONE;
732 return; 733 return;
733 } 734 }
734 735
735 cmd = (struct scsi_cmnd *) cp->scsi_cmd; 736 cmd = (struct scsi_cmnd *) c->scsi_cmd;
736 ctlr = hba[cp->ctlr]; 737 h = hba[c->ctlr];
737 738
738 scsi_dma_unmap(cmd); 739 scsi_dma_unmap(cmd);
739 if (cp->Header.SGTotal > ctlr->max_cmd_sgentries) 740 if (c->Header.SGTotal > h->max_cmd_sgentries)
740 cciss_unmap_sg_chain_block(ctlr, cp); 741 cciss_unmap_sg_chain_block(h, c);
741 742
742 cmd->result = (DID_OK << 16); /* host byte */ 743 cmd->result = (DID_OK << 16); /* host byte */
743 cmd->result |= (COMMAND_COMPLETE << 8); /* msg byte */ 744 cmd->result |= (COMMAND_COMPLETE << 8); /* msg byte */
@@ -764,9 +765,8 @@ complete_scsi_command( CommandList_struct *cp, int timeout, __u32 tag)
764 { 765 {
765#if 0 766#if 0
766 printk(KERN_WARNING "cciss: cmd %p " 767 printk(KERN_WARNING "cciss: cmd %p "
767 "has SCSI Status = %x\n", 768 "has SCSI Status = %x\n",
768 cp, 769 c, ei->ScsiStatus);
769 ei->ScsiStatus);
770#endif 770#endif
771 cmd->result |= (ei->ScsiStatus << 1); 771 cmd->result |= (ei->ScsiStatus << 1);
772 } 772 }
@@ -786,13 +786,13 @@ complete_scsi_command( CommandList_struct *cp, int timeout, __u32 tag)
786 case CMD_DATA_UNDERRUN: /* let mid layer handle it. */ 786 case CMD_DATA_UNDERRUN: /* let mid layer handle it. */
787 break; 787 break;
788 case CMD_DATA_OVERRUN: 788 case CMD_DATA_OVERRUN:
789 printk(KERN_WARNING "cciss: cp %p has" 789 printk(KERN_WARNING "cciss: %p has"
790 " completed with data overrun " 790 " completed with data overrun "
791 "reported\n", cp); 791 "reported\n", c);
792 break; 792 break;
793 case CMD_INVALID: { 793 case CMD_INVALID: {
794 /* print_bytes(cp, sizeof(*cp), 1, 0); 794 /* print_bytes(c, sizeof(*c), 1, 0);
795 print_cmd(cp); */ 795 print_cmd(c); */
796 /* We get CMD_INVALID if you address a non-existent tape drive instead 796 /* We get CMD_INVALID if you address a non-existent tape drive instead
797 of a selection timeout (no response). You will see this if you yank 797 of a selection timeout (no response). You will see this if you yank
798 out a tape drive, then try to access it. This is kind of a shame 798 out a tape drive, then try to access it. This is kind of a shame
@@ -802,54 +802,52 @@ complete_scsi_command( CommandList_struct *cp, int timeout, __u32 tag)
802 } 802 }
803 break; 803 break;
804 case CMD_PROTOCOL_ERR: 804 case CMD_PROTOCOL_ERR:
805 printk(KERN_WARNING "cciss: cp %p has " 805 printk(KERN_WARNING "cciss: %p has "
806 "protocol error \n", cp); 806 "protocol error\n", c);
807 break; 807 break;
808 case CMD_HARDWARE_ERR: 808 case CMD_HARDWARE_ERR:
809 cmd->result = DID_ERROR << 16; 809 cmd->result = DID_ERROR << 16;
810 printk(KERN_WARNING "cciss: cp %p had " 810 printk(KERN_WARNING "cciss: %p had "
811 " hardware error\n", cp); 811 " hardware error\n", c);
812 break; 812 break;
813 case CMD_CONNECTION_LOST: 813 case CMD_CONNECTION_LOST:
814 cmd->result = DID_ERROR << 16; 814 cmd->result = DID_ERROR << 16;
815 printk(KERN_WARNING "cciss: cp %p had " 815 printk(KERN_WARNING "cciss: %p had "
816 "connection lost\n", cp); 816 "connection lost\n", c);
817 break; 817 break;
818 case CMD_ABORTED: 818 case CMD_ABORTED:
819 cmd->result = DID_ABORT << 16; 819 cmd->result = DID_ABORT << 16;
820 printk(KERN_WARNING "cciss: cp %p was " 820 printk(KERN_WARNING "cciss: %p was "
821 "aborted\n", cp); 821 "aborted\n", c);
822 break; 822 break;
823 case CMD_ABORT_FAILED: 823 case CMD_ABORT_FAILED:
824 cmd->result = DID_ERROR << 16; 824 cmd->result = DID_ERROR << 16;
825 printk(KERN_WARNING "cciss: cp %p reports " 825 printk(KERN_WARNING "cciss: %p reports "
826 "abort failed\n", cp); 826 "abort failed\n", c);
827 break; 827 break;
828 case CMD_UNSOLICITED_ABORT: 828 case CMD_UNSOLICITED_ABORT:
829 cmd->result = DID_ABORT << 16; 829 cmd->result = DID_ABORT << 16;
830 printk(KERN_WARNING "cciss: cp %p aborted " 830 printk(KERN_WARNING "cciss: %p aborted "
831 "do to an unsolicited abort\n", cp); 831 "do to an unsolicited abort\n", c);
832 break; 832 break;
833 case CMD_TIMEOUT: 833 case CMD_TIMEOUT:
834 cmd->result = DID_TIME_OUT << 16; 834 cmd->result = DID_TIME_OUT << 16;
835 printk(KERN_WARNING "cciss: cp %p timedout\n", 835 printk(KERN_WARNING "cciss: %p timedout\n",
836 cp); 836 c);
837 break; 837 break;
838 default: 838 default:
839 cmd->result = DID_ERROR << 16; 839 cmd->result = DID_ERROR << 16;
840 printk(KERN_WARNING "cciss: cp %p returned " 840 printk(KERN_WARNING "cciss: %p returned "
841 "unknown status %x\n", cp, 841 "unknown status %x\n", c,
842 ei->CommandStatus); 842 ei->CommandStatus);
843 } 843 }
844 } 844 }
845 // printk("c:%p:c%db%dt%dl%d ", cmd, ctlr->ctlr, cmd->channel,
846 // cmd->target, cmd->lun);
847 cmd->scsi_done(cmd); 845 cmd->scsi_done(cmd);
848 scsi_cmd_free(ctlr, cp); 846 scsi_cmd_free(h, c);
849} 847}
850 848
851static int 849static int
852cciss_scsi_detect(int ctlr) 850cciss_scsi_detect(ctlr_info_t *h)
853{ 851{
854 struct Scsi_Host *sh; 852 struct Scsi_Host *sh;
855 int error; 853 int error;
@@ -860,15 +858,15 @@ cciss_scsi_detect(int ctlr)
860 sh->io_port = 0; // good enough? FIXME, 858 sh->io_port = 0; // good enough? FIXME,
861 sh->n_io_port = 0; // I don't think we use these two... 859 sh->n_io_port = 0; // I don't think we use these two...
862 sh->this_id = SELF_SCSI_ID; 860 sh->this_id = SELF_SCSI_ID;
863 sh->sg_tablesize = hba[ctlr]->maxsgentries; 861 sh->sg_tablesize = h->maxsgentries;
864 sh->max_cmd_len = MAX_COMMAND_SIZE; 862 sh->max_cmd_len = MAX_COMMAND_SIZE;
865 863
866 ((struct cciss_scsi_adapter_data_t *) 864 ((struct cciss_scsi_adapter_data_t *)
867 hba[ctlr]->scsi_ctlr)->scsi_host = sh; 865 h->scsi_ctlr)->scsi_host = sh;
868 sh->hostdata[0] = (unsigned long) hba[ctlr]; 866 sh->hostdata[0] = (unsigned long) h;
869 sh->irq = hba[ctlr]->intr[SIMPLE_MODE_INT]; 867 sh->irq = h->intr[SIMPLE_MODE_INT];
870 sh->unique_id = sh->irq; 868 sh->unique_id = sh->irq;
871 error = scsi_add_host(sh, &hba[ctlr]->pdev->dev); 869 error = scsi_add_host(sh, &h->pdev->dev);
872 if (error) 870 if (error)
873 goto fail_host_put; 871 goto fail_host_put;
874 scsi_scan_host(sh); 872 scsi_scan_host(sh);
@@ -882,20 +880,20 @@ cciss_scsi_detect(int ctlr)
882 880
883static void 881static void
884cciss_unmap_one(struct pci_dev *pdev, 882cciss_unmap_one(struct pci_dev *pdev,
885 CommandList_struct *cp, 883 CommandList_struct *c,
886 size_t buflen, 884 size_t buflen,
887 int data_direction) 885 int data_direction)
888{ 886{
889 u64bit addr64; 887 u64bit addr64;
890 888
891 addr64.val32.lower = cp->SG[0].Addr.lower; 889 addr64.val32.lower = c->SG[0].Addr.lower;
892 addr64.val32.upper = cp->SG[0].Addr.upper; 890 addr64.val32.upper = c->SG[0].Addr.upper;
893 pci_unmap_single(pdev, (dma_addr_t) addr64.val, buflen, data_direction); 891 pci_unmap_single(pdev, (dma_addr_t) addr64.val, buflen, data_direction);
894} 892}
895 893
896static void 894static void
897cciss_map_one(struct pci_dev *pdev, 895cciss_map_one(struct pci_dev *pdev,
898 CommandList_struct *cp, 896 CommandList_struct *c,
899 unsigned char *buf, 897 unsigned char *buf,
900 size_t buflen, 898 size_t buflen,
901 int data_direction) 899 int data_direction)
@@ -903,18 +901,18 @@ cciss_map_one(struct pci_dev *pdev,
903 __u64 addr64; 901 __u64 addr64;
904 902
905 addr64 = (__u64) pci_map_single(pdev, buf, buflen, data_direction); 903 addr64 = (__u64) pci_map_single(pdev, buf, buflen, data_direction);
906 cp->SG[0].Addr.lower = 904 c->SG[0].Addr.lower =
907 (__u32) (addr64 & (__u64) 0x00000000FFFFFFFF); 905 (__u32) (addr64 & (__u64) 0x00000000FFFFFFFF);
908 cp->SG[0].Addr.upper = 906 c->SG[0].Addr.upper =
909 (__u32) ((addr64 >> 32) & (__u64) 0x00000000FFFFFFFF); 907 (__u32) ((addr64 >> 32) & (__u64) 0x00000000FFFFFFFF);
910 cp->SG[0].Len = buflen; 908 c->SG[0].Len = buflen;
911 cp->Header.SGList = (__u8) 1; /* no. SGs contig in this cmd */ 909 c->Header.SGList = (__u8) 1; /* no. SGs contig in this cmd */
912 cp->Header.SGTotal = (__u16) 1; /* total sgs in this cmd list */ 910 c->Header.SGTotal = (__u16) 1; /* total sgs in this cmd list */
913} 911}
914 912
915static int 913static int
916cciss_scsi_do_simple_cmd(ctlr_info_t *c, 914cciss_scsi_do_simple_cmd(ctlr_info_t *h,
917 CommandList_struct *cp, 915 CommandList_struct *c,
918 unsigned char *scsi3addr, 916 unsigned char *scsi3addr,
919 unsigned char *cdb, 917 unsigned char *cdb,
920 unsigned char cdblen, 918 unsigned char cdblen,
@@ -923,53 +921,52 @@ cciss_scsi_do_simple_cmd(ctlr_info_t *c,
923{ 921{
924 DECLARE_COMPLETION_ONSTACK(wait); 922 DECLARE_COMPLETION_ONSTACK(wait);
925 923
926 cp->cmd_type = CMD_IOCTL_PEND; // treat this like an ioctl 924 c->cmd_type = CMD_IOCTL_PEND; /* treat this like an ioctl */
927 cp->scsi_cmd = NULL; 925 c->scsi_cmd = NULL;
928 cp->Header.ReplyQueue = 0; // unused in simple mode 926 c->Header.ReplyQueue = 0; /* unused in simple mode */
929 memcpy(&cp->Header.LUN, scsi3addr, sizeof(cp->Header.LUN)); 927 memcpy(&c->Header.LUN, scsi3addr, sizeof(c->Header.LUN));
930 cp->Header.Tag.lower = cp->busaddr; // Use k. address of cmd as tag 928 c->Header.Tag.lower = c->busaddr; /* Use k. address of cmd as tag */
931 // Fill in the request block... 929 // Fill in the request block...
932 930
933 /* printk("Using scsi3addr 0x%02x%0x2%0x2%0x2%0x2%0x2%0x2%0x2\n", 931 /* printk("Using scsi3addr 0x%02x%0x2%0x2%0x2%0x2%0x2%0x2%0x2\n",
934 scsi3addr[0], scsi3addr[1], scsi3addr[2], scsi3addr[3], 932 scsi3addr[0], scsi3addr[1], scsi3addr[2], scsi3addr[3],
935 scsi3addr[4], scsi3addr[5], scsi3addr[6], scsi3addr[7]); */ 933 scsi3addr[4], scsi3addr[5], scsi3addr[6], scsi3addr[7]); */
936 934
937 memset(cp->Request.CDB, 0, sizeof(cp->Request.CDB)); 935 memset(c->Request.CDB, 0, sizeof(c->Request.CDB));
938 memcpy(cp->Request.CDB, cdb, cdblen); 936 memcpy(c->Request.CDB, cdb, cdblen);
939 cp->Request.Timeout = 0; 937 c->Request.Timeout = 0;
940 cp->Request.CDBLen = cdblen; 938 c->Request.CDBLen = cdblen;
941 cp->Request.Type.Type = TYPE_CMD; 939 c->Request.Type.Type = TYPE_CMD;
942 cp->Request.Type.Attribute = ATTR_SIMPLE; 940 c->Request.Type.Attribute = ATTR_SIMPLE;
943 cp->Request.Type.Direction = direction; 941 c->Request.Type.Direction = direction;
944 942
945 /* Fill in the SG list and do dma mapping */ 943 /* Fill in the SG list and do dma mapping */
946 cciss_map_one(c->pdev, cp, (unsigned char *) buf, 944 cciss_map_one(h->pdev, c, (unsigned char *) buf,
947 bufsize, DMA_FROM_DEVICE); 945 bufsize, DMA_FROM_DEVICE);
948 946
949 cp->waiting = &wait; 947 c->waiting = &wait;
950 enqueue_cmd_and_start_io(c, cp); 948 enqueue_cmd_and_start_io(h, c);
951 wait_for_completion(&wait); 949 wait_for_completion(&wait);
952 950
953 /* undo the dma mapping */ 951 /* undo the dma mapping */
954 cciss_unmap_one(c->pdev, cp, bufsize, DMA_FROM_DEVICE); 952 cciss_unmap_one(h->pdev, c, bufsize, DMA_FROM_DEVICE);
955 return(0); 953 return(0);
956} 954}
957 955
958static void 956static void
959cciss_scsi_interpret_error(CommandList_struct *cp) 957cciss_scsi_interpret_error(CommandList_struct *c)
960{ 958{
961 ErrorInfo_struct *ei; 959 ErrorInfo_struct *ei;
962 960
963 ei = cp->err_info; 961 ei = c->err_info;
964 switch(ei->CommandStatus) 962 switch(ei->CommandStatus)
965 { 963 {
966 case CMD_TARGET_STATUS: 964 case CMD_TARGET_STATUS:
967 printk(KERN_WARNING "cciss: cmd %p has " 965 printk(KERN_WARNING "cciss: cmd %p has "
968 "completed with errors\n", cp); 966 "completed with errors\n", c);
969 printk(KERN_WARNING "cciss: cmd %p " 967 printk(KERN_WARNING "cciss: cmd %p "
970 "has SCSI Status = %x\n", 968 "has SCSI Status = %x\n",
971 cp, 969 c, ei->ScsiStatus);
972 ei->ScsiStatus);
973 if (ei->ScsiStatus == 0) 970 if (ei->ScsiStatus == 0)
974 printk(KERN_WARNING 971 printk(KERN_WARNING
975 "cciss:SCSI status is abnormally zero. " 972 "cciss:SCSI status is abnormally zero. "
@@ -981,78 +978,75 @@ cciss_scsi_interpret_error(CommandList_struct *cp)
981 printk("UNDERRUN\n"); 978 printk("UNDERRUN\n");
982 break; 979 break;
983 case CMD_DATA_OVERRUN: 980 case CMD_DATA_OVERRUN:
984 printk(KERN_WARNING "cciss: cp %p has" 981 printk(KERN_WARNING "cciss: %p has"
985 " completed with data overrun " 982 " completed with data overrun "
986 "reported\n", cp); 983 "reported\n", c);
987 break; 984 break;
988 case CMD_INVALID: { 985 case CMD_INVALID: {
989 /* controller unfortunately reports SCSI passthru's */ 986 /* controller unfortunately reports SCSI passthru's */
990 /* to non-existent targets as invalid commands. */ 987 /* to non-existent targets as invalid commands. */
991 printk(KERN_WARNING "cciss: cp %p is " 988 printk(KERN_WARNING "cciss: %p is "
992 "reported invalid (probably means " 989 "reported invalid (probably means "
993 "target device no longer present)\n", 990 "target device no longer present)\n", c);
994 cp); 991 /* print_bytes((unsigned char *) c, sizeof(*c), 1, 0);
995 /* print_bytes((unsigned char *) cp, sizeof(*cp), 1, 0); 992 print_cmd(c); */
996 print_cmd(cp); */
997 } 993 }
998 break; 994 break;
999 case CMD_PROTOCOL_ERR: 995 case CMD_PROTOCOL_ERR:
1000 printk(KERN_WARNING "cciss: cp %p has " 996 printk(KERN_WARNING "cciss: %p has "
1001 "protocol error \n", cp); 997 "protocol error\n", c);
1002 break; 998 break;
1003 case CMD_HARDWARE_ERR: 999 case CMD_HARDWARE_ERR:
1004 /* cmd->result = DID_ERROR << 16; */ 1000 /* cmd->result = DID_ERROR << 16; */
1005 printk(KERN_WARNING "cciss: cp %p had " 1001 printk(KERN_WARNING "cciss: %p had "
1006 " hardware error\n", cp); 1002 " hardware error\n", c);
1007 break; 1003 break;
1008 case CMD_CONNECTION_LOST: 1004 case CMD_CONNECTION_LOST:
1009 printk(KERN_WARNING "cciss: cp %p had " 1005 printk(KERN_WARNING "cciss: %p had "
1010 "connection lost\n", cp); 1006 "connection lost\n", c);
1011 break; 1007 break;
1012 case CMD_ABORTED: 1008 case CMD_ABORTED:
1013 printk(KERN_WARNING "cciss: cp %p was " 1009 printk(KERN_WARNING "cciss: %p was "
1014 "aborted\n", cp); 1010 "aborted\n", c);
1015 break; 1011 break;
1016 case CMD_ABORT_FAILED: 1012 case CMD_ABORT_FAILED:
1017 printk(KERN_WARNING "cciss: cp %p reports " 1013 printk(KERN_WARNING "cciss: %p reports "
1018 "abort failed\n", cp); 1014 "abort failed\n", c);
1019 break; 1015 break;
1020 case CMD_UNSOLICITED_ABORT: 1016 case CMD_UNSOLICITED_ABORT:
1021 printk(KERN_WARNING "cciss: cp %p aborted " 1017 printk(KERN_WARNING "cciss: %p aborted "
1022 "do to an unsolicited abort\n", cp); 1018 "do to an unsolicited abort\n", c);
1023 break; 1019 break;
1024 case CMD_TIMEOUT: 1020 case CMD_TIMEOUT:
1025 printk(KERN_WARNING "cciss: cp %p timedout\n", 1021 printk(KERN_WARNING "cciss: %p timedout\n", c);
1026 cp);
1027 break; 1022 break;
1028 default: 1023 default:
1029 printk(KERN_WARNING "cciss: cp %p returned " 1024 printk(KERN_WARNING "cciss: %p returned "
1030 "unknown status %x\n", cp, 1025 "unknown status %x\n", c, ei->CommandStatus);
1031 ei->CommandStatus);
1032 } 1026 }
1033} 1027}
1034 1028
1035static int 1029static int
1036cciss_scsi_do_inquiry(ctlr_info_t *c, unsigned char *scsi3addr, 1030cciss_scsi_do_inquiry(ctlr_info_t *h, unsigned char *scsi3addr,
1037 unsigned char page, unsigned char *buf, 1031 unsigned char page, unsigned char *buf,
1038 unsigned char bufsize) 1032 unsigned char bufsize)
1039{ 1033{
1040 int rc; 1034 int rc;
1041 CommandList_struct *cp; 1035 CommandList_struct *c;
1042 char cdb[6]; 1036 char cdb[6];
1043 ErrorInfo_struct *ei; 1037 ErrorInfo_struct *ei;
1044 unsigned long flags; 1038 unsigned long flags;
1045 1039
1046 spin_lock_irqsave(CCISS_LOCK(c->ctlr), flags); 1040 spin_lock_irqsave(&h->lock, flags);
1047 cp = scsi_cmd_alloc(c); 1041 c = scsi_cmd_alloc(h);
1048 spin_unlock_irqrestore(CCISS_LOCK(c->ctlr), flags); 1042 spin_unlock_irqrestore(&h->lock, flags);
1049 1043
1050 if (cp == NULL) { /* trouble... */ 1044 if (c == NULL) { /* trouble... */
1051 printk("cmd_alloc returned NULL!\n"); 1045 printk("cmd_alloc returned NULL!\n");
1052 return -1; 1046 return -1;
1053 } 1047 }
1054 1048
1055 ei = cp->err_info; 1049 ei = c->err_info;
1056 1050
1057 cdb[0] = CISS_INQUIRY; 1051 cdb[0] = CISS_INQUIRY;
1058 cdb[1] = (page != 0); 1052 cdb[1] = (page != 0);
@@ -1060,24 +1054,24 @@ cciss_scsi_do_inquiry(ctlr_info_t *c, unsigned char *scsi3addr,
1060 cdb[3] = 0; 1054 cdb[3] = 0;
1061 cdb[4] = bufsize; 1055 cdb[4] = bufsize;
1062 cdb[5] = 0; 1056 cdb[5] = 0;
1063 rc = cciss_scsi_do_simple_cmd(c, cp, scsi3addr, cdb, 1057 rc = cciss_scsi_do_simple_cmd(h, c, scsi3addr, cdb,
1064 6, buf, bufsize, XFER_READ); 1058 6, buf, bufsize, XFER_READ);
1065 1059
1066 if (rc != 0) return rc; /* something went wrong */ 1060 if (rc != 0) return rc; /* something went wrong */
1067 1061
1068 if (ei->CommandStatus != 0 && 1062 if (ei->CommandStatus != 0 &&
1069 ei->CommandStatus != CMD_DATA_UNDERRUN) { 1063 ei->CommandStatus != CMD_DATA_UNDERRUN) {
1070 cciss_scsi_interpret_error(cp); 1064 cciss_scsi_interpret_error(c);
1071 rc = -1; 1065 rc = -1;
1072 } 1066 }
1073 spin_lock_irqsave(CCISS_LOCK(c->ctlr), flags); 1067 spin_lock_irqsave(&h->lock, flags);
1074 scsi_cmd_free(c, cp); 1068 scsi_cmd_free(h, c);
1075 spin_unlock_irqrestore(CCISS_LOCK(c->ctlr), flags); 1069 spin_unlock_irqrestore(&h->lock, flags);
1076 return rc; 1070 return rc;
1077} 1071}
1078 1072
1079/* Get the device id from inquiry page 0x83 */ 1073/* Get the device id from inquiry page 0x83 */
1080static int cciss_scsi_get_device_id(ctlr_info_t *c, unsigned char *scsi3addr, 1074static int cciss_scsi_get_device_id(ctlr_info_t *h, unsigned char *scsi3addr,
1081 unsigned char *device_id, int buflen) 1075 unsigned char *device_id, int buflen)
1082{ 1076{
1083 int rc; 1077 int rc;
@@ -1088,7 +1082,7 @@ static int cciss_scsi_get_device_id(ctlr_info_t *c, unsigned char *scsi3addr,
1088 buf = kzalloc(64, GFP_KERNEL); 1082 buf = kzalloc(64, GFP_KERNEL);
1089 if (!buf) 1083 if (!buf)
1090 return -1; 1084 return -1;
1091 rc = cciss_scsi_do_inquiry(c, scsi3addr, 0x83, buf, 64); 1085 rc = cciss_scsi_do_inquiry(h, scsi3addr, 0x83, buf, 64);
1092 if (rc == 0) 1086 if (rc == 0)
1093 memcpy(device_id, &buf[8], buflen); 1087 memcpy(device_id, &buf[8], buflen);
1094 kfree(buf); 1088 kfree(buf);
@@ -1096,20 +1090,20 @@ static int cciss_scsi_get_device_id(ctlr_info_t *c, unsigned char *scsi3addr,
1096} 1090}
1097 1091
1098static int 1092static int
1099cciss_scsi_do_report_phys_luns(ctlr_info_t *c, 1093cciss_scsi_do_report_phys_luns(ctlr_info_t *h,
1100 ReportLunData_struct *buf, int bufsize) 1094 ReportLunData_struct *buf, int bufsize)
1101{ 1095{
1102 int rc; 1096 int rc;
1103 CommandList_struct *cp; 1097 CommandList_struct *c;
1104 unsigned char cdb[12]; 1098 unsigned char cdb[12];
1105 unsigned char scsi3addr[8]; 1099 unsigned char scsi3addr[8];
1106 ErrorInfo_struct *ei; 1100 ErrorInfo_struct *ei;
1107 unsigned long flags; 1101 unsigned long flags;
1108 1102
1109 spin_lock_irqsave(CCISS_LOCK(c->ctlr), flags); 1103 spin_lock_irqsave(&h->lock, flags);
1110 cp = scsi_cmd_alloc(c); 1104 c = scsi_cmd_alloc(h);
1111 spin_unlock_irqrestore(CCISS_LOCK(c->ctlr), flags); 1105 spin_unlock_irqrestore(&h->lock, flags);
1112 if (cp == NULL) { /* trouble... */ 1106 if (c == NULL) { /* trouble... */
1113 printk("cmd_alloc returned NULL!\n"); 1107 printk("cmd_alloc returned NULL!\n");
1114 return -1; 1108 return -1;
1115 } 1109 }
@@ -1128,27 +1122,27 @@ cciss_scsi_do_report_phys_luns(ctlr_info_t *c,
1128 cdb[10] = 0; 1122 cdb[10] = 0;
1129 cdb[11] = 0; 1123 cdb[11] = 0;
1130 1124
1131 rc = cciss_scsi_do_simple_cmd(c, cp, scsi3addr, 1125 rc = cciss_scsi_do_simple_cmd(h, c, scsi3addr,
1132 cdb, 12, 1126 cdb, 12,
1133 (unsigned char *) buf, 1127 (unsigned char *) buf,
1134 bufsize, XFER_READ); 1128 bufsize, XFER_READ);
1135 1129
1136 if (rc != 0) return rc; /* something went wrong */ 1130 if (rc != 0) return rc; /* something went wrong */
1137 1131
1138 ei = cp->err_info; 1132 ei = c->err_info;
1139 if (ei->CommandStatus != 0 && 1133 if (ei->CommandStatus != 0 &&
1140 ei->CommandStatus != CMD_DATA_UNDERRUN) { 1134 ei->CommandStatus != CMD_DATA_UNDERRUN) {
1141 cciss_scsi_interpret_error(cp); 1135 cciss_scsi_interpret_error(c);
1142 rc = -1; 1136 rc = -1;
1143 } 1137 }
1144 spin_lock_irqsave(CCISS_LOCK(c->ctlr), flags); 1138 spin_lock_irqsave(&h->lock, flags);
1145 scsi_cmd_free(c, cp); 1139 scsi_cmd_free(h, c);
1146 spin_unlock_irqrestore(CCISS_LOCK(c->ctlr), flags); 1140 spin_unlock_irqrestore(&h->lock, flags);
1147 return rc; 1141 return rc;
1148} 1142}
1149 1143
1150static void 1144static void
1151cciss_update_non_disk_devices(int cntl_num, int hostno) 1145cciss_update_non_disk_devices(ctlr_info_t *h, int hostno)
1152{ 1146{
1153 /* the idea here is we could get notified from /proc 1147 /* the idea here is we could get notified from /proc
1154 that some devices have changed, so we do a report 1148 that some devices have changed, so we do a report
@@ -1181,7 +1175,6 @@ cciss_update_non_disk_devices(int cntl_num, int hostno)
1181 ReportLunData_struct *ld_buff; 1175 ReportLunData_struct *ld_buff;
1182 unsigned char *inq_buff; 1176 unsigned char *inq_buff;
1183 unsigned char scsi3addr[8]; 1177 unsigned char scsi3addr[8];
1184 ctlr_info_t *c;
1185 __u32 num_luns=0; 1178 __u32 num_luns=0;
1186 unsigned char *ch; 1179 unsigned char *ch;
1187 struct cciss_scsi_dev_t *currentsd, *this_device; 1180 struct cciss_scsi_dev_t *currentsd, *this_device;
@@ -1189,7 +1182,6 @@ cciss_update_non_disk_devices(int cntl_num, int hostno)
1189 int reportlunsize = sizeof(*ld_buff) + CISS_MAX_PHYS_LUN * 8; 1182 int reportlunsize = sizeof(*ld_buff) + CISS_MAX_PHYS_LUN * 8;
1190 int i; 1183 int i;
1191 1184
1192 c = (ctlr_info_t *) hba[cntl_num];
1193 ld_buff = kzalloc(reportlunsize, GFP_KERNEL); 1185 ld_buff = kzalloc(reportlunsize, GFP_KERNEL);
1194 inq_buff = kmalloc(OBDR_TAPE_INQ_SIZE, GFP_KERNEL); 1186 inq_buff = kmalloc(OBDR_TAPE_INQ_SIZE, GFP_KERNEL);
1195 currentsd = kzalloc(sizeof(*currentsd) * 1187 currentsd = kzalloc(sizeof(*currentsd) *
@@ -1199,7 +1191,7 @@ cciss_update_non_disk_devices(int cntl_num, int hostno)
1199 goto out; 1191 goto out;
1200 } 1192 }
1201 this_device = &currentsd[CCISS_MAX_SCSI_DEVS_PER_HBA]; 1193 this_device = &currentsd[CCISS_MAX_SCSI_DEVS_PER_HBA];
1202 if (cciss_scsi_do_report_phys_luns(c, ld_buff, reportlunsize) == 0) { 1194 if (cciss_scsi_do_report_phys_luns(h, ld_buff, reportlunsize) == 0) {
1203 ch = &ld_buff->LUNListLength[0]; 1195 ch = &ld_buff->LUNListLength[0];
1204 num_luns = ((ch[0]<<24) | (ch[1]<<16) | (ch[2]<<8) | ch[3]) / 8; 1196 num_luns = ((ch[0]<<24) | (ch[1]<<16) | (ch[2]<<8) | ch[3]) / 8;
1205 if (num_luns > CISS_MAX_PHYS_LUN) { 1197 if (num_luns > CISS_MAX_PHYS_LUN) {
@@ -1223,7 +1215,7 @@ cciss_update_non_disk_devices(int cntl_num, int hostno)
1223 memset(inq_buff, 0, OBDR_TAPE_INQ_SIZE); 1215 memset(inq_buff, 0, OBDR_TAPE_INQ_SIZE);
1224 memcpy(&scsi3addr[0], &ld_buff->LUN[i][0], 8); 1216 memcpy(&scsi3addr[0], &ld_buff->LUN[i][0], 8);
1225 1217
1226 if (cciss_scsi_do_inquiry(hba[cntl_num], scsi3addr, 0, inq_buff, 1218 if (cciss_scsi_do_inquiry(h, scsi3addr, 0, inq_buff,
1227 (unsigned char) OBDR_TAPE_INQ_SIZE) != 0) 1219 (unsigned char) OBDR_TAPE_INQ_SIZE) != 0)
1228 /* Inquiry failed (msg printed already) */ 1220 /* Inquiry failed (msg printed already) */
1229 continue; /* so we will skip this device. */ 1221 continue; /* so we will skip this device. */
@@ -1241,7 +1233,7 @@ cciss_update_non_disk_devices(int cntl_num, int hostno)
1241 sizeof(this_device->revision)); 1233 sizeof(this_device->revision));
1242 memset(this_device->device_id, 0, 1234 memset(this_device->device_id, 0,
1243 sizeof(this_device->device_id)); 1235 sizeof(this_device->device_id));
1244 cciss_scsi_get_device_id(hba[cntl_num], scsi3addr, 1236 cciss_scsi_get_device_id(h, scsi3addr,
1245 this_device->device_id, sizeof(this_device->device_id)); 1237 this_device->device_id, sizeof(this_device->device_id));
1246 1238
1247 switch (this_device->devtype) 1239 switch (this_device->devtype)
@@ -1268,7 +1260,7 @@ cciss_update_non_disk_devices(int cntl_num, int hostno)
1268 case 0x08: /* medium changer */ 1260 case 0x08: /* medium changer */
1269 if (ncurrent >= CCISS_MAX_SCSI_DEVS_PER_HBA) { 1261 if (ncurrent >= CCISS_MAX_SCSI_DEVS_PER_HBA) {
1270 printk(KERN_INFO "cciss%d: %s ignored, " 1262 printk(KERN_INFO "cciss%d: %s ignored, "
1271 "too many devices.\n", cntl_num, 1263 "too many devices.\n", h->ctlr,
1272 scsi_device_type(this_device->devtype)); 1264 scsi_device_type(this_device->devtype));
1273 break; 1265 break;
1274 } 1266 }
@@ -1280,7 +1272,7 @@ cciss_update_non_disk_devices(int cntl_num, int hostno)
1280 } 1272 }
1281 } 1273 }
1282 1274
1283 adjust_cciss_scsi_table(cntl_num, hostno, currentsd, ncurrent); 1275 adjust_cciss_scsi_table(h, hostno, currentsd, ncurrent);
1284out: 1276out:
1285 kfree(inq_buff); 1277 kfree(inq_buff);
1286 kfree(ld_buff); 1278 kfree(ld_buff);
@@ -1299,12 +1291,12 @@ is_keyword(char *ptr, int len, char *verb) // Thanks to ncr53c8xx.c
1299} 1291}
1300 1292
1301static int 1293static int
1302cciss_scsi_user_command(int ctlr, int hostno, char *buffer, int length) 1294cciss_scsi_user_command(ctlr_info_t *h, int hostno, char *buffer, int length)
1303{ 1295{
1304 int arg_len; 1296 int arg_len;
1305 1297
1306 if ((arg_len = is_keyword(buffer, length, "rescan")) != 0) 1298 if ((arg_len = is_keyword(buffer, length, "rescan")) != 0)
1307 cciss_update_non_disk_devices(ctlr, hostno); 1299 cciss_update_non_disk_devices(h, hostno);
1308 else 1300 else
1309 return -EINVAL; 1301 return -EINVAL;
1310 return length; 1302 return length;
@@ -1321,20 +1313,16 @@ cciss_scsi_proc_info(struct Scsi_Host *sh,
1321{ 1313{
1322 1314
1323 int buflen, datalen; 1315 int buflen, datalen;
1324 ctlr_info_t *ci; 1316 ctlr_info_t *h;
1325 int i; 1317 int i;
1326 int cntl_num;
1327 1318
1328 1319 h = (ctlr_info_t *) sh->hostdata[0];
1329 ci = (ctlr_info_t *) sh->hostdata[0]; 1320 if (h == NULL) /* This really shouldn't ever happen. */
1330 if (ci == NULL) /* This really shouldn't ever happen. */
1331 return -EINVAL; 1321 return -EINVAL;
1332 1322
1333 cntl_num = ci->ctlr; /* Get our index into the hba[] array */
1334
1335 if (func == 0) { /* User is reading from /proc/scsi/ciss*?/?* */ 1323 if (func == 0) { /* User is reading from /proc/scsi/ciss*?/?* */
1336 buflen = sprintf(buffer, "cciss%d: SCSI host: %d\n", 1324 buflen = sprintf(buffer, "cciss%d: SCSI host: %d\n",
1337 cntl_num, sh->host_no); 1325 h->ctlr, sh->host_no);
1338 1326
1339 /* this information is needed by apps to know which cciss 1327 /* this information is needed by apps to know which cciss
1340 device corresponds to which scsi host number without 1328 device corresponds to which scsi host number without
@@ -1344,8 +1332,9 @@ cciss_scsi_proc_info(struct Scsi_Host *sh,
1344 this info is for an app to be able to use to know how to 1332 this info is for an app to be able to use to know how to
1345 get them back in sync. */ 1333 get them back in sync. */
1346 1334
1347 for (i=0;i<ccissscsi[cntl_num].ndevices;i++) { 1335 for (i = 0; i < ccissscsi[h->ctlr].ndevices; i++) {
1348 struct cciss_scsi_dev_t *sd = &ccissscsi[cntl_num].dev[i]; 1336 struct cciss_scsi_dev_t *sd =
1337 &ccissscsi[h->ctlr].dev[i];
1349 buflen += sprintf(&buffer[buflen], "c%db%dt%dl%d %02d " 1338 buflen += sprintf(&buffer[buflen], "c%db%dt%dl%d %02d "
1350 "0x%02x%02x%02x%02x%02x%02x%02x%02x\n", 1339 "0x%02x%02x%02x%02x%02x%02x%02x%02x\n",
1351 sh->host_no, sd->bus, sd->target, sd->lun, 1340 sh->host_no, sd->bus, sd->target, sd->lun,
@@ -1363,15 +1352,15 @@ cciss_scsi_proc_info(struct Scsi_Host *sh,
1363 *start = buffer + offset; 1352 *start = buffer + offset;
1364 return(datalen); 1353 return(datalen);
1365 } else /* User is writing to /proc/scsi/cciss*?/?* ... */ 1354 } else /* User is writing to /proc/scsi/cciss*?/?* ... */
1366 return cciss_scsi_user_command(cntl_num, sh->host_no, 1355 return cciss_scsi_user_command(h, sh->host_no,
1367 buffer, length); 1356 buffer, length);
1368} 1357}
1369 1358
1370/* cciss_scatter_gather takes a struct scsi_cmnd, (cmd), and does the pci 1359/* cciss_scatter_gather takes a struct scsi_cmnd, (cmd), and does the pci
1371 dma mapping and fills in the scatter gather entries of the 1360 dma mapping and fills in the scatter gather entries of the
1372 cciss command, cp. */ 1361 cciss command, c. */
1373 1362
1374static void cciss_scatter_gather(ctlr_info_t *h, CommandList_struct *cp, 1363static void cciss_scatter_gather(ctlr_info_t *h, CommandList_struct *c,
1375 struct scsi_cmnd *cmd) 1364 struct scsi_cmnd *cmd)
1376{ 1365{
1377 unsigned int len; 1366 unsigned int len;
@@ -1385,7 +1374,7 @@ static void cciss_scatter_gather(ctlr_info_t *h, CommandList_struct *cp,
1385 1374
1386 chained = 0; 1375 chained = 0;
1387 sg_index = 0; 1376 sg_index = 0;
1388 curr_sg = cp->SG; 1377 curr_sg = c->SG;
1389 request_nsgs = scsi_dma_map(cmd); 1378 request_nsgs = scsi_dma_map(cmd);
1390 if (request_nsgs) { 1379 if (request_nsgs) {
1391 scsi_for_each_sg(cmd, sg, request_nsgs, i) { 1380 scsi_for_each_sg(cmd, sg, request_nsgs, i) {
@@ -1393,7 +1382,7 @@ static void cciss_scatter_gather(ctlr_info_t *h, CommandList_struct *cp,
1393 !chained && request_nsgs - i > 1) { 1382 !chained && request_nsgs - i > 1) {
1394 chained = 1; 1383 chained = 1;
1395 sg_index = 0; 1384 sg_index = 0;
1396 curr_sg = sa->cmd_sg_list[cp->cmdindex]; 1385 curr_sg = sa->cmd_sg_list[c->cmdindex];
1397 } 1386 }
1398 addr64 = (__u64) sg_dma_address(sg); 1387 addr64 = (__u64) sg_dma_address(sg);
1399 len = sg_dma_len(sg); 1388 len = sg_dma_len(sg);
@@ -1406,19 +1395,19 @@ static void cciss_scatter_gather(ctlr_info_t *h, CommandList_struct *cp,
1406 ++sg_index; 1395 ++sg_index;
1407 } 1396 }
1408 if (chained) 1397 if (chained)
1409 cciss_map_sg_chain_block(h, cp, 1398 cciss_map_sg_chain_block(h, c,
1410 sa->cmd_sg_list[cp->cmdindex], 1399 sa->cmd_sg_list[c->cmdindex],
1411 (request_nsgs - (h->max_cmd_sgentries - 1)) * 1400 (request_nsgs - (h->max_cmd_sgentries - 1)) *
1412 sizeof(SGDescriptor_struct)); 1401 sizeof(SGDescriptor_struct));
1413 } 1402 }
1414 /* track how many SG entries we are using */ 1403 /* track how many SG entries we are using */
1415 if (request_nsgs > h->maxSG) 1404 if (request_nsgs > h->maxSG)
1416 h->maxSG = request_nsgs; 1405 h->maxSG = request_nsgs;
1417 cp->Header.SGTotal = (__u8) request_nsgs + chained; 1406 c->Header.SGTotal = (__u8) request_nsgs + chained;
1418 if (request_nsgs > h->max_cmd_sgentries) 1407 if (request_nsgs > h->max_cmd_sgentries)
1419 cp->Header.SGList = h->max_cmd_sgentries; 1408 c->Header.SGList = h->max_cmd_sgentries;
1420 else 1409 else
1421 cp->Header.SGList = cp->Header.SGTotal; 1410 c->Header.SGList = c->Header.SGTotal;
1422 return; 1411 return;
1423} 1412}
1424 1413
@@ -1426,18 +1415,17 @@ static void cciss_scatter_gather(ctlr_info_t *h, CommandList_struct *cp,
1426static int 1415static int
1427cciss_scsi_queue_command (struct scsi_cmnd *cmd, void (* done)(struct scsi_cmnd *)) 1416cciss_scsi_queue_command (struct scsi_cmnd *cmd, void (* done)(struct scsi_cmnd *))
1428{ 1417{
1429 ctlr_info_t *c; 1418 ctlr_info_t *h;
1430 int ctlr, rc; 1419 int rc;
1431 unsigned char scsi3addr[8]; 1420 unsigned char scsi3addr[8];
1432 CommandList_struct *cp; 1421 CommandList_struct *c;
1433 unsigned long flags; 1422 unsigned long flags;
1434 1423
1435 // Get the ptr to our adapter structure (hba[i]) out of cmd->host. 1424 // Get the ptr to our adapter structure (hba[i]) out of cmd->host.
1436 // We violate cmd->host privacy here. (Is there another way?) 1425 // We violate cmd->host privacy here. (Is there another way?)
1437 c = (ctlr_info_t *) cmd->device->host->hostdata[0]; 1426 h = (ctlr_info_t *) cmd->device->host->hostdata[0];
1438 ctlr = c->ctlr;
1439 1427
1440 rc = lookup_scsi3addr(ctlr, cmd->device->channel, cmd->device->id, 1428 rc = lookup_scsi3addr(h, cmd->device->channel, cmd->device->id,
1441 cmd->device->lun, scsi3addr); 1429 cmd->device->lun, scsi3addr);
1442 if (rc != 0) { 1430 if (rc != 0) {
1443 /* the scsi nexus does not match any that we presented... */ 1431 /* the scsi nexus does not match any that we presented... */
@@ -1449,18 +1437,13 @@ cciss_scsi_queue_command (struct scsi_cmnd *cmd, void (* done)(struct scsi_cmnd
1449 return 0; 1437 return 0;
1450 } 1438 }
1451 1439
1452 /* printk("cciss_queue_command, p=%p, cmd=0x%02x, c%db%dt%dl%d\n",
1453 cmd, cmd->cmnd[0], ctlr, cmd->channel, cmd->target, cmd->lun);*/
1454 // printk("q:%p:c%db%dt%dl%d ", cmd, ctlr, cmd->channel,
1455 // cmd->target, cmd->lun);
1456
1457 /* Ok, we have a reasonable scsi nexus, so send the cmd down, and 1440 /* Ok, we have a reasonable scsi nexus, so send the cmd down, and
1458 see what the device thinks of it. */ 1441 see what the device thinks of it. */
1459 1442
1460 spin_lock_irqsave(CCISS_LOCK(ctlr), flags); 1443 spin_lock_irqsave(&h->lock, flags);
1461 cp = scsi_cmd_alloc(c); 1444 c = scsi_cmd_alloc(h);
1462 spin_unlock_irqrestore(CCISS_LOCK(ctlr), flags); 1445 spin_unlock_irqrestore(&h->lock, flags);
1463 if (cp == NULL) { /* trouble... */ 1446 if (c == NULL) { /* trouble... */
1464 printk("scsi_cmd_alloc returned NULL!\n"); 1447 printk("scsi_cmd_alloc returned NULL!\n");
1465 /* FIXME: next 3 lines are -> BAD! <- */ 1448 /* FIXME: next 3 lines are -> BAD! <- */
1466 cmd->result = DID_NO_CONNECT << 16; 1449 cmd->result = DID_NO_CONNECT << 16;
@@ -1472,35 +1455,41 @@ cciss_scsi_queue_command (struct scsi_cmnd *cmd, void (* done)(struct scsi_cmnd
1472 1455
1473 cmd->scsi_done = done; // save this for use by completion code 1456 cmd->scsi_done = done; // save this for use by completion code
1474 1457
1475 // save cp in case we have to abort it 1458 /* save c in case we have to abort it */
1476 cmd->host_scribble = (unsigned char *) cp; 1459 cmd->host_scribble = (unsigned char *) c;
1477 1460
1478 cp->cmd_type = CMD_SCSI; 1461 c->cmd_type = CMD_SCSI;
1479 cp->scsi_cmd = cmd; 1462 c->scsi_cmd = cmd;
1480 cp->Header.ReplyQueue = 0; // unused in simple mode 1463 c->Header.ReplyQueue = 0; /* unused in simple mode */
1481 memcpy(&cp->Header.LUN.LunAddrBytes[0], &scsi3addr[0], 8); 1464 memcpy(&c->Header.LUN.LunAddrBytes[0], &scsi3addr[0], 8);
1482 cp->Header.Tag.lower = cp->busaddr; // Use k. address of cmd as tag 1465 c->Header.Tag.lower = c->busaddr; /* Use k. address of cmd as tag */
1483 1466
1484 // Fill in the request block... 1467 // Fill in the request block...
1485 1468
1486 cp->Request.Timeout = 0; 1469 c->Request.Timeout = 0;
1487 memset(cp->Request.CDB, 0, sizeof(cp->Request.CDB)); 1470 memset(c->Request.CDB, 0, sizeof(c->Request.CDB));
1488 BUG_ON(cmd->cmd_len > sizeof(cp->Request.CDB)); 1471 BUG_ON(cmd->cmd_len > sizeof(c->Request.CDB));
1489 cp->Request.CDBLen = cmd->cmd_len; 1472 c->Request.CDBLen = cmd->cmd_len;
1490 memcpy(cp->Request.CDB, cmd->cmnd, cmd->cmd_len); 1473 memcpy(c->Request.CDB, cmd->cmnd, cmd->cmd_len);
1491 cp->Request.Type.Type = TYPE_CMD; 1474 c->Request.Type.Type = TYPE_CMD;
1492 cp->Request.Type.Attribute = ATTR_SIMPLE; 1475 c->Request.Type.Attribute = ATTR_SIMPLE;
1493 switch(cmd->sc_data_direction) 1476 switch(cmd->sc_data_direction)
1494 { 1477 {
1495 case DMA_TO_DEVICE: cp->Request.Type.Direction = XFER_WRITE; break; 1478 case DMA_TO_DEVICE:
1496 case DMA_FROM_DEVICE: cp->Request.Type.Direction = XFER_READ; break; 1479 c->Request.Type.Direction = XFER_WRITE;
1497 case DMA_NONE: cp->Request.Type.Direction = XFER_NONE; break; 1480 break;
1481 case DMA_FROM_DEVICE:
1482 c->Request.Type.Direction = XFER_READ;
1483 break;
1484 case DMA_NONE:
1485 c->Request.Type.Direction = XFER_NONE;
1486 break;
1498 case DMA_BIDIRECTIONAL: 1487 case DMA_BIDIRECTIONAL:
1499 // This can happen if a buggy application does a scsi passthru 1488 // This can happen if a buggy application does a scsi passthru
1500 // and sets both inlen and outlen to non-zero. ( see 1489 // and sets both inlen and outlen to non-zero. ( see
1501 // ../scsi/scsi_ioctl.c:scsi_ioctl_send_command() ) 1490 // ../scsi/scsi_ioctl.c:scsi_ioctl_send_command() )
1502 1491
1503 cp->Request.Type.Direction = XFER_RSVD; 1492 c->Request.Type.Direction = XFER_RSVD;
1504 // This is technically wrong, and cciss controllers should 1493 // This is technically wrong, and cciss controllers should
1505 // reject it with CMD_INVALID, which is the most correct 1494 // reject it with CMD_INVALID, which is the most correct
1506 // response, but non-fibre backends appear to let it 1495 // response, but non-fibre backends appear to let it
@@ -1516,14 +1505,13 @@ cciss_scsi_queue_command (struct scsi_cmnd *cmd, void (* done)(struct scsi_cmnd
1516 BUG(); 1505 BUG();
1517 break; 1506 break;
1518 } 1507 }
1519 cciss_scatter_gather(c, cp, cmd); 1508 cciss_scatter_gather(h, c, cmd);
1520 enqueue_cmd_and_start_io(c, cp); 1509 enqueue_cmd_and_start_io(h, c);
1521 /* the cmd'll come back via intr handler in complete_scsi_command() */ 1510 /* the cmd'll come back via intr handler in complete_scsi_command() */
1522 return 0; 1511 return 0;
1523} 1512}
1524 1513
1525static void 1514static void cciss_unregister_scsi(ctlr_info_t *h)
1526cciss_unregister_scsi(int ctlr)
1527{ 1515{
1528 struct cciss_scsi_adapter_data_t *sa; 1516 struct cciss_scsi_adapter_data_t *sa;
1529 struct cciss_scsi_cmd_stack_t *stk; 1517 struct cciss_scsi_cmd_stack_t *stk;
@@ -1531,59 +1519,59 @@ cciss_unregister_scsi(int ctlr)
1531 1519
1532 /* we are being forcibly unloaded, and may not refuse. */ 1520 /* we are being forcibly unloaded, and may not refuse. */
1533 1521
1534 spin_lock_irqsave(CCISS_LOCK(ctlr), flags); 1522 spin_lock_irqsave(&h->lock, flags);
1535 sa = hba[ctlr]->scsi_ctlr; 1523 sa = h->scsi_ctlr;
1536 stk = &sa->cmd_stack; 1524 stk = &sa->cmd_stack;
1537 1525
1538 /* if we weren't ever actually registered, don't unregister */ 1526 /* if we weren't ever actually registered, don't unregister */
1539 if (sa->registered) { 1527 if (sa->registered) {
1540 spin_unlock_irqrestore(CCISS_LOCK(ctlr), flags); 1528 spin_unlock_irqrestore(&h->lock, flags);
1541 scsi_remove_host(sa->scsi_host); 1529 scsi_remove_host(sa->scsi_host);
1542 scsi_host_put(sa->scsi_host); 1530 scsi_host_put(sa->scsi_host);
1543 spin_lock_irqsave(CCISS_LOCK(ctlr), flags); 1531 spin_lock_irqsave(&h->lock, flags);
1544 } 1532 }
1545 1533
1546 /* set scsi_host to NULL so our detect routine will 1534 /* set scsi_host to NULL so our detect routine will
1547 find us on register */ 1535 find us on register */
1548 sa->scsi_host = NULL; 1536 sa->scsi_host = NULL;
1549 spin_unlock_irqrestore(CCISS_LOCK(ctlr), flags); 1537 spin_unlock_irqrestore(&h->lock, flags);
1550 scsi_cmd_stack_free(ctlr); 1538 scsi_cmd_stack_free(h);
1551 kfree(sa); 1539 kfree(sa);
1552} 1540}
1553 1541
1554static int 1542static int cciss_engage_scsi(ctlr_info_t *h)
1555cciss_engage_scsi(int ctlr)
1556{ 1543{
1557 struct cciss_scsi_adapter_data_t *sa; 1544 struct cciss_scsi_adapter_data_t *sa;
1558 struct cciss_scsi_cmd_stack_t *stk; 1545 struct cciss_scsi_cmd_stack_t *stk;
1559 unsigned long flags; 1546 unsigned long flags;
1560 1547
1561 spin_lock_irqsave(CCISS_LOCK(ctlr), flags); 1548 spin_lock_irqsave(&h->lock, flags);
1562 sa = hba[ctlr]->scsi_ctlr; 1549 sa = h->scsi_ctlr;
1563 stk = &sa->cmd_stack; 1550 stk = &sa->cmd_stack;
1564 1551
1565 if (sa->registered) { 1552 if (sa->registered) {
1566 printk("cciss%d: SCSI subsystem already engaged.\n", ctlr); 1553 printk(KERN_INFO "cciss%d: SCSI subsystem already engaged.\n",
1567 spin_unlock_irqrestore(CCISS_LOCK(ctlr), flags); 1554 h->ctlr);
1555 spin_unlock_irqrestore(&h->lock, flags);
1568 return -ENXIO; 1556 return -ENXIO;
1569 } 1557 }
1570 sa->registered = 1; 1558 sa->registered = 1;
1571 spin_unlock_irqrestore(CCISS_LOCK(ctlr), flags); 1559 spin_unlock_irqrestore(&h->lock, flags);
1572 cciss_update_non_disk_devices(ctlr, -1); 1560 cciss_update_non_disk_devices(h, -1);
1573 cciss_scsi_detect(ctlr); 1561 cciss_scsi_detect(h);
1574 return 0; 1562 return 0;
1575} 1563}
1576 1564
1577static void 1565static void
1578cciss_seq_tape_report(struct seq_file *seq, int ctlr) 1566cciss_seq_tape_report(struct seq_file *seq, ctlr_info_t *h)
1579{ 1567{
1580 unsigned long flags; 1568 unsigned long flags;
1581 1569
1582 CPQ_TAPE_LOCK(ctlr, flags); 1570 CPQ_TAPE_LOCK(h, flags);
1583 seq_printf(seq, 1571 seq_printf(seq,
1584 "Sequential access devices: %d\n\n", 1572 "Sequential access devices: %d\n\n",
1585 ccissscsi[ctlr].ndevices); 1573 ccissscsi[h->ctlr].ndevices);
1586 CPQ_TAPE_UNLOCK(ctlr, flags); 1574 CPQ_TAPE_UNLOCK(h, flags);
1587} 1575}
1588 1576
1589static int wait_for_device_to_become_ready(ctlr_info_t *h, 1577static int wait_for_device_to_become_ready(ctlr_info_t *h,
@@ -1615,7 +1603,7 @@ static int wait_for_device_to_become_ready(ctlr_info_t *h,
1615 waittime = waittime * 2; 1603 waittime = waittime * 2;
1616 1604
1617 /* Send the Test Unit Ready */ 1605 /* Send the Test Unit Ready */
1618 rc = fill_cmd(c, TEST_UNIT_READY, h->ctlr, NULL, 0, 0, 1606 rc = fill_cmd(h, c, TEST_UNIT_READY, NULL, 0, 0,
1619 lunaddr, TYPE_CMD); 1607 lunaddr, TYPE_CMD);
1620 if (rc == 0) 1608 if (rc == 0)
1621 rc = sendcmd_withirq_core(h, c, 0); 1609 rc = sendcmd_withirq_core(h, c, 0);
@@ -1672,26 +1660,25 @@ static int cciss_eh_device_reset_handler(struct scsi_cmnd *scsicmd)
1672 int rc; 1660 int rc;
1673 CommandList_struct *cmd_in_trouble; 1661 CommandList_struct *cmd_in_trouble;
1674 unsigned char lunaddr[8]; 1662 unsigned char lunaddr[8];
1675 ctlr_info_t *c; 1663 ctlr_info_t *h;
1676 int ctlr;
1677 1664
1678 /* find the controller to which the command to be aborted was sent */ 1665 /* find the controller to which the command to be aborted was sent */
1679 c = (ctlr_info_t *) scsicmd->device->host->hostdata[0]; 1666 h = (ctlr_info_t *) scsicmd->device->host->hostdata[0];
1680 if (c == NULL) /* paranoia */ 1667 if (h == NULL) /* paranoia */
1681 return FAILED; 1668 return FAILED;
1682 ctlr = c->ctlr; 1669 printk(KERN_WARNING
1683 printk(KERN_WARNING "cciss%d: resetting tape drive or medium changer.\n", ctlr); 1670 "cciss%d: resetting tape drive or medium changer.\n", h->ctlr);
1684 /* find the command that's giving us trouble */ 1671 /* find the command that's giving us trouble */
1685 cmd_in_trouble = (CommandList_struct *) scsicmd->host_scribble; 1672 cmd_in_trouble = (CommandList_struct *) scsicmd->host_scribble;
1686 if (cmd_in_trouble == NULL) /* paranoia */ 1673 if (cmd_in_trouble == NULL) /* paranoia */
1687 return FAILED; 1674 return FAILED;
1688 memcpy(lunaddr, &cmd_in_trouble->Header.LUN.LunAddrBytes[0], 8); 1675 memcpy(lunaddr, &cmd_in_trouble->Header.LUN.LunAddrBytes[0], 8);
1689 /* send a reset to the SCSI LUN which the command was sent to */ 1676 /* send a reset to the SCSI LUN which the command was sent to */
1690 rc = sendcmd_withirq(CCISS_RESET_MSG, ctlr, NULL, 0, 0, lunaddr, 1677 rc = sendcmd_withirq(h, CCISS_RESET_MSG, NULL, 0, 0, lunaddr,
1691 TYPE_MSG); 1678 TYPE_MSG);
1692 if (rc == 0 && wait_for_device_to_become_ready(c, lunaddr) == 0) 1679 if (rc == 0 && wait_for_device_to_become_ready(h, lunaddr) == 0)
1693 return SUCCESS; 1680 return SUCCESS;
1694 printk(KERN_WARNING "cciss%d: resetting device failed.\n", ctlr); 1681 printk(KERN_WARNING "cciss%d: resetting device failed.\n", h->ctlr);
1695 return FAILED; 1682 return FAILED;
1696} 1683}
1697 1684
@@ -1700,22 +1687,20 @@ static int cciss_eh_abort_handler(struct scsi_cmnd *scsicmd)
1700 int rc; 1687 int rc;
1701 CommandList_struct *cmd_to_abort; 1688 CommandList_struct *cmd_to_abort;
1702 unsigned char lunaddr[8]; 1689 unsigned char lunaddr[8];
1703 ctlr_info_t *c; 1690 ctlr_info_t *h;
1704 int ctlr;
1705 1691
1706 /* find the controller to which the command to be aborted was sent */ 1692 /* find the controller to which the command to be aborted was sent */
1707 c = (ctlr_info_t *) scsicmd->device->host->hostdata[0]; 1693 h = (ctlr_info_t *) scsicmd->device->host->hostdata[0];
1708 if (c == NULL) /* paranoia */ 1694 if (h == NULL) /* paranoia */
1709 return FAILED; 1695 return FAILED;
1710 ctlr = c->ctlr; 1696 printk(KERN_WARNING "cciss%d: aborting tardy SCSI cmd\n", h->ctlr);
1711 printk(KERN_WARNING "cciss%d: aborting tardy SCSI cmd\n", ctlr);
1712 1697
1713 /* find the command to be aborted */ 1698 /* find the command to be aborted */
1714 cmd_to_abort = (CommandList_struct *) scsicmd->host_scribble; 1699 cmd_to_abort = (CommandList_struct *) scsicmd->host_scribble;
1715 if (cmd_to_abort == NULL) /* paranoia */ 1700 if (cmd_to_abort == NULL) /* paranoia */
1716 return FAILED; 1701 return FAILED;
1717 memcpy(lunaddr, &cmd_to_abort->Header.LUN.LunAddrBytes[0], 8); 1702 memcpy(lunaddr, &cmd_to_abort->Header.LUN.LunAddrBytes[0], 8);
1718 rc = sendcmd_withirq(CCISS_ABORT_MSG, ctlr, &cmd_to_abort->Header.Tag, 1703 rc = sendcmd_withirq(h, CCISS_ABORT_MSG, &cmd_to_abort->Header.Tag,
1719 0, 0, lunaddr, TYPE_MSG); 1704 0, 0, lunaddr, TYPE_MSG);
1720 if (rc == 0) 1705 if (rc == 0)
1721 return SUCCESS; 1706 return SUCCESS;