block: needs to set the residual length of a bidi request
[linux-2.6-block.git] / drivers / block / cciss_scsi.c
CommitLineData
1da177e4 1/*
bd4f36d6
MM
2 * Disk Array driver for HP Smart Array controllers, SCSI Tape module.
3 * (C) Copyright 2001, 2007 Hewlett-Packard Development Company, L.P.
1da177e4
LT
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
bd4f36d6 7 * the Free Software Foundation; version 2 of the License.
1da177e4
LT
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
bd4f36d6
MM
11 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * General Public License for more details.
1da177e4
LT
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
bd4f36d6
MM
16 * Foundation, Inc., 59 Temple Place, Suite 300, Boston, MA
17 * 02111-1307, USA.
1da177e4
LT
18 *
19 * Questions/Comments/Bugfixes to iss_storagedev@hp.com
20 *
21 * Author: Stephen M. Cameron
22 */
23#ifdef CONFIG_CISS_SCSI_TAPE
24
25/* Here we have code to present the driver as a scsi driver
26 as it is simultaneously presented as a block driver. The
27 reason for doing this is to allow access to SCSI tape drives
28 through the array controller. Note in particular, neither
29 physical nor logical disks are presented through the scsi layer. */
30
4e57b681
TS
31#include <linux/timer.h>
32#include <linux/completion.h>
33#include <linux/slab.h>
34#include <linux/string.h>
35
36#include <asm/atomic.h>
37
1da177e4
LT
38#include <scsi/scsi_cmnd.h>
39#include <scsi/scsi_device.h>
40#include <scsi/scsi_host.h>
1da177e4
LT
41
42#include "cciss_scsi.h"
43
3da8b713 44#define CCISS_ABORT_MSG 0x00
45#define CCISS_RESET_MSG 0x01
46
1da177e4
LT
47/* some prototypes... */
48static int sendcmd(
49 __u8 cmd,
50 int ctlr,
51 void *buff,
52 size_t size,
53 unsigned int use_unit_num, /* 0: address the controller,
54 1: address logical volume log_unit,
55 2: address is in scsi3addr */
56 unsigned int log_unit,
57 __u8 page_code,
58 unsigned char *scsi3addr,
59 int cmd_type);
60
88f627ae
SC
61static int fill_cmd(CommandList_struct *c, __u8 cmd, int ctlr, void *buff,
62 size_t size,
63 unsigned int use_unit_num, /* 0: address the controller,
64 1: address logical volume log_unit,
65 2: periph device address is scsi3addr */
66 unsigned int log_unit, __u8 page_code, unsigned char *scsi3addr,
67 int cmd_type);
68
69static int sendcmd_core(ctlr_info_t *h, CommandList_struct *c);
70
71static CommandList_struct *cmd_alloc(ctlr_info_t *h, int get_from_pool);
72static void cmd_free(ctlr_info_t *h, CommandList_struct *c, int got_from_pool);
1da177e4
LT
73
74static int cciss_scsi_proc_info(
75 struct Scsi_Host *sh,
76 char *buffer, /* data buffer */
77 char **start, /* where data in buffer starts */
78 off_t offset, /* offset from start of imaginary file */
79 int length, /* length of data in buffer */
80 int func); /* 0 == read, 1 == write */
81
82static int cciss_scsi_queue_command (struct scsi_cmnd *cmd,
83 void (* done)(struct scsi_cmnd *));
3da8b713 84static int cciss_eh_device_reset_handler(struct scsi_cmnd *);
85static int cciss_eh_abort_handler(struct scsi_cmnd *);
1da177e4
LT
86
87static struct cciss_scsi_hba_t ccissscsi[MAX_CTLR] = {
88 { .name = "cciss0", .ndevices = 0 },
89 { .name = "cciss1", .ndevices = 0 },
90 { .name = "cciss2", .ndevices = 0 },
91 { .name = "cciss3", .ndevices = 0 },
92 { .name = "cciss4", .ndevices = 0 },
93 { .name = "cciss5", .ndevices = 0 },
94 { .name = "cciss6", .ndevices = 0 },
95 { .name = "cciss7", .ndevices = 0 },
96};
97
98static struct scsi_host_template cciss_driver_template = {
99 .module = THIS_MODULE,
100 .name = "cciss",
101 .proc_name = "cciss",
102 .proc_info = cciss_scsi_proc_info,
103 .queuecommand = cciss_scsi_queue_command,
104 .can_queue = SCSI_CCISS_CAN_QUEUE,
105 .this_id = 7,
106 .sg_tablesize = MAXSGENTRIES,
107 .cmd_per_lun = 1,
108 .use_clustering = DISABLE_CLUSTERING,
3da8b713 109 /* Can't have eh_bus_reset_handler or eh_host_reset_handler for cciss */
110 .eh_device_reset_handler= cciss_eh_device_reset_handler,
111 .eh_abort_handler = cciss_eh_abort_handler,
1da177e4
LT
112};
113
114#pragma pack(1)
115struct cciss_scsi_cmd_stack_elem_t {
116 CommandList_struct cmd;
117 ErrorInfo_struct Err;
118 __u32 busaddr;
33079b21 119 __u32 pad;
1da177e4
LT
120};
121
122#pragma pack()
123
124#define CMD_STACK_SIZE (SCSI_CCISS_CAN_QUEUE * \
125 CCISS_MAX_SCSI_DEVS_PER_HBA + 2)
126 // plus two for init time usage
127
128#pragma pack(1)
129struct cciss_scsi_cmd_stack_t {
130 struct cciss_scsi_cmd_stack_elem_t *pool;
131 struct cciss_scsi_cmd_stack_elem_t *elem[CMD_STACK_SIZE];
132 dma_addr_t cmd_pool_handle;
133 int top;
134};
135#pragma pack()
136
137struct cciss_scsi_adapter_data_t {
138 struct Scsi_Host *scsi_host;
139 struct cciss_scsi_cmd_stack_t cmd_stack;
140 int registered;
141 spinlock_t lock; // to protect ccissscsi[ctlr];
142};
143
144#define CPQ_TAPE_LOCK(ctlr, flags) spin_lock_irqsave( \
145 &(((struct cciss_scsi_adapter_data_t *) \
146 hba[ctlr]->scsi_ctlr)->lock), flags);
147#define CPQ_TAPE_UNLOCK(ctlr, flags) spin_unlock_irqrestore( \
148 &(((struct cciss_scsi_adapter_data_t *) \
149 hba[ctlr]->scsi_ctlr)->lock), flags);
150
151static CommandList_struct *
152scsi_cmd_alloc(ctlr_info_t *h)
153{
154 /* assume only one process in here at a time, locking done by caller. */
155 /* use CCISS_LOCK(ctlr) */
156 /* might be better to rewrite how we allocate scsi commands in a way that */
157 /* needs no locking at all. */
158
159 /* take the top memory chunk off the stack and return it, if any. */
160 struct cciss_scsi_cmd_stack_elem_t *c;
161 struct cciss_scsi_adapter_data_t *sa;
162 struct cciss_scsi_cmd_stack_t *stk;
163 u64bit temp64;
164
165 sa = (struct cciss_scsi_adapter_data_t *) h->scsi_ctlr;
166 stk = &sa->cmd_stack;
167
168 if (stk->top < 0)
169 return NULL;
170 c = stk->elem[stk->top];
171 /* memset(c, 0, sizeof(*c)); */
172 memset(&c->cmd, 0, sizeof(c->cmd));
173 memset(&c->Err, 0, sizeof(c->Err));
174 /* set physical addr of cmd and addr of scsi parameters */
175 c->cmd.busaddr = c->busaddr;
176 /* (__u32) (stk->cmd_pool_handle +
177 (sizeof(struct cciss_scsi_cmd_stack_elem_t)*stk->top)); */
178
179 temp64.val = (__u64) (c->busaddr + sizeof(CommandList_struct));
180 /* (__u64) (stk->cmd_pool_handle +
181 (sizeof(struct cciss_scsi_cmd_stack_elem_t)*stk->top) +
182 sizeof(CommandList_struct)); */
183 stk->top--;
184 c->cmd.ErrDesc.Addr.lower = temp64.val32.lower;
185 c->cmd.ErrDesc.Addr.upper = temp64.val32.upper;
186 c->cmd.ErrDesc.Len = sizeof(ErrorInfo_struct);
187
188 c->cmd.ctlr = h->ctlr;
189 c->cmd.err_info = &c->Err;
190
191 return (CommandList_struct *) c;
192}
193
194static void
195scsi_cmd_free(ctlr_info_t *h, CommandList_struct *cmd)
196{
197 /* assume only one process in here at a time, locking done by caller. */
198 /* use CCISS_LOCK(ctlr) */
199 /* drop the free memory chunk on top of the stack. */
200
201 struct cciss_scsi_adapter_data_t *sa;
202 struct cciss_scsi_cmd_stack_t *stk;
203
204 sa = (struct cciss_scsi_adapter_data_t *) h->scsi_ctlr;
205 stk = &sa->cmd_stack;
206 if (stk->top >= CMD_STACK_SIZE) {
207 printk("cciss: scsi_cmd_free called too many times.\n");
208 BUG();
209 }
210 stk->top++;
211 stk->elem[stk->top] = (struct cciss_scsi_cmd_stack_elem_t *) cmd;
212}
213
214static int
215scsi_cmd_stack_setup(int ctlr, struct cciss_scsi_adapter_data_t *sa)
216{
217 int i;
218 struct cciss_scsi_cmd_stack_t *stk;
219 size_t size;
220
221 stk = &sa->cmd_stack;
222 size = sizeof(struct cciss_scsi_cmd_stack_elem_t) * CMD_STACK_SIZE;
223
224 // pci_alloc_consistent guarantees 32-bit DMA address will
225 // be used
226
227 stk->pool = (struct cciss_scsi_cmd_stack_elem_t *)
228 pci_alloc_consistent(hba[ctlr]->pdev, size, &stk->cmd_pool_handle);
229
230 if (stk->pool == NULL) {
231 printk("stk->pool is null\n");
232 return -1;
233 }
234
235 for (i=0; i<CMD_STACK_SIZE; i++) {
236 stk->elem[i] = &stk->pool[i];
237 stk->elem[i]->busaddr = (__u32) (stk->cmd_pool_handle +
238 (sizeof(struct cciss_scsi_cmd_stack_elem_t) * i));
239 }
240 stk->top = CMD_STACK_SIZE-1;
241 return 0;
242}
243
244static void
245scsi_cmd_stack_free(int ctlr)
246{
247 struct cciss_scsi_adapter_data_t *sa;
248 struct cciss_scsi_cmd_stack_t *stk;
249 size_t size;
250
251 sa = (struct cciss_scsi_adapter_data_t *) hba[ctlr]->scsi_ctlr;
252 stk = &sa->cmd_stack;
253 if (stk->top != CMD_STACK_SIZE-1) {
254 printk( "cciss: %d scsi commands are still outstanding.\n",
255 CMD_STACK_SIZE - stk->top);
256 // BUG();
257 printk("WE HAVE A BUG HERE!!! stk=0x%p\n", stk);
258 }
259 size = sizeof(struct cciss_scsi_cmd_stack_elem_t) * CMD_STACK_SIZE;
260
261 pci_free_consistent(hba[ctlr]->pdev, size, stk->pool, stk->cmd_pool_handle);
262 stk->pool = NULL;
263}
264
400bb236 265#if 0
1da177e4
LT
266static int xmargin=8;
267static int amargin=60;
268
269static void
270print_bytes (unsigned char *c, int len, int hex, int ascii)
271{
272
273 int i;
274 unsigned char *x;
275
276 if (hex)
277 {
278 x = c;
279 for (i=0;i<len;i++)
280 {
281 if ((i % xmargin) == 0 && i>0) printk("\n");
282 if ((i % xmargin) == 0) printk("0x%04x:", i);
283 printk(" %02x", *x);
284 x++;
285 }
286 printk("\n");
287 }
288 if (ascii)
289 {
290 x = c;
291 for (i=0;i<len;i++)
292 {
293 if ((i % amargin) == 0 && i>0) printk("\n");
294 if ((i % amargin) == 0) printk("0x%04x:", i);
295 if (*x > 26 && *x < 128) printk("%c", *x);
296 else printk(".");
297 x++;
298 }
299 printk("\n");
300 }
301}
302
303static void
304print_cmd(CommandList_struct *cp)
305{
306 printk("queue:%d\n", cp->Header.ReplyQueue);
307 printk("sglist:%d\n", cp->Header.SGList);
308 printk("sgtot:%d\n", cp->Header.SGTotal);
309 printk("Tag:0x%08x/0x%08x\n", cp->Header.Tag.upper,
310 cp->Header.Tag.lower);
311 printk("LUN:0x%02x%02x%02x%02x%02x%02x%02x%02x\n",
312 cp->Header.LUN.LunAddrBytes[0],
313 cp->Header.LUN.LunAddrBytes[1],
314 cp->Header.LUN.LunAddrBytes[2],
315 cp->Header.LUN.LunAddrBytes[3],
316 cp->Header.LUN.LunAddrBytes[4],
317 cp->Header.LUN.LunAddrBytes[5],
318 cp->Header.LUN.LunAddrBytes[6],
319 cp->Header.LUN.LunAddrBytes[7]);
320 printk("CDBLen:%d\n", cp->Request.CDBLen);
321 printk("Type:%d\n",cp->Request.Type.Type);
322 printk("Attr:%d\n",cp->Request.Type.Attribute);
323 printk(" Dir:%d\n",cp->Request.Type.Direction);
324 printk("Timeout:%d\n",cp->Request.Timeout);
325 printk( "CDB: %02x %02x %02x %02x %02x %02x %02x %02x"
326 " %02x %02x %02x %02x %02x %02x %02x %02x\n",
327 cp->Request.CDB[0], cp->Request.CDB[1],
328 cp->Request.CDB[2], cp->Request.CDB[3],
329 cp->Request.CDB[4], cp->Request.CDB[5],
330 cp->Request.CDB[6], cp->Request.CDB[7],
331 cp->Request.CDB[8], cp->Request.CDB[9],
332 cp->Request.CDB[10], cp->Request.CDB[11],
333 cp->Request.CDB[12], cp->Request.CDB[13],
334 cp->Request.CDB[14], cp->Request.CDB[15]),
335 printk("edesc.Addr: 0x%08x/0%08x, Len = %d\n",
336 cp->ErrDesc.Addr.upper, cp->ErrDesc.Addr.lower,
337 cp->ErrDesc.Len);
338 printk("sgs..........Errorinfo:\n");
339 printk("scsistatus:%d\n", cp->err_info->ScsiStatus);
340 printk("senselen:%d\n", cp->err_info->SenseLen);
341 printk("cmd status:%d\n", cp->err_info->CommandStatus);
342 printk("resid cnt:%d\n", cp->err_info->ResidualCnt);
343 printk("offense size:%d\n", cp->err_info->MoreErrInfo.Invalid_Cmd.offense_size);
344 printk("offense byte:%d\n", cp->err_info->MoreErrInfo.Invalid_Cmd.offense_num);
345 printk("offense value:%d\n", cp->err_info->MoreErrInfo.Invalid_Cmd.offense_value);
346
347}
348
349#endif
350
351static int
352find_bus_target_lun(int ctlr, int *bus, int *target, int *lun)
353{
354 /* finds an unused bus, target, lun for a new device */
355 /* assumes hba[ctlr]->scsi_ctlr->lock is held */
356 int i, found=0;
357 unsigned char target_taken[CCISS_MAX_SCSI_DEVS_PER_HBA];
358
359 memset(&target_taken[0], 0, CCISS_MAX_SCSI_DEVS_PER_HBA);
360
361 target_taken[SELF_SCSI_ID] = 1;
362 for (i=0;i<ccissscsi[ctlr].ndevices;i++)
363 target_taken[ccissscsi[ctlr].dev[i].target] = 1;
364
365 for (i=0;i<CCISS_MAX_SCSI_DEVS_PER_HBA;i++) {
366 if (!target_taken[i]) {
367 *bus = 0; *target=i; *lun = 0; found=1;
368 break;
369 }
370 }
371 return (!found);
372}
f4a93bcd
MM
373struct scsi2map {
374 char scsi3addr[8];
375 int bus, target, lun;
376};
1da177e4
LT
377
378static int
379cciss_scsi_add_entry(int ctlr, int hostno,
905bd78f 380 struct cciss_scsi_dev_t *device,
f4a93bcd 381 struct scsi2map *added, int *nadded)
1da177e4
LT
382{
383 /* assumes hba[ctlr]->scsi_ctlr->lock is held */
384 int n = ccissscsi[ctlr].ndevices;
385 struct cciss_scsi_dev_t *sd;
935dc8d7
MM
386 int i, bus, target, lun;
387 unsigned char addr1[8], addr2[8];
1da177e4
LT
388
389 if (n >= CCISS_MAX_SCSI_DEVS_PER_HBA) {
390 printk("cciss%d: Too many devices, "
391 "some will be inaccessible.\n", ctlr);
392 return -1;
393 }
f4a93bcd 394
935dc8d7
MM
395 bus = target = -1;
396 lun = 0;
397 /* Is this device a non-zero lun of a multi-lun device */
398 /* byte 4 of the 8-byte LUN addr will contain the logical unit no. */
905bd78f 399 if (device->scsi3addr[4] != 0) {
935dc8d7
MM
400 /* Search through our list and find the device which */
401 /* has the same 8 byte LUN address, excepting byte 4. */
402 /* Assign the same bus and target for this new LUN. */
403 /* Use the logical unit number from the firmware. */
905bd78f 404 memcpy(addr1, device->scsi3addr, 8);
935dc8d7
MM
405 addr1[4] = 0;
406 for (i = 0; i < n; i++) {
407 sd = &ccissscsi[ctlr].dev[i];
408 memcpy(addr2, sd->scsi3addr, 8);
409 addr2[4] = 0;
410 /* differ only in byte 4? */
411 if (memcmp(addr1, addr2, 8) == 0) {
412 bus = sd->bus;
413 target = sd->target;
905bd78f 414 lun = device->scsi3addr[4];
935dc8d7
MM
415 break;
416 }
417 }
418 }
419
420 sd = &ccissscsi[ctlr].dev[n];
421 if (lun == 0) {
422 if (find_bus_target_lun(ctlr,
423 &sd->bus, &sd->target, &sd->lun) != 0)
424 return -1;
425 } else {
426 sd->bus = bus;
427 sd->target = target;
428 sd->lun = lun;
429 }
f4a93bcd
MM
430 added[*nadded].bus = sd->bus;
431 added[*nadded].target = sd->target;
432 added[*nadded].lun = sd->lun;
433 (*nadded)++;
434
905bd78f 435 memcpy(sd->scsi3addr, device->scsi3addr, 8);
436 memcpy(sd->vendor, device->vendor, sizeof(sd->vendor));
437 memcpy(sd->revision, device->revision, sizeof(sd->revision));
438 memcpy(sd->device_id, device->device_id, sizeof(sd->device_id));
439 sd->devtype = device->devtype;
440
1da177e4
LT
441 ccissscsi[ctlr].ndevices++;
442
443 /* initially, (before registering with scsi layer) we don't
444 know our hostno and we don't want to print anything first
445 time anyway (the scsi layer's inquiries will show that info) */
446 if (hostno != -1)
447 printk("cciss%d: %s device c%db%dt%dl%d added.\n",
4ff36718 448 ctlr, scsi_device_type(sd->devtype), hostno,
1da177e4
LT
449 sd->bus, sd->target, sd->lun);
450 return 0;
451}
452
453static void
f4a93bcd
MM
454cciss_scsi_remove_entry(int ctlr, int hostno, int entry,
455 struct scsi2map *removed, int *nremoved)
1da177e4
LT
456{
457 /* assumes hba[ctlr]->scsi_ctlr->lock is held */
458 int i;
459 struct cciss_scsi_dev_t sd;
460
461 if (entry < 0 || entry >= CCISS_MAX_SCSI_DEVS_PER_HBA) return;
462 sd = ccissscsi[ctlr].dev[entry];
f4a93bcd
MM
463 removed[*nremoved].bus = sd.bus;
464 removed[*nremoved].target = sd.target;
465 removed[*nremoved].lun = sd.lun;
466 (*nremoved)++;
1da177e4
LT
467 for (i=entry;i<ccissscsi[ctlr].ndevices-1;i++)
468 ccissscsi[ctlr].dev[i] = ccissscsi[ctlr].dev[i+1];
469 ccissscsi[ctlr].ndevices--;
470 printk("cciss%d: %s device c%db%dt%dl%d removed.\n",
4ff36718 471 ctlr, scsi_device_type(sd.devtype), hostno,
1da177e4
LT
472 sd.bus, sd.target, sd.lun);
473}
474
475
476#define SCSI3ADDR_EQ(a,b) ( \
477 (a)[7] == (b)[7] && \
478 (a)[6] == (b)[6] && \
479 (a)[5] == (b)[5] && \
480 (a)[4] == (b)[4] && \
481 (a)[3] == (b)[3] && \
482 (a)[2] == (b)[2] && \
483 (a)[1] == (b)[1] && \
484 (a)[0] == (b)[0])
485
f4a93bcd
MM
486static void fixup_botched_add(int ctlr, char *scsi3addr)
487{
488 /* called when scsi_add_device fails in order to re-adjust */
489 /* ccissscsi[] to match the mid layer's view. */
490 unsigned long flags;
491 int i, j;
492 CPQ_TAPE_LOCK(ctlr, flags);
493 for (i = 0; i < ccissscsi[ctlr].ndevices; i++) {
494 if (memcmp(scsi3addr,
495 ccissscsi[ctlr].dev[i].scsi3addr, 8) == 0) {
496 for (j = i; j < ccissscsi[ctlr].ndevices-1; j++)
497 ccissscsi[ctlr].dev[j] =
498 ccissscsi[ctlr].dev[j+1];
499 ccissscsi[ctlr].ndevices--;
500 break;
501 }
502 }
503 CPQ_TAPE_UNLOCK(ctlr, flags);
504}
505
905bd78f 506static int device_is_the_same(struct cciss_scsi_dev_t *dev1,
507 struct cciss_scsi_dev_t *dev2)
508{
509 return dev1->devtype == dev2->devtype &&
510 memcmp(dev1->scsi3addr, dev2->scsi3addr,
511 sizeof(dev1->scsi3addr)) == 0 &&
512 memcmp(dev1->device_id, dev2->device_id,
513 sizeof(dev1->device_id)) == 0 &&
514 memcmp(dev1->vendor, dev2->vendor,
515 sizeof(dev1->vendor)) == 0 &&
516 memcmp(dev1->model, dev2->model,
517 sizeof(dev1->model)) == 0 &&
518 memcmp(dev1->revision, dev2->revision,
519 sizeof(dev1->revision)) == 0;
520}
521
1da177e4
LT
522static int
523adjust_cciss_scsi_table(int ctlr, int hostno,
524 struct cciss_scsi_dev_t sd[], int nsds)
525{
526 /* sd contains scsi3 addresses and devtypes, but
527 bus target and lun are not filled in. This funciton
528 takes what's in sd to be the current and adjusts
529 ccissscsi[] to be in line with what's in sd. */
530
531 int i,j, found, changes=0;
532 struct cciss_scsi_dev_t *csd;
533 unsigned long flags;
f4a93bcd
MM
534 struct scsi2map *added, *removed;
535 int nadded, nremoved;
536 struct Scsi_Host *sh = NULL;
537
538 added = kzalloc(sizeof(*added) * CCISS_MAX_SCSI_DEVS_PER_HBA,
539 GFP_KERNEL);
540 removed = kzalloc(sizeof(*removed) * CCISS_MAX_SCSI_DEVS_PER_HBA,
541 GFP_KERNEL);
542
543 if (!added || !removed) {
544 printk(KERN_WARNING "cciss%d: Out of memory in "
545 "adjust_cciss_scsi_table\n", ctlr);
546 goto free_and_out;
547 }
1da177e4
LT
548
549 CPQ_TAPE_LOCK(ctlr, flags);
550
f4a93bcd
MM
551 if (hostno != -1) /* if it's not the first time... */
552 sh = ((struct cciss_scsi_adapter_data_t *)
553 hba[ctlr]->scsi_ctlr)->scsi_host;
554
1da177e4
LT
555 /* find any devices in ccissscsi[] that are not in
556 sd[] and remove them from ccissscsi[] */
557
558 i = 0;
f4a93bcd
MM
559 nremoved = 0;
560 nadded = 0;
1da177e4
LT
561 while(i<ccissscsi[ctlr].ndevices) {
562 csd = &ccissscsi[ctlr].dev[i];
563 found=0;
564 for (j=0;j<nsds;j++) {
565 if (SCSI3ADDR_EQ(sd[j].scsi3addr,
566 csd->scsi3addr)) {
905bd78f 567 if (device_is_the_same(&sd[j], csd))
1da177e4
LT
568 found=2;
569 else
570 found=1;
571 break;
572 }
573 }
574
575 if (found == 0) { /* device no longer present. */
576 changes++;
577 /* printk("cciss%d: %s device c%db%dt%dl%d removed.\n",
4ff36718 578 ctlr, scsi_device_type(csd->devtype), hostno,
1da177e4 579 csd->bus, csd->target, csd->lun); */
f4a93bcd
MM
580 cciss_scsi_remove_entry(ctlr, hostno, i,
581 removed, &nremoved);
582 /* remove ^^^, hence i not incremented */
905bd78f 583 } else if (found == 1) { /* device is different in some way */
1da177e4 584 changes++;
905bd78f 585 printk("cciss%d: device c%db%dt%dl%d has changed.\n",
586 ctlr, hostno, csd->bus, csd->target, csd->lun);
f4a93bcd
MM
587 cciss_scsi_remove_entry(ctlr, hostno, i,
588 removed, &nremoved);
589 /* remove ^^^, hence i not incremented */
905bd78f 590 if (cciss_scsi_add_entry(ctlr, hostno, &sd[j],
f4a93bcd
MM
591 added, &nadded) != 0)
592 /* we just removed one, so add can't fail. */
593 BUG();
1da177e4 594 csd->devtype = sd[j].devtype;
905bd78f 595 memcpy(csd->device_id, sd[j].device_id,
596 sizeof(csd->device_id));
597 memcpy(csd->vendor, sd[j].vendor,
598 sizeof(csd->vendor));
599 memcpy(csd->model, sd[j].model,
600 sizeof(csd->model));
601 memcpy(csd->revision, sd[j].revision,
602 sizeof(csd->revision));
1da177e4
LT
603 } else /* device is same as it ever was, */
604 i++; /* so just move along. */
605 }
606
607 /* Now, make sure every device listed in sd[] is also
608 listed in ccissscsi[], adding them if they aren't found */
609
610 for (i=0;i<nsds;i++) {
611 found=0;
612 for (j=0;j<ccissscsi[ctlr].ndevices;j++) {
613 csd = &ccissscsi[ctlr].dev[j];
614 if (SCSI3ADDR_EQ(sd[i].scsi3addr,
615 csd->scsi3addr)) {
905bd78f 616 if (device_is_the_same(&sd[i], csd))
1da177e4
LT
617 found=2; /* found device */
618 else
619 found=1; /* found a bug. */
620 break;
621 }
622 }
623 if (!found) {
624 changes++;
905bd78f 625 if (cciss_scsi_add_entry(ctlr, hostno, &sd[i],
f4a93bcd 626 added, &nadded) != 0)
1da177e4
LT
627 break;
628 } else if (found == 1) {
629 /* should never happen... */
630 changes++;
905bd78f 631 printk(KERN_WARNING "cciss%d: device "
632 "unexpectedly changed\n", ctlr);
1da177e4
LT
633 /* but if it does happen, we just ignore that device */
634 }
635 }
636 CPQ_TAPE_UNLOCK(ctlr, flags);
637
f4a93bcd
MM
638 /* Don't notify scsi mid layer of any changes the first time through */
639 /* (or if there are no changes) scsi_scan_host will do it later the */
640 /* first time through. */
641 if (hostno == -1 || !changes)
642 goto free_and_out;
643
644 /* Notify scsi mid layer of any removed devices */
645 for (i = 0; i < nremoved; i++) {
646 struct scsi_device *sdev =
647 scsi_device_lookup(sh, removed[i].bus,
648 removed[i].target, removed[i].lun);
649 if (sdev != NULL) {
650 scsi_remove_device(sdev);
651 scsi_device_put(sdev);
652 } else {
653 /* We don't expect to get here. */
654 /* future cmds to this device will get selection */
655 /* timeout as if the device was gone. */
656 printk(KERN_WARNING "cciss%d: didn't find "
657 "c%db%dt%dl%d\n for removal.",
658 ctlr, hostno, removed[i].bus,
659 removed[i].target, removed[i].lun);
660 }
661 }
662
663 /* Notify scsi mid layer of any added devices */
664 for (i = 0; i < nadded; i++) {
665 int rc;
666 rc = scsi_add_device(sh, added[i].bus,
667 added[i].target, added[i].lun);
668 if (rc == 0)
669 continue;
670 printk(KERN_WARNING "cciss%d: scsi_add_device "
671 "c%db%dt%dl%d failed, device not added.\n",
672 ctlr, hostno,
673 added[i].bus, added[i].target, added[i].lun);
674 /* now we have to remove it from ccissscsi, */
675 /* since it didn't get added to scsi mid layer */
676 fixup_botched_add(ctlr, added[i].scsi3addr);
677 }
1da177e4 678
f4a93bcd
MM
679free_and_out:
680 kfree(added);
681 kfree(removed);
1da177e4
LT
682 return 0;
683}
684
685static int
686lookup_scsi3addr(int ctlr, int bus, int target, int lun, char *scsi3addr)
687{
688 int i;
689 struct cciss_scsi_dev_t *sd;
690 unsigned long flags;
691
692 CPQ_TAPE_LOCK(ctlr, flags);
693 for (i=0;i<ccissscsi[ctlr].ndevices;i++) {
694 sd = &ccissscsi[ctlr].dev[i];
695 if (sd->bus == bus &&
696 sd->target == target &&
697 sd->lun == lun) {
698 memcpy(scsi3addr, &sd->scsi3addr[0], 8);
699 CPQ_TAPE_UNLOCK(ctlr, flags);
700 return 0;
701 }
702 }
703 CPQ_TAPE_UNLOCK(ctlr, flags);
704 return -1;
705}
706
707static void
708cciss_scsi_setup(int cntl_num)
709{
710 struct cciss_scsi_adapter_data_t * shba;
711
712 ccissscsi[cntl_num].ndevices = 0;
713 shba = (struct cciss_scsi_adapter_data_t *)
714 kmalloc(sizeof(*shba), GFP_KERNEL);
715 if (shba == NULL)
716 return;
717 shba->scsi_host = NULL;
718 spin_lock_init(&shba->lock);
719 shba->registered = 0;
720 if (scsi_cmd_stack_setup(cntl_num, shba) != 0) {
721 kfree(shba);
722 shba = NULL;
723 }
724 hba[cntl_num]->scsi_ctlr = (void *) shba;
725 return;
726}
727
728static void
729complete_scsi_command( CommandList_struct *cp, int timeout, __u32 tag)
730{
731 struct scsi_cmnd *cmd;
732 ctlr_info_t *ctlr;
1da177e4
LT
733 ErrorInfo_struct *ei;
734
735 ei = cp->err_info;
736
737 /* First, see if it was a message rather than a command */
738 if (cp->Request.Type.Type == TYPE_MSG) {
739 cp->cmd_type = CMD_MSG_DONE;
740 return;
741 }
742
743 cmd = (struct scsi_cmnd *) cp->scsi_cmd;
744 ctlr = hba[cp->ctlr];
745
41ce639a 746 scsi_dma_unmap(cmd);
1da177e4
LT
747
748 cmd->result = (DID_OK << 16); /* host byte */
749 cmd->result |= (COMMAND_COMPLETE << 8); /* msg byte */
750 /* cmd->result |= (GOOD < 1); */ /* status byte */
751
752 cmd->result |= (ei->ScsiStatus);
753 /* printk("Scsistatus is 0x%02x\n", ei->ScsiStatus); */
754
755 /* copy the sense data whether we need to or not. */
756
757 memcpy(cmd->sense_buffer, ei->SenseInfo,
758 ei->SenseLen > SCSI_SENSE_BUFFERSIZE ?
759 SCSI_SENSE_BUFFERSIZE :
760 ei->SenseLen);
41ce639a 761 scsi_set_resid(cmd, ei->ResidualCnt);
1da177e4
LT
762
763 if(ei->CommandStatus != 0)
764 { /* an error has occurred */
765 switch(ei->CommandStatus)
766 {
767 case CMD_TARGET_STATUS:
768 /* Pass it up to the upper layers... */
769 if( ei->ScsiStatus)
770 {
771#if 0
772 printk(KERN_WARNING "cciss: cmd %p "
773 "has SCSI Status = %x\n",
774 cp,
775 ei->ScsiStatus);
776#endif
777 cmd->result |= (ei->ScsiStatus < 1);
778 }
779 else { /* scsi status is zero??? How??? */
780
781 /* Ordinarily, this case should never happen, but there is a bug
782 in some released firmware revisions that allows it to happen
783 if, for example, a 4100 backplane loses power and the tape
784 drive is in it. We assume that it's a fatal error of some
785 kind because we can't show that it wasn't. We will make it
786 look like selection timeout since that is the most common
787 reason for this to occur, and it's severe enough. */
788
789 cmd->result = DID_NO_CONNECT << 16;
790 }
791 break;
792 case CMD_DATA_UNDERRUN: /* let mid layer handle it. */
793 break;
794 case CMD_DATA_OVERRUN:
795 printk(KERN_WARNING "cciss: cp %p has"
796 " completed with data overrun "
797 "reported\n", cp);
798 break;
799 case CMD_INVALID: {
800 /* print_bytes(cp, sizeof(*cp), 1, 0);
801 print_cmd(cp); */
802 /* We get CMD_INVALID if you address a non-existent tape drive instead
803 of a selection timeout (no response). You will see this if you yank
804 out a tape drive, then try to access it. This is kind of a shame
805 because it means that any other CMD_INVALID (e.g. driver bug) will
806 get interpreted as a missing target. */
807 cmd->result = DID_NO_CONNECT << 16;
808 }
809 break;
810 case CMD_PROTOCOL_ERR:
811 printk(KERN_WARNING "cciss: cp %p has "
812 "protocol error \n", cp);
813 break;
814 case CMD_HARDWARE_ERR:
815 cmd->result = DID_ERROR << 16;
816 printk(KERN_WARNING "cciss: cp %p had "
817 " hardware error\n", cp);
818 break;
819 case CMD_CONNECTION_LOST:
820 cmd->result = DID_ERROR << 16;
821 printk(KERN_WARNING "cciss: cp %p had "
822 "connection lost\n", cp);
823 break;
824 case CMD_ABORTED:
825 cmd->result = DID_ABORT << 16;
826 printk(KERN_WARNING "cciss: cp %p was "
827 "aborted\n", cp);
828 break;
829 case CMD_ABORT_FAILED:
830 cmd->result = DID_ERROR << 16;
831 printk(KERN_WARNING "cciss: cp %p reports "
832 "abort failed\n", cp);
833 break;
834 case CMD_UNSOLICITED_ABORT:
835 cmd->result = DID_ABORT << 16;
836 printk(KERN_WARNING "cciss: cp %p aborted "
837 "do to an unsolicited abort\n", cp);
838 break;
839 case CMD_TIMEOUT:
840 cmd->result = DID_TIME_OUT << 16;
841 printk(KERN_WARNING "cciss: cp %p timedout\n",
842 cp);
843 break;
844 default:
845 cmd->result = DID_ERROR << 16;
846 printk(KERN_WARNING "cciss: cp %p returned "
847 "unknown status %x\n", cp,
848 ei->CommandStatus);
849 }
850 }
851 // printk("c:%p:c%db%dt%dl%d ", cmd, ctlr->ctlr, cmd->channel,
852 // cmd->target, cmd->lun);
853 cmd->scsi_done(cmd);
854 scsi_cmd_free(ctlr, cp);
855}
856
857static int
858cciss_scsi_detect(int ctlr)
859{
860 struct Scsi_Host *sh;
861 int error;
862
863 sh = scsi_host_alloc(&cciss_driver_template, sizeof(struct ctlr_info *));
864 if (sh == NULL)
865 goto fail;
866 sh->io_port = 0; // good enough? FIXME,
867 sh->n_io_port = 0; // I don't think we use these two...
868 sh->this_id = SELF_SCSI_ID;
869
870 ((struct cciss_scsi_adapter_data_t *)
871 hba[ctlr]->scsi_ctlr)->scsi_host = (void *) sh;
872 sh->hostdata[0] = (unsigned long) hba[ctlr];
fb86a35b 873 sh->irq = hba[ctlr]->intr[SIMPLE_MODE_INT];
1da177e4
LT
874 sh->unique_id = sh->irq;
875 error = scsi_add_host(sh, &hba[ctlr]->pdev->dev);
876 if (error)
877 goto fail_host_put;
878 scsi_scan_host(sh);
879 return 1;
880
881 fail_host_put:
882 scsi_host_put(sh);
883 fail:
884 return 0;
885}
886
887static void
888cciss_unmap_one(struct pci_dev *pdev,
889 CommandList_struct *cp,
890 size_t buflen,
891 int data_direction)
892{
893 u64bit addr64;
894
895 addr64.val32.lower = cp->SG[0].Addr.lower;
896 addr64.val32.upper = cp->SG[0].Addr.upper;
897 pci_unmap_single(pdev, (dma_addr_t) addr64.val, buflen, data_direction);
898}
899
900static void
901cciss_map_one(struct pci_dev *pdev,
902 CommandList_struct *cp,
903 unsigned char *buf,
904 size_t buflen,
905 int data_direction)
906{
907 __u64 addr64;
908
909 addr64 = (__u64) pci_map_single(pdev, buf, buflen, data_direction);
910 cp->SG[0].Addr.lower =
911 (__u32) (addr64 & (__u64) 0x00000000FFFFFFFF);
912 cp->SG[0].Addr.upper =
913 (__u32) ((addr64 >> 32) & (__u64) 0x00000000FFFFFFFF);
914 cp->SG[0].Len = buflen;
915 cp->Header.SGList = (__u8) 1; /* no. SGs contig in this cmd */
916 cp->Header.SGTotal = (__u16) 1; /* total sgs in this cmd list */
917}
918
919static int
920cciss_scsi_do_simple_cmd(ctlr_info_t *c,
921 CommandList_struct *cp,
922 unsigned char *scsi3addr,
923 unsigned char *cdb,
924 unsigned char cdblen,
925 unsigned char *buf, int bufsize,
926 int direction)
927{
928 unsigned long flags;
6e9a4738 929 DECLARE_COMPLETION_ONSTACK(wait);
1da177e4
LT
930
931 cp->cmd_type = CMD_IOCTL_PEND; // treat this like an ioctl
932 cp->scsi_cmd = NULL;
933 cp->Header.ReplyQueue = 0; // unused in simple mode
934 memcpy(&cp->Header.LUN, scsi3addr, sizeof(cp->Header.LUN));
935 cp->Header.Tag.lower = cp->busaddr; // Use k. address of cmd as tag
936 // Fill in the request block...
937
938 /* printk("Using scsi3addr 0x%02x%0x2%0x2%0x2%0x2%0x2%0x2%0x2\n",
939 scsi3addr[0], scsi3addr[1], scsi3addr[2], scsi3addr[3],
940 scsi3addr[4], scsi3addr[5], scsi3addr[6], scsi3addr[7]); */
941
942 memset(cp->Request.CDB, 0, sizeof(cp->Request.CDB));
943 memcpy(cp->Request.CDB, cdb, cdblen);
944 cp->Request.Timeout = 0;
945 cp->Request.CDBLen = cdblen;
946 cp->Request.Type.Type = TYPE_CMD;
947 cp->Request.Type.Attribute = ATTR_SIMPLE;
948 cp->Request.Type.Direction = direction;
949
950 /* Fill in the SG list and do dma mapping */
951 cciss_map_one(c->pdev, cp, (unsigned char *) buf,
952 bufsize, DMA_FROM_DEVICE);
953
954 cp->waiting = &wait;
955
956 /* Put the request on the tail of the request queue */
957 spin_lock_irqsave(CCISS_LOCK(c->ctlr), flags);
958 addQ(&c->reqQ, cp);
959 c->Qdepth++;
960 start_io(c);
961 spin_unlock_irqrestore(CCISS_LOCK(c->ctlr), flags);
962
963 wait_for_completion(&wait);
964
965 /* undo the dma mapping */
966 cciss_unmap_one(c->pdev, cp, bufsize, DMA_FROM_DEVICE);
967 return(0);
968}
969
970static void
971cciss_scsi_interpret_error(CommandList_struct *cp)
972{
973 ErrorInfo_struct *ei;
974
975 ei = cp->err_info;
976 switch(ei->CommandStatus)
977 {
978 case CMD_TARGET_STATUS:
979 printk(KERN_WARNING "cciss: cmd %p has "
980 "completed with errors\n", cp);
981 printk(KERN_WARNING "cciss: cmd %p "
982 "has SCSI Status = %x\n",
983 cp,
984 ei->ScsiStatus);
985 if (ei->ScsiStatus == 0)
986 printk(KERN_WARNING
987 "cciss:SCSI status is abnormally zero. "
988 "(probably indicates selection timeout "
989 "reported incorrectly due to a known "
990 "firmware bug, circa July, 2001.)\n");
991 break;
992 case CMD_DATA_UNDERRUN: /* let mid layer handle it. */
993 printk("UNDERRUN\n");
994 break;
995 case CMD_DATA_OVERRUN:
996 printk(KERN_WARNING "cciss: cp %p has"
997 " completed with data overrun "
998 "reported\n", cp);
999 break;
1000 case CMD_INVALID: {
1001 /* controller unfortunately reports SCSI passthru's */
1002 /* to non-existent targets as invalid commands. */
1003 printk(KERN_WARNING "cciss: cp %p is "
1004 "reported invalid (probably means "
1005 "target device no longer present)\n",
1006 cp);
1007 /* print_bytes((unsigned char *) cp, sizeof(*cp), 1, 0);
1008 print_cmd(cp); */
1009 }
1010 break;
1011 case CMD_PROTOCOL_ERR:
1012 printk(KERN_WARNING "cciss: cp %p has "
1013 "protocol error \n", cp);
1014 break;
1015 case CMD_HARDWARE_ERR:
1016 /* cmd->result = DID_ERROR << 16; */
1017 printk(KERN_WARNING "cciss: cp %p had "
1018 " hardware error\n", cp);
1019 break;
1020 case CMD_CONNECTION_LOST:
1021 printk(KERN_WARNING "cciss: cp %p had "
1022 "connection lost\n", cp);
1023 break;
1024 case CMD_ABORTED:
1025 printk(KERN_WARNING "cciss: cp %p was "
1026 "aborted\n", cp);
1027 break;
1028 case CMD_ABORT_FAILED:
1029 printk(KERN_WARNING "cciss: cp %p reports "
1030 "abort failed\n", cp);
1031 break;
1032 case CMD_UNSOLICITED_ABORT:
1033 printk(KERN_WARNING "cciss: cp %p aborted "
1034 "do to an unsolicited abort\n", cp);
1035 break;
1036 case CMD_TIMEOUT:
1037 printk(KERN_WARNING "cciss: cp %p timedout\n",
1038 cp);
1039 break;
1040 default:
1041 printk(KERN_WARNING "cciss: cp %p returned "
1042 "unknown status %x\n", cp,
1043 ei->CommandStatus);
1044 }
1045}
1046
1047static int
1048cciss_scsi_do_inquiry(ctlr_info_t *c, unsigned char *scsi3addr,
905bd78f 1049 unsigned char page, unsigned char *buf,
1050 unsigned char bufsize)
1da177e4
LT
1051{
1052 int rc;
1053 CommandList_struct *cp;
1054 char cdb[6];
1055 ErrorInfo_struct *ei;
1056 unsigned long flags;
1057
1058 spin_lock_irqsave(CCISS_LOCK(c->ctlr), flags);
1059 cp = scsi_cmd_alloc(c);
1060 spin_unlock_irqrestore(CCISS_LOCK(c->ctlr), flags);
1061
1062 if (cp == NULL) { /* trouble... */
1063 printk("cmd_alloc returned NULL!\n");
1064 return -1;
1065 }
1066
1067 ei = cp->err_info;
1068
1069 cdb[0] = CISS_INQUIRY;
905bd78f 1070 cdb[1] = (page != 0);
1071 cdb[2] = page;
1da177e4 1072 cdb[3] = 0;
47922d06 1073 cdb[4] = bufsize;
1da177e4
LT
1074 cdb[5] = 0;
1075 rc = cciss_scsi_do_simple_cmd(c, cp, scsi3addr, cdb,
47922d06 1076 6, buf, bufsize, XFER_READ);
1da177e4
LT
1077
1078 if (rc != 0) return rc; /* something went wrong */
1079
1080 if (ei->CommandStatus != 0 &&
1081 ei->CommandStatus != CMD_DATA_UNDERRUN) {
1082 cciss_scsi_interpret_error(cp);
1083 rc = -1;
1084 }
1085 spin_lock_irqsave(CCISS_LOCK(c->ctlr), flags);
1086 scsi_cmd_free(c, cp);
1087 spin_unlock_irqrestore(CCISS_LOCK(c->ctlr), flags);
1088 return rc;
1089}
1090
905bd78f 1091/* Get the device id from inquiry page 0x83 */
1092static int cciss_scsi_get_device_id(ctlr_info_t *c, unsigned char *scsi3addr,
1093 unsigned char *device_id, int buflen)
1094{
1095 int rc;
1096 unsigned char *buf;
1097
1098 if (buflen > 16)
1099 buflen = 16;
1100 buf = kzalloc(64, GFP_KERNEL);
1101 if (!buf)
1102 return -1;
1103 rc = cciss_scsi_do_inquiry(c, scsi3addr, 0x83, buf, 64);
1104 if (rc == 0)
1105 memcpy(device_id, &buf[8], buflen);
1106 kfree(buf);
1107 return rc != 0;
1108}
1109
1da177e4
LT
1110static int
1111cciss_scsi_do_report_phys_luns(ctlr_info_t *c,
1112 ReportLunData_struct *buf, int bufsize)
1113{
1114 int rc;
1115 CommandList_struct *cp;
1116 unsigned char cdb[12];
1117 unsigned char scsi3addr[8];
1118 ErrorInfo_struct *ei;
1119 unsigned long flags;
1120
1121 spin_lock_irqsave(CCISS_LOCK(c->ctlr), flags);
1122 cp = scsi_cmd_alloc(c);
1123 spin_unlock_irqrestore(CCISS_LOCK(c->ctlr), flags);
1124 if (cp == NULL) { /* trouble... */
1125 printk("cmd_alloc returned NULL!\n");
1126 return -1;
1127 }
1128
1129 memset(&scsi3addr[0], 0, 8); /* address the controller */
1130 cdb[0] = CISS_REPORT_PHYS;
1131 cdb[1] = 0;
1132 cdb[2] = 0;
1133 cdb[3] = 0;
1134 cdb[4] = 0;
1135 cdb[5] = 0;
1136 cdb[6] = (bufsize >> 24) & 0xFF; //MSB
1137 cdb[7] = (bufsize >> 16) & 0xFF;
1138 cdb[8] = (bufsize >> 8) & 0xFF;
1139 cdb[9] = bufsize & 0xFF;
1140 cdb[10] = 0;
1141 cdb[11] = 0;
1142
1143 rc = cciss_scsi_do_simple_cmd(c, cp, scsi3addr,
1144 cdb, 12,
1145 (unsigned char *) buf,
1146 bufsize, XFER_READ);
1147
1148 if (rc != 0) return rc; /* something went wrong */
1149
1150 ei = cp->err_info;
1151 if (ei->CommandStatus != 0 &&
1152 ei->CommandStatus != CMD_DATA_UNDERRUN) {
1153 cciss_scsi_interpret_error(cp);
1154 rc = -1;
1155 }
1156 spin_lock_irqsave(CCISS_LOCK(c->ctlr), flags);
1157 scsi_cmd_free(c, cp);
1158 spin_unlock_irqrestore(CCISS_LOCK(c->ctlr), flags);
1159 return rc;
1160}
1161
1162static void
1163cciss_update_non_disk_devices(int cntl_num, int hostno)
1164{
1165 /* the idea here is we could get notified from /proc
1166 that some devices have changed, so we do a report
1167 physical luns cmd, and adjust our list of devices
1168 accordingly. (We can't rely on the scsi-mid layer just
1169 doing inquiries, because the "busses" that the scsi
1170 mid-layer probes are totally fabricated by this driver,
1171 so new devices wouldn't show up.
1172
1173 the scsi3addr's of devices won't change so long as the
1174 adapter is not reset. That means we can rescan and
1175 tell which devices we already know about, vs. new
1176 devices, vs. disappearing devices.
1177
1178 Also, if you yank out a tape drive, then put in a disk
1179 in it's place, (say, a configured volume from another
1180 array controller for instance) _don't_ poke this driver
1181 (so it thinks it's still a tape, but _do_ poke the scsi
1182 mid layer, so it does an inquiry... the scsi mid layer
1183 will see the physical disk. This would be bad. Need to
1184 think about how to prevent that. One idea would be to
1185 snoop all scsi responses and if an inquiry repsonse comes
1186 back that reports a disk, chuck it an return selection
1187 timeout instead and adjust our table... Not sure i like
1188 that though.
1189
1190 */
47922d06
MM
1191#define OBDR_TAPE_INQ_SIZE 49
1192#define OBDR_TAPE_SIG "$DR-10"
1da177e4 1193 ReportLunData_struct *ld_buff;
47922d06 1194 unsigned char *inq_buff;
1da177e4
LT
1195 unsigned char scsi3addr[8];
1196 ctlr_info_t *c;
1197 __u32 num_luns=0;
1198 unsigned char *ch;
905bd78f 1199 struct cciss_scsi_dev_t *currentsd, *this_device;
1da177e4
LT
1200 int ncurrent=0;
1201 int reportlunsize = sizeof(*ld_buff) + CISS_MAX_PHYS_LUN * 8;
1202 int i;
1203
1204 c = (ctlr_info_t *) hba[cntl_num];
06ff37ff 1205 ld_buff = kzalloc(reportlunsize, GFP_KERNEL);
47922d06 1206 inq_buff = kmalloc(OBDR_TAPE_INQ_SIZE, GFP_KERNEL);
905bd78f 1207 currentsd = kzalloc(sizeof(*currentsd) *
1208 (CCISS_MAX_SCSI_DEVS_PER_HBA+1), GFP_KERNEL);
1209 if (ld_buff == NULL || inq_buff == NULL || currentsd == NULL) {
1210 printk(KERN_ERR "cciss: out of memory\n");
1211 goto out;
1da177e4 1212 }
905bd78f 1213 this_device = &currentsd[CCISS_MAX_SCSI_DEVS_PER_HBA];
1da177e4
LT
1214 if (cciss_scsi_do_report_phys_luns(c, ld_buff, reportlunsize) == 0) {
1215 ch = &ld_buff->LUNListLength[0];
1216 num_luns = ((ch[0]<<24) | (ch[1]<<16) | (ch[2]<<8) | ch[3]) / 8;
1217 if (num_luns > CISS_MAX_PHYS_LUN) {
1218 printk(KERN_WARNING
1219 "cciss: Maximum physical LUNs (%d) exceeded. "
1220 "%d LUNs ignored.\n", CISS_MAX_PHYS_LUN,
1221 num_luns - CISS_MAX_PHYS_LUN);
1222 num_luns = CISS_MAX_PHYS_LUN;
1223 }
1224 }
1225 else {
1226 printk(KERN_ERR "cciss: Report physical LUNs failed.\n");
1227 goto out;
1228 }
1229
1230
1231 /* adjust our table of devices */
905bd78f 1232 for (i = 0; i < num_luns; i++) {
1da177e4
LT
1233 /* for each physical lun, do an inquiry */
1234 if (ld_buff->LUN[i][3] & 0xC0) continue;
47922d06 1235 memset(inq_buff, 0, OBDR_TAPE_INQ_SIZE);
1da177e4
LT
1236 memcpy(&scsi3addr[0], &ld_buff->LUN[i][0], 8);
1237
905bd78f 1238 if (cciss_scsi_do_inquiry(hba[cntl_num], scsi3addr, 0, inq_buff,
1239 (unsigned char) OBDR_TAPE_INQ_SIZE) != 0)
1da177e4 1240 /* Inquiry failed (msg printed already) */
905bd78f 1241 continue; /* so we will skip this device. */
1242
1243 this_device->devtype = (inq_buff[0] & 0x1f);
1244 this_device->bus = -1;
1245 this_device->target = -1;
1246 this_device->lun = -1;
1247 memcpy(this_device->scsi3addr, scsi3addr, 8);
1248 memcpy(this_device->vendor, &inq_buff[8],
1249 sizeof(this_device->vendor));
1250 memcpy(this_device->model, &inq_buff[16],
1251 sizeof(this_device->model));
1252 memcpy(this_device->revision, &inq_buff[32],
1253 sizeof(this_device->revision));
1254 memset(this_device->device_id, 0,
1255 sizeof(this_device->device_id));
1256 cciss_scsi_get_device_id(hba[cntl_num], scsi3addr,
1257 this_device->device_id, sizeof(this_device->device_id));
1258
1259 switch (this_device->devtype)
1da177e4 1260 {
47922d06
MM
1261 case 0x05: /* CD-ROM */ {
1262
1263 /* We don't *really* support actual CD-ROM devices,
1264 * just this "One Button Disaster Recovery" tape drive
1265 * which temporarily pretends to be a CD-ROM drive.
1266 * So we check that the device is really an OBDR tape
1267 * device by checking for "$DR-10" in bytes 43-48 of
1268 * the inquiry data.
1269 */
1270 char obdr_sig[7];
1271
1272 strncpy(obdr_sig, &inq_buff[43], 6);
1273 obdr_sig[6] = '\0';
1274 if (strncmp(obdr_sig, OBDR_TAPE_SIG, 6) != 0)
1275 /* Not OBDR device, ignore it. */
1276 break;
1277 }
1278 /* fall through . . . */
1da177e4
LT
1279 case 0x01: /* sequential access, (tape) */
1280 case 0x08: /* medium changer */
1281 if (ncurrent >= CCISS_MAX_SCSI_DEVS_PER_HBA) {
1282 printk(KERN_INFO "cciss%d: %s ignored, "
1283 "too many devices.\n", cntl_num,
905bd78f 1284 scsi_device_type(this_device->devtype));
1da177e4
LT
1285 break;
1286 }
905bd78f 1287 currentsd[ncurrent] = *this_device;
1da177e4
LT
1288 ncurrent++;
1289 break;
1290 default:
1291 break;
1292 }
1293 }
1294
1295 adjust_cciss_scsi_table(cntl_num, hostno, currentsd, ncurrent);
1296out:
1297 kfree(inq_buff);
1298 kfree(ld_buff);
905bd78f 1299 kfree(currentsd);
1da177e4
LT
1300 return;
1301}
1302
1303static int
1304is_keyword(char *ptr, int len, char *verb) // Thanks to ncr53c8xx.c
1305{
1306 int verb_len = strlen(verb);
1307 if (len >= verb_len && !memcmp(verb,ptr,verb_len))
1308 return verb_len;
1309 else
1310 return 0;
1311}
1312
1313static int
1314cciss_scsi_user_command(int ctlr, int hostno, char *buffer, int length)
1315{
1316 int arg_len;
1317
1318 if ((arg_len = is_keyword(buffer, length, "rescan")) != 0)
1319 cciss_update_non_disk_devices(ctlr, hostno);
1320 else
1321 return -EINVAL;
1322 return length;
1323}
1324
1325
1326static int
1327cciss_scsi_proc_info(struct Scsi_Host *sh,
1328 char *buffer, /* data buffer */
1329 char **start, /* where data in buffer starts */
1330 off_t offset, /* offset from start of imaginary file */
1331 int length, /* length of data in buffer */
1332 int func) /* 0 == read, 1 == write */
1333{
1334
1335 int buflen, datalen;
1336 ctlr_info_t *ci;
b9f0bd08 1337 int i;
1da177e4
LT
1338 int cntl_num;
1339
1340
1341 ci = (ctlr_info_t *) sh->hostdata[0];
1342 if (ci == NULL) /* This really shouldn't ever happen. */
1343 return -EINVAL;
1344
1345 cntl_num = ci->ctlr; /* Get our index into the hba[] array */
1346
1347 if (func == 0) { /* User is reading from /proc/scsi/ciss*?/?* */
b9f0bd08
MM
1348 buflen = sprintf(buffer, "cciss%d: SCSI host: %d\n",
1349 cntl_num, sh->host_no);
1350
1351 /* this information is needed by apps to know which cciss
1352 device corresponds to which scsi host number without
1353 having to open a scsi target device node. The device
1354 information is not a duplicate of /proc/scsi/scsi because
1355 the two may be out of sync due to scsi hotplug, rather
1356 this info is for an app to be able to use to know how to
1357 get them back in sync. */
1358
1359 for (i=0;i<ccissscsi[cntl_num].ndevices;i++) {
1360 struct cciss_scsi_dev_t *sd = &ccissscsi[cntl_num].dev[i];
1361 buflen += sprintf(&buffer[buflen], "c%db%dt%dl%d %02d "
1362 "0x%02x%02x%02x%02x%02x%02x%02x%02x\n",
1363 sh->host_no, sd->bus, sd->target, sd->lun,
1364 sd->devtype,
1365 sd->scsi3addr[0], sd->scsi3addr[1],
1366 sd->scsi3addr[2], sd->scsi3addr[3],
1367 sd->scsi3addr[4], sd->scsi3addr[5],
1368 sd->scsi3addr[6], sd->scsi3addr[7]);
1369 }
1da177e4
LT
1370 datalen = buflen - offset;
1371 if (datalen < 0) { /* they're reading past EOF. */
1372 datalen = 0;
1373 *start = buffer+buflen;
1374 } else
1375 *start = buffer + offset;
1376 return(datalen);
1377 } else /* User is writing to /proc/scsi/cciss*?/?* ... */
1378 return cciss_scsi_user_command(cntl_num, sh->host_no,
1379 buffer, length);
1380}
1381
1382/* cciss_scatter_gather takes a struct scsi_cmnd, (cmd), and does the pci
1383 dma mapping and fills in the scatter gather entries of the
1384 cciss command, cp. */
1385
1386static void
1387cciss_scatter_gather(struct pci_dev *pdev,
1388 CommandList_struct *cp,
1389 struct scsi_cmnd *cmd)
1390{
41ce639a
FT
1391 unsigned int len;
1392 struct scatterlist *sg;
1da177e4 1393 __u64 addr64;
41ce639a
FT
1394 int use_sg, i;
1395
1396 BUG_ON(scsi_sg_count(cmd) > MAXSGENTRIES);
1397
1398 use_sg = scsi_dma_map(cmd);
1399 if (use_sg) { /* not too many addrs? */
1400 scsi_for_each_sg(cmd, sg, use_sg, i) {
1401 addr64 = (__u64) sg_dma_address(sg);
1402 len = sg_dma_len(sg);
1403 cp->SG[i].Addr.lower =
1404 (__u32) (addr64 & (__u64) 0x00000000FFFFFFFF);
1405 cp->SG[i].Addr.upper =
1406 (__u32) ((addr64 >> 32) & (__u64) 0x00000000FFFFFFFF);
1407 cp->SG[i].Len = len;
1408 cp->SG[i].Ext = 0; // we are not chaining
1da177e4 1409 }
41ce639a 1410 }
1da177e4 1411
41ce639a
FT
1412 cp->Header.SGList = (__u8) use_sg; /* no. SGs contig in this cmd */
1413 cp->Header.SGTotal = (__u16) use_sg; /* total sgs in this cmd list */
1da177e4
LT
1414 return;
1415}
1416
1417
1418static int
1419cciss_scsi_queue_command (struct scsi_cmnd *cmd, void (* done)(struct scsi_cmnd *))
1420{
1421 ctlr_info_t **c;
1422 int ctlr, rc;
1423 unsigned char scsi3addr[8];
1424 CommandList_struct *cp;
1425 unsigned long flags;
1426
1427 // Get the ptr to our adapter structure (hba[i]) out of cmd->host.
1428 // We violate cmd->host privacy here. (Is there another way?)
1429 c = (ctlr_info_t **) &cmd->device->host->hostdata[0];
1430 ctlr = (*c)->ctlr;
1431
1432 rc = lookup_scsi3addr(ctlr, cmd->device->channel, cmd->device->id,
1433 cmd->device->lun, scsi3addr);
1434 if (rc != 0) {
1435 /* the scsi nexus does not match any that we presented... */
1436 /* pretend to mid layer that we got selection timeout */
1437 cmd->result = DID_NO_CONNECT << 16;
1438 done(cmd);
1439 /* we might want to think about registering controller itself
1440 as a processor device on the bus so sg binds to it. */
1441 return 0;
1442 }
1443
1444 /* printk("cciss_queue_command, p=%p, cmd=0x%02x, c%db%dt%dl%d\n",
1445 cmd, cmd->cmnd[0], ctlr, cmd->channel, cmd->target, cmd->lun);*/
1446 // printk("q:%p:c%db%dt%dl%d ", cmd, ctlr, cmd->channel,
1447 // cmd->target, cmd->lun);
1448
1449 /* Ok, we have a reasonable scsi nexus, so send the cmd down, and
1450 see what the device thinks of it. */
1451
1452 spin_lock_irqsave(CCISS_LOCK(ctlr), flags);
1453 cp = scsi_cmd_alloc(*c);
1454 spin_unlock_irqrestore(CCISS_LOCK(ctlr), flags);
1455 if (cp == NULL) { /* trouble... */
1456 printk("scsi_cmd_alloc returned NULL!\n");
1457 /* FIXME: next 3 lines are -> BAD! <- */
1458 cmd->result = DID_NO_CONNECT << 16;
1459 done(cmd);
1460 return 0;
1461 }
1462
1463 // Fill in the command list header
1464
1465 cmd->scsi_done = done; // save this for use by completion code
1466
1467 // save cp in case we have to abort it
1468 cmd->host_scribble = (unsigned char *) cp;
1469
1470 cp->cmd_type = CMD_SCSI;
1471 cp->scsi_cmd = cmd;
1472 cp->Header.ReplyQueue = 0; // unused in simple mode
1473 memcpy(&cp->Header.LUN.LunAddrBytes[0], &scsi3addr[0], 8);
1474 cp->Header.Tag.lower = cp->busaddr; // Use k. address of cmd as tag
1475
1476 // Fill in the request block...
1477
1478 cp->Request.Timeout = 0;
1479 memset(cp->Request.CDB, 0, sizeof(cp->Request.CDB));
089fe1b2 1480 BUG_ON(cmd->cmd_len > sizeof(cp->Request.CDB));
1da177e4
LT
1481 cp->Request.CDBLen = cmd->cmd_len;
1482 memcpy(cp->Request.CDB, cmd->cmnd, cmd->cmd_len);
1483 cp->Request.Type.Type = TYPE_CMD;
1484 cp->Request.Type.Attribute = ATTR_SIMPLE;
1485 switch(cmd->sc_data_direction)
1486 {
1487 case DMA_TO_DEVICE: cp->Request.Type.Direction = XFER_WRITE; break;
1488 case DMA_FROM_DEVICE: cp->Request.Type.Direction = XFER_READ; break;
1489 case DMA_NONE: cp->Request.Type.Direction = XFER_NONE; break;
1490 case DMA_BIDIRECTIONAL:
1491 // This can happen if a buggy application does a scsi passthru
1492 // and sets both inlen and outlen to non-zero. ( see
1493 // ../scsi/scsi_ioctl.c:scsi_ioctl_send_command() )
1494
1495 cp->Request.Type.Direction = XFER_RSVD;
1496 // This is technically wrong, and cciss controllers should
1497 // reject it with CMD_INVALID, which is the most correct
1498 // response, but non-fibre backends appear to let it
1499 // slide by, and give the same results as if this field
1500 // were set correctly. Either way is acceptable for
1501 // our purposes here.
1502
1503 break;
1504
1505 default:
1506 printk("cciss: unknown data direction: %d\n",
1507 cmd->sc_data_direction);
1508 BUG();
1509 break;
1510 }
1511
1512 cciss_scatter_gather((*c)->pdev, cp, cmd); // Fill the SG list
1513
1514 /* Put the request on the tail of the request queue */
1515
1516 spin_lock_irqsave(CCISS_LOCK(ctlr), flags);
1517 addQ(&(*c)->reqQ, cp);
1518 (*c)->Qdepth++;
1519 start_io(*c);
1520 spin_unlock_irqrestore(CCISS_LOCK(ctlr), flags);
1521
1522 /* the cmd'll come back via intr handler in complete_scsi_command() */
1523 return 0;
1524}
1525
1526static void
1527cciss_unregister_scsi(int ctlr)
1528{
1529 struct cciss_scsi_adapter_data_t *sa;
1530 struct cciss_scsi_cmd_stack_t *stk;
1531 unsigned long flags;
1532
1533 /* we are being forcibly unloaded, and may not refuse. */
1534
1535 spin_lock_irqsave(CCISS_LOCK(ctlr), flags);
1536 sa = (struct cciss_scsi_adapter_data_t *) hba[ctlr]->scsi_ctlr;
1537 stk = &sa->cmd_stack;
1538
1539 /* if we weren't ever actually registered, don't unregister */
1540 if (sa->registered) {
1541 spin_unlock_irqrestore(CCISS_LOCK(ctlr), flags);
1542 scsi_remove_host(sa->scsi_host);
1543 scsi_host_put(sa->scsi_host);
1544 spin_lock_irqsave(CCISS_LOCK(ctlr), flags);
1545 }
1546
1547 /* set scsi_host to NULL so our detect routine will
1548 find us on register */
1549 sa->scsi_host = NULL;
6195057f 1550 spin_unlock_irqrestore(CCISS_LOCK(ctlr), flags);
1da177e4
LT
1551 scsi_cmd_stack_free(ctlr);
1552 kfree(sa);
1da177e4
LT
1553}
1554
1da177e4
LT
1555static int
1556cciss_engage_scsi(int ctlr)
1557{
1558 struct cciss_scsi_adapter_data_t *sa;
1559 struct cciss_scsi_cmd_stack_t *stk;
1560 unsigned long flags;
1561
1562 spin_lock_irqsave(CCISS_LOCK(ctlr), flags);
1563 sa = (struct cciss_scsi_adapter_data_t *) hba[ctlr]->scsi_ctlr;
1564 stk = &sa->cmd_stack;
1565
f4a93bcd 1566 if (sa->registered) {
1da177e4
LT
1567 printk("cciss%d: SCSI subsystem already engaged.\n", ctlr);
1568 spin_unlock_irqrestore(CCISS_LOCK(ctlr), flags);
1569 return ENXIO;
1570 }
f4a93bcd 1571 sa->registered = 1;
1da177e4
LT
1572 spin_unlock_irqrestore(CCISS_LOCK(ctlr), flags);
1573 cciss_update_non_disk_devices(ctlr, -1);
f4a93bcd 1574 cciss_scsi_detect(ctlr);
1da177e4
LT
1575 return 0;
1576}
1577
1578static void
89b6e743 1579cciss_seq_tape_report(struct seq_file *seq, int ctlr)
1da177e4
LT
1580{
1581 unsigned long flags;
1da177e4
LT
1582
1583 CPQ_TAPE_LOCK(ctlr, flags);
89b6e743 1584 seq_printf(seq,
b9f0bd08 1585 "Sequential access devices: %d\n\n",
1da177e4
LT
1586 ccissscsi[ctlr].ndevices);
1587 CPQ_TAPE_UNLOCK(ctlr, flags);
1da177e4
LT
1588}
1589
88f627ae
SC
1590static int wait_for_device_to_become_ready(ctlr_info_t *h,
1591 unsigned char lunaddr[])
1592{
1593 int rc;
1594 int count = 0;
1595 int waittime = HZ;
1596 CommandList_struct *c;
1597
1598 c = cmd_alloc(h, 1);
1599 if (!c) {
1600 printk(KERN_WARNING "cciss%d: out of memory in "
1601 "wait_for_device_to_become_ready.\n", h->ctlr);
1602 return IO_ERROR;
1603 }
1604
1605 /* Send test unit ready until device ready, or give up. */
1606 while (count < 20) {
1607
1608 /* Wait for a bit. do this first, because if we send
1609 * the TUR right away, the reset will just abort it.
1610 */
77b0308a 1611 schedule_timeout_interruptible(waittime);
88f627ae
SC
1612 count++;
1613
1614 /* Increase wait time with each try, up to a point. */
1615 if (waittime < (HZ * 30))
1616 waittime = waittime * 2;
1617
1618 /* Send the Test Unit Ready */
1619 rc = fill_cmd(c, TEST_UNIT_READY, h->ctlr, NULL, 0, 0, 0, 0,
1620 lunaddr, TYPE_CMD);
1621 if (rc == 0) {
1622 rc = sendcmd_core(h, c);
1623 /* sendcmd turned off interrupts, turn 'em back on. */
1624 h->access.set_intr_mask(h, CCISS_INTR_ON);
1625 }
1626
1627 if (rc == 0 && c->err_info->CommandStatus == CMD_SUCCESS)
1628 break;
1629
1630 if (rc == 0 &&
1631 c->err_info->CommandStatus == CMD_TARGET_STATUS &&
1632 c->err_info->ScsiStatus == SAM_STAT_CHECK_CONDITION &&
1633 (c->err_info->SenseInfo[2] == NO_SENSE ||
1634 c->err_info->SenseInfo[2] == UNIT_ATTENTION))
1635 break;
1636
1637 printk(KERN_WARNING "cciss%d: Waiting %d secs "
1638 "for device to become ready.\n",
1639 h->ctlr, waittime / HZ);
1640 rc = 1; /* device not ready. */
1641 }
1642
1643 if (rc)
1644 printk("cciss%d: giving up on device.\n", h->ctlr);
1645 else
1646 printk(KERN_WARNING "cciss%d: device is ready.\n", h->ctlr);
1647
1648 cmd_free(h, c, 1);
1649 return rc;
1650}
89b6e743 1651
3da8b713 1652/* Need at least one of these error handlers to keep ../scsi/hosts.c from
1653 * complaining. Doing a host- or bus-reset can't do anything good here.
1654 * Despite what it might say in scsi_error.c, there may well be commands
1655 * on the controller, as the cciss driver registers twice, once as a block
1656 * device for the logical drives, and once as a scsi device, for any tape
1657 * drives. So we know there are no commands out on the tape drives, but we
1658 * don't know there are no commands on the controller, and it is likely
1659 * that there probably are, as the cciss block device is most commonly used
1660 * as a boot device (embedded controller on HP/Compaq systems.)
1661*/
1662
1663static int cciss_eh_device_reset_handler(struct scsi_cmnd *scsicmd)
1664{
1665 int rc;
1666 CommandList_struct *cmd_in_trouble;
88f627ae 1667 unsigned char lunaddr[8];
3da8b713 1668 ctlr_info_t **c;
1669 int ctlr;
1670
1671 /* find the controller to which the command to be aborted was sent */
1672 c = (ctlr_info_t **) &scsicmd->device->host->hostdata[0];
1673 if (c == NULL) /* paranoia */
1674 return FAILED;
1675 ctlr = (*c)->ctlr;
1676 printk(KERN_WARNING "cciss%d: resetting tape drive or medium changer.\n", ctlr);
3da8b713 1677 /* find the command that's giving us trouble */
1678 cmd_in_trouble = (CommandList_struct *) scsicmd->host_scribble;
88f627ae 1679 if (cmd_in_trouble == NULL) /* paranoia */
3da8b713 1680 return FAILED;
88f627ae 1681 memcpy(lunaddr, &cmd_in_trouble->Header.LUN.LunAddrBytes[0], 8);
3da8b713 1682 /* send a reset to the SCSI LUN which the command was sent to */
88f627ae 1683 rc = sendcmd(CCISS_RESET_MSG, ctlr, NULL, 0, 2, 0, 0, lunaddr,
3da8b713 1684 TYPE_MSG);
f66083c3 1685 /* sendcmd turned off interrupts on the board, turn 'em back on. */
3da8b713 1686 (*c)->access.set_intr_mask(*c, CCISS_INTR_ON);
88f627ae 1687 if (rc == 0 && wait_for_device_to_become_ready(*c, lunaddr) == 0)
3da8b713 1688 return SUCCESS;
1689 printk(KERN_WARNING "cciss%d: resetting device failed.\n", ctlr);
1690 return FAILED;
1691}
1692
1693static int cciss_eh_abort_handler(struct scsi_cmnd *scsicmd)
1694{
1695 int rc;
1696 CommandList_struct *cmd_to_abort;
1697 ctlr_info_t **c;
1698 int ctlr;
1699
1700 /* find the controller to which the command to be aborted was sent */
1701 c = (ctlr_info_t **) &scsicmd->device->host->hostdata[0];
1702 if (c == NULL) /* paranoia */
1703 return FAILED;
1704 ctlr = (*c)->ctlr;
1705 printk(KERN_WARNING "cciss%d: aborting tardy SCSI cmd\n", ctlr);
1706
1707 /* find the command to be aborted */
1708 cmd_to_abort = (CommandList_struct *) scsicmd->host_scribble;
1709 if (cmd_to_abort == NULL) /* paranoia */
1710 return FAILED;
1711 rc = sendcmd(CCISS_ABORT_MSG, ctlr, &cmd_to_abort->Header.Tag,
1712 0, 2, 0, 0,
1713 (unsigned char *) &cmd_to_abort->Header.LUN.LunAddrBytes[0],
1714 TYPE_MSG);
f66083c3 1715 /* sendcmd turned off interrupts on the board, turn 'em back on. */
3da8b713 1716 (*c)->access.set_intr_mask(*c, CCISS_INTR_ON);
1717 if (rc == 0)
1718 return SUCCESS;
1719 return FAILED;
1720
1721}
1722
1da177e4
LT
1723#else /* no CONFIG_CISS_SCSI_TAPE */
1724
1725/* If no tape support, then these become defined out of existence */
1726
1727#define cciss_scsi_setup(cntl_num)
1da177e4
LT
1728
1729#endif /* CONFIG_CISS_SCSI_TAPE */