xref: /linux/drivers/scsi/3w-9xxx.c (revision 858259cf7d1c443c836a2022b78cb281f0a9b95e)
1 /*
2    3w-9xxx.c -- 3ware 9000 Storage Controller device driver for Linux.
3 
4    Written By: Adam Radford <linuxraid@amcc.com>
5 
6    Copyright (C) 2004-2005 Applied Micro Circuits Corporation.
7 
8    This program is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; version 2 of the License.
11 
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16 
17    NO WARRANTY
18    THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR
19    CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT
20    LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
21    MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is
22    solely responsible for determining the appropriateness of using and
23    distributing the Program and assumes all risks associated with its
24    exercise of rights under this Agreement, including but not limited to
25    the risks and costs of program errors, damage to or loss of data,
26    programs or equipment, and unavailability or interruption of operations.
27 
28    DISCLAIMER OF LIABILITY
29    NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY
30    DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
31    DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND
32    ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
33    TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
34    USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
35    HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES
36 
37    You should have received a copy of the GNU General Public License
38    along with this program; if not, write to the Free Software
39    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
40 
41    Bugs/Comments/Suggestions should be mailed to:
42    linuxraid@amcc.com
43 
44    For more information, goto:
45    http://www.amcc.com
46 
47    Note: This version of the driver does not contain a bundled firmware
48          image.
49 
50    History
51    -------
52    2.26.02.000 - Driver cleanup for kernel submission.
53    2.26.02.001 - Replace schedule_timeout() calls with msleep().
54    2.26.02.002 - Add support for PAE mode.
55                  Add lun support.
56                  Fix twa_remove() to free irq handler/unregister_chrdev()
57                  before shutting down card.
58                  Change to new 'change_queue_depth' api.
59                  Fix 'handled=1' ISR usage, remove bogus IRQ check.
60                  Remove un-needed eh_abort handler.
61                  Add support for embedded firmware error strings.
62    2.26.02.003 - Correctly handle single sgl's with use_sg=1.
63    2.26.02.004 - Add support for 9550SX controllers.
64 */
65 
66 #include <linux/module.h>
67 #include <linux/reboot.h>
68 #include <linux/spinlock.h>
69 #include <linux/interrupt.h>
70 #include <linux/moduleparam.h>
71 #include <linux/errno.h>
72 #include <linux/types.h>
73 #include <linux/delay.h>
74 #include <linux/pci.h>
75 #include <linux/time.h>
76 #include <asm/io.h>
77 #include <asm/irq.h>
78 #include <asm/uaccess.h>
79 #include <scsi/scsi.h>
80 #include <scsi/scsi_host.h>
81 #include <scsi/scsi_tcq.h>
82 #include <scsi/scsi_cmnd.h>
83 #include "3w-9xxx.h"
84 
85 /* Globals */
86 #define TW_DRIVER_VERSION "2.26.02.004"
87 static TW_Device_Extension *twa_device_extension_list[TW_MAX_SLOT];
88 static unsigned int twa_device_extension_count;
89 static int twa_major = -1;
90 extern struct timezone sys_tz;
91 
92 /* Module parameters */
93 MODULE_AUTHOR ("AMCC");
94 MODULE_DESCRIPTION ("3ware 9000 Storage Controller Linux Driver");
95 MODULE_LICENSE("GPL");
96 MODULE_VERSION(TW_DRIVER_VERSION);
97 
98 /* Function prototypes */
99 static void twa_aen_queue_event(TW_Device_Extension *tw_dev, TW_Command_Apache_Header *header);
100 static int twa_aen_read_queue(TW_Device_Extension *tw_dev, int request_id);
101 static char *twa_aen_severity_lookup(unsigned char severity_code);
102 static void twa_aen_sync_time(TW_Device_Extension *tw_dev, int request_id);
103 static int twa_chrdev_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg);
104 static int twa_chrdev_open(struct inode *inode, struct file *file);
105 static int twa_fill_sense(TW_Device_Extension *tw_dev, int request_id, int copy_sense, int print_host);
106 static void twa_free_request_id(TW_Device_Extension *tw_dev,int request_id);
107 static void twa_get_request_id(TW_Device_Extension *tw_dev, int *request_id);
108 static int twa_initconnection(TW_Device_Extension *tw_dev, int message_credits,
109  			      u32 set_features, unsigned short current_fw_srl,
110 			      unsigned short current_fw_arch_id,
111 			      unsigned short current_fw_branch,
112 			      unsigned short current_fw_build,
113 			      unsigned short *fw_on_ctlr_srl,
114 			      unsigned short *fw_on_ctlr_arch_id,
115 			      unsigned short *fw_on_ctlr_branch,
116 			      unsigned short *fw_on_ctlr_build,
117 			      u32 *init_connect_result);
118 static void twa_load_sgl(TW_Command_Full *full_command_packet, int request_id, dma_addr_t dma_handle, int length);
119 static int twa_poll_response(TW_Device_Extension *tw_dev, int request_id, int seconds);
120 static int twa_poll_status_gone(TW_Device_Extension *tw_dev, u32 flag, int seconds);
121 static int twa_post_command_packet(TW_Device_Extension *tw_dev, int request_id, char internal);
122 static int twa_reset_device_extension(TW_Device_Extension *tw_dev, int ioctl_reset);
123 static int twa_reset_sequence(TW_Device_Extension *tw_dev, int soft_reset);
124 static int twa_scsiop_execute_scsi(TW_Device_Extension *tw_dev, int request_id, char *cdb, int use_sg, TW_SG_Entry *sglistarg);
125 static void twa_scsiop_execute_scsi_complete(TW_Device_Extension *tw_dev, int request_id);
126 static char *twa_string_lookup(twa_message_type *table, unsigned int aen_code);
127 static void twa_unmap_scsi_data(TW_Device_Extension *tw_dev, int request_id);
128 
129 /* Functions */
130 
131 /* Show some statistics about the card */
132 static ssize_t twa_show_stats(struct class_device *class_dev, char *buf)
133 {
134 	struct Scsi_Host *host = class_to_shost(class_dev);
135 	TW_Device_Extension *tw_dev = (TW_Device_Extension *)host->hostdata;
136 	unsigned long flags = 0;
137 	ssize_t len;
138 
139 	spin_lock_irqsave(tw_dev->host->host_lock, flags);
140 	len = snprintf(buf, PAGE_SIZE, "3w-9xxx Driver version: %s\n"
141 		       "Current commands posted:   %4d\n"
142 		       "Max commands posted:       %4d\n"
143 		       "Current pending commands:  %4d\n"
144 		       "Max pending commands:      %4d\n"
145 		       "Last sgl length:           %4d\n"
146 		       "Max sgl length:            %4d\n"
147 		       "Last sector count:         %4d\n"
148 		       "Max sector count:          %4d\n"
149 		       "SCSI Host Resets:          %4d\n"
150 		       "AEN's:                     %4d\n",
151 		       TW_DRIVER_VERSION,
152 		       tw_dev->posted_request_count,
153 		       tw_dev->max_posted_request_count,
154 		       tw_dev->pending_request_count,
155 		       tw_dev->max_pending_request_count,
156 		       tw_dev->sgl_entries,
157 		       tw_dev->max_sgl_entries,
158 		       tw_dev->sector_count,
159 		       tw_dev->max_sector_count,
160 		       tw_dev->num_resets,
161 		       tw_dev->aen_count);
162 	spin_unlock_irqrestore(tw_dev->host->host_lock, flags);
163 	return len;
164 } /* End twa_show_stats() */
165 
166 /* This function will set a devices queue depth */
167 static int twa_change_queue_depth(struct scsi_device *sdev, int queue_depth)
168 {
169 	if (queue_depth > TW_Q_LENGTH-2)
170 		queue_depth = TW_Q_LENGTH-2;
171 	scsi_adjust_queue_depth(sdev, MSG_ORDERED_TAG, queue_depth);
172 	return queue_depth;
173 } /* End twa_change_queue_depth() */
174 
175 /* Create sysfs 'stats' entry */
176 static struct class_device_attribute twa_host_stats_attr = {
177 	.attr = {
178 		.name = 	"stats",
179 		.mode =		S_IRUGO,
180 	},
181 	.show = twa_show_stats
182 };
183 
184 /* Host attributes initializer */
185 static struct class_device_attribute *twa_host_attrs[] = {
186 	&twa_host_stats_attr,
187 	NULL,
188 };
189 
190 /* File operations struct for character device */
191 static struct file_operations twa_fops = {
192 	.owner		= THIS_MODULE,
193 	.ioctl		= twa_chrdev_ioctl,
194 	.open		= twa_chrdev_open,
195 	.release	= NULL
196 };
197 
198 /* This function will complete an aen request from the isr */
199 static int twa_aen_complete(TW_Device_Extension *tw_dev, int request_id)
200 {
201 	TW_Command_Full *full_command_packet;
202 	TW_Command *command_packet;
203 	TW_Command_Apache_Header *header;
204 	unsigned short aen;
205 	int retval = 1;
206 
207 	header = (TW_Command_Apache_Header *)tw_dev->generic_buffer_virt[request_id];
208 	tw_dev->posted_request_count--;
209 	aen = header->status_block.error;
210 	full_command_packet = tw_dev->command_packet_virt[request_id];
211 	command_packet = &full_command_packet->command.oldcommand;
212 
213 	/* First check for internal completion of set param for time sync */
214 	if (TW_OP_OUT(command_packet->opcode__sgloffset) == TW_OP_SET_PARAM) {
215 		/* Keep reading the queue in case there are more aen's */
216 		if (twa_aen_read_queue(tw_dev, request_id))
217 			goto out2;
218 	        else {
219 			retval = 0;
220 			goto out;
221 		}
222 	}
223 
224 	switch (aen) {
225 	case TW_AEN_QUEUE_EMPTY:
226 		/* Quit reading the queue if this is the last one */
227 		break;
228 	case TW_AEN_SYNC_TIME_WITH_HOST:
229 		twa_aen_sync_time(tw_dev, request_id);
230 		retval = 0;
231 		goto out;
232 	default:
233 		twa_aen_queue_event(tw_dev, header);
234 
235 		/* If there are more aen's, keep reading the queue */
236 		if (twa_aen_read_queue(tw_dev, request_id))
237 			goto out2;
238 		else {
239 			retval = 0;
240 			goto out;
241 		}
242 	}
243 	retval = 0;
244 out2:
245 	tw_dev->state[request_id] = TW_S_COMPLETED;
246 	twa_free_request_id(tw_dev, request_id);
247 	clear_bit(TW_IN_ATTENTION_LOOP, &tw_dev->flags);
248 out:
249 	return retval;
250 } /* End twa_aen_complete() */
251 
252 /* This function will drain aen queue */
253 static int twa_aen_drain_queue(TW_Device_Extension *tw_dev, int no_check_reset)
254 {
255 	int request_id = 0;
256 	char cdb[TW_MAX_CDB_LEN];
257 	TW_SG_Entry sglist[1];
258 	int finished = 0, count = 0;
259 	TW_Command_Full *full_command_packet;
260 	TW_Command_Apache_Header *header;
261 	unsigned short aen;
262 	int first_reset = 0, queue = 0, retval = 1;
263 
264 	if (no_check_reset)
265 		first_reset = 0;
266 	else
267 		first_reset = 1;
268 
269 	full_command_packet = tw_dev->command_packet_virt[request_id];
270 	memset(full_command_packet, 0, sizeof(TW_Command_Full));
271 
272 	/* Initialize cdb */
273 	memset(&cdb, 0, TW_MAX_CDB_LEN);
274 	cdb[0] = REQUEST_SENSE; /* opcode */
275 	cdb[4] = TW_ALLOCATION_LENGTH; /* allocation length */
276 
277 	/* Initialize sglist */
278 	memset(&sglist, 0, sizeof(TW_SG_Entry));
279 	sglist[0].length = TW_SECTOR_SIZE;
280 	sglist[0].address = tw_dev->generic_buffer_phys[request_id];
281 
282 	if (sglist[0].address & TW_ALIGNMENT_9000_SGL) {
283 		TW_PRINTK(tw_dev->host, TW_DRIVER, 0x1, "Found unaligned address during AEN drain");
284 		goto out;
285 	}
286 
287 	/* Mark internal command */
288 	tw_dev->srb[request_id] = NULL;
289 
290 	do {
291 		/* Send command to the board */
292 		if (twa_scsiop_execute_scsi(tw_dev, request_id, cdb, 1, sglist)) {
293 			TW_PRINTK(tw_dev->host, TW_DRIVER, 0x2, "Error posting request sense");
294 			goto out;
295 		}
296 
297 		/* Now poll for completion */
298 		if (twa_poll_response(tw_dev, request_id, 30)) {
299 			TW_PRINTK(tw_dev->host, TW_DRIVER, 0x3, "No valid response while draining AEN queue");
300 			tw_dev->posted_request_count--;
301 			goto out;
302 		}
303 
304 		tw_dev->posted_request_count--;
305 		header = (TW_Command_Apache_Header *)tw_dev->generic_buffer_virt[request_id];
306 		aen = header->status_block.error;
307 		queue = 0;
308 		count++;
309 
310 		switch (aen) {
311 		case TW_AEN_QUEUE_EMPTY:
312 			if (first_reset != 1)
313 				goto out;
314 			else
315 				finished = 1;
316 			break;
317 		case TW_AEN_SOFT_RESET:
318 			if (first_reset == 0)
319 				first_reset = 1;
320 			else
321 				queue = 1;
322 			break;
323 		case TW_AEN_SYNC_TIME_WITH_HOST:
324 			break;
325 		default:
326 			queue = 1;
327 		}
328 
329 		/* Now queue an event info */
330 		if (queue)
331 			twa_aen_queue_event(tw_dev, header);
332 	} while ((finished == 0) && (count < TW_MAX_AEN_DRAIN));
333 
334 	if (count == TW_MAX_AEN_DRAIN)
335 		goto out;
336 
337 	retval = 0;
338 out:
339 	tw_dev->state[request_id] = TW_S_INITIAL;
340 	return retval;
341 } /* End twa_aen_drain_queue() */
342 
343 /* This function will queue an event */
344 static void twa_aen_queue_event(TW_Device_Extension *tw_dev, TW_Command_Apache_Header *header)
345 {
346 	u32 local_time;
347 	struct timeval time;
348 	TW_Event *event;
349 	unsigned short aen;
350 	char host[16];
351 	char *error_str;
352 
353 	tw_dev->aen_count++;
354 
355 	/* Fill out event info */
356 	event = tw_dev->event_queue[tw_dev->error_index];
357 
358 	/* Check for clobber */
359 	host[0] = '\0';
360 	if (tw_dev->host) {
361 		sprintf(host, " scsi%d:", tw_dev->host->host_no);
362 		if (event->retrieved == TW_AEN_NOT_RETRIEVED)
363 			tw_dev->aen_clobber = 1;
364 	}
365 
366 	aen = header->status_block.error;
367 	memset(event, 0, sizeof(TW_Event));
368 
369 	event->severity = TW_SEV_OUT(header->status_block.severity__reserved);
370 	do_gettimeofday(&time);
371 	local_time = (u32)(time.tv_sec - (sys_tz.tz_minuteswest * 60));
372 	event->time_stamp_sec = local_time;
373 	event->aen_code = aen;
374 	event->retrieved = TW_AEN_NOT_RETRIEVED;
375 	event->sequence_id = tw_dev->error_sequence_id;
376 	tw_dev->error_sequence_id++;
377 
378 	/* Check for embedded error string */
379 	error_str = &(header->err_specific_desc[strlen(header->err_specific_desc)+1]);
380 
381 	header->err_specific_desc[sizeof(header->err_specific_desc) - 1] = '\0';
382 	event->parameter_len = strlen(header->err_specific_desc);
383 	memcpy(event->parameter_data, header->err_specific_desc, event->parameter_len);
384 	if (event->severity != TW_AEN_SEVERITY_DEBUG)
385 		printk(KERN_WARNING "3w-9xxx:%s AEN: %s (0x%02X:0x%04X): %s:%s.\n",
386 		       host,
387 		       twa_aen_severity_lookup(TW_SEV_OUT(header->status_block.severity__reserved)),
388 		       TW_MESSAGE_SOURCE_CONTROLLER_EVENT, aen,
389 		       error_str[0] == '\0' ? twa_string_lookup(twa_aen_table, aen) : error_str,
390 		       header->err_specific_desc);
391 	else
392 		tw_dev->aen_count--;
393 
394 	if ((tw_dev->error_index + 1) == TW_Q_LENGTH)
395 		tw_dev->event_queue_wrapped = 1;
396 	tw_dev->error_index = (tw_dev->error_index + 1 ) % TW_Q_LENGTH;
397 } /* End twa_aen_queue_event() */
398 
399 /* This function will read the aen queue from the isr */
400 static int twa_aen_read_queue(TW_Device_Extension *tw_dev, int request_id)
401 {
402 	char cdb[TW_MAX_CDB_LEN];
403 	TW_SG_Entry sglist[1];
404 	TW_Command_Full *full_command_packet;
405 	int retval = 1;
406 
407 	full_command_packet = tw_dev->command_packet_virt[request_id];
408 	memset(full_command_packet, 0, sizeof(TW_Command_Full));
409 
410 	/* Initialize cdb */
411 	memset(&cdb, 0, TW_MAX_CDB_LEN);
412 	cdb[0] = REQUEST_SENSE; /* opcode */
413 	cdb[4] = TW_ALLOCATION_LENGTH; /* allocation length */
414 
415 	/* Initialize sglist */
416 	memset(&sglist, 0, sizeof(TW_SG_Entry));
417 	sglist[0].length = TW_SECTOR_SIZE;
418 	sglist[0].address = tw_dev->generic_buffer_phys[request_id];
419 
420 	/* Mark internal command */
421 	tw_dev->srb[request_id] = NULL;
422 
423 	/* Now post the command packet */
424 	if (twa_scsiop_execute_scsi(tw_dev, request_id, cdb, 1, sglist)) {
425 		TW_PRINTK(tw_dev->host, TW_DRIVER, 0x4, "Post failed while reading AEN queue");
426 		goto out;
427 	}
428 	retval = 0;
429 out:
430 	return retval;
431 } /* End twa_aen_read_queue() */
432 
433 /* This function will look up an AEN severity string */
434 static char *twa_aen_severity_lookup(unsigned char severity_code)
435 {
436 	char *retval = NULL;
437 
438 	if ((severity_code < (unsigned char) TW_AEN_SEVERITY_ERROR) ||
439 	    (severity_code > (unsigned char) TW_AEN_SEVERITY_DEBUG))
440 		goto out;
441 
442 	retval = twa_aen_severity_table[severity_code];
443 out:
444 	return retval;
445 } /* End twa_aen_severity_lookup() */
446 
447 /* This function will sync firmware time with the host time */
448 static void twa_aen_sync_time(TW_Device_Extension *tw_dev, int request_id)
449 {
450 	u32 schedulertime;
451 	struct timeval utc;
452 	TW_Command_Full *full_command_packet;
453 	TW_Command *command_packet;
454 	TW_Param_Apache *param;
455 	u32 local_time;
456 
457 	/* Fill out the command packet */
458 	full_command_packet = tw_dev->command_packet_virt[request_id];
459 	memset(full_command_packet, 0, sizeof(TW_Command_Full));
460 	command_packet = &full_command_packet->command.oldcommand;
461 	command_packet->opcode__sgloffset = TW_OPSGL_IN(2, TW_OP_SET_PARAM);
462 	command_packet->request_id = request_id;
463 	command_packet->byte8_offset.param.sgl[0].address = tw_dev->generic_buffer_phys[request_id];
464 	command_packet->byte8_offset.param.sgl[0].length = TW_SECTOR_SIZE;
465 	command_packet->size = TW_COMMAND_SIZE;
466 	command_packet->byte6_offset.parameter_count = 1;
467 
468 	/* Setup the param */
469 	param = (TW_Param_Apache *)tw_dev->generic_buffer_virt[request_id];
470 	memset(param, 0, TW_SECTOR_SIZE);
471 	param->table_id = TW_TIMEKEEP_TABLE | 0x8000; /* Controller time keep table */
472 	param->parameter_id = 0x3; /* SchedulerTime */
473 	param->parameter_size_bytes = 4;
474 
475 	/* Convert system time in UTC to local time seconds since last
476            Sunday 12:00AM */
477 	do_gettimeofday(&utc);
478 	local_time = (u32)(utc.tv_sec - (sys_tz.tz_minuteswest * 60));
479 	schedulertime = local_time - (3 * 86400);
480 	schedulertime = schedulertime % 604800;
481 
482 	memcpy(param->data, &schedulertime, sizeof(u32));
483 
484 	/* Mark internal command */
485 	tw_dev->srb[request_id] = NULL;
486 
487 	/* Now post the command */
488 	twa_post_command_packet(tw_dev, request_id, 1);
489 } /* End twa_aen_sync_time() */
490 
491 /* This function will allocate memory and check if it is correctly aligned */
492 static int twa_allocate_memory(TW_Device_Extension *tw_dev, int size, int which)
493 {
494 	int i;
495 	dma_addr_t dma_handle;
496 	unsigned long *cpu_addr;
497 	int retval = 1;
498 
499 	cpu_addr = pci_alloc_consistent(tw_dev->tw_pci_dev, size*TW_Q_LENGTH, &dma_handle);
500 	if (!cpu_addr) {
501 		TW_PRINTK(tw_dev->host, TW_DRIVER, 0x5, "Memory allocation failed");
502 		goto out;
503 	}
504 
505 	if ((unsigned long)cpu_addr % (TW_ALIGNMENT_9000)) {
506 		TW_PRINTK(tw_dev->host, TW_DRIVER, 0x6, "Failed to allocate correctly aligned memory");
507 		pci_free_consistent(tw_dev->tw_pci_dev, size*TW_Q_LENGTH, cpu_addr, dma_handle);
508 		goto out;
509 	}
510 
511 	memset(cpu_addr, 0, size*TW_Q_LENGTH);
512 
513 	for (i = 0; i < TW_Q_LENGTH; i++) {
514 		switch(which) {
515 		case 0:
516 			tw_dev->command_packet_phys[i] = dma_handle+(i*size);
517 			tw_dev->command_packet_virt[i] = (TW_Command_Full *)((unsigned char *)cpu_addr + (i*size));
518 			break;
519 		case 1:
520 			tw_dev->generic_buffer_phys[i] = dma_handle+(i*size);
521 			tw_dev->generic_buffer_virt[i] = (unsigned long *)((unsigned char *)cpu_addr + (i*size));
522 			break;
523 		}
524 	}
525 	retval = 0;
526 out:
527 	return retval;
528 } /* End twa_allocate_memory() */
529 
530 /* This function will check the status register for unexpected bits */
531 static int twa_check_bits(u32 status_reg_value)
532 {
533 	int retval = 1;
534 
535 	if ((status_reg_value & TW_STATUS_EXPECTED_BITS) != TW_STATUS_EXPECTED_BITS)
536 		goto out;
537 	if ((status_reg_value & TW_STATUS_UNEXPECTED_BITS) != 0)
538 		goto out;
539 
540 	retval = 0;
541 out:
542 	return retval;
543 } /* End twa_check_bits() */
544 
545 /* This function will check the srl and decide if we are compatible  */
546 static int twa_check_srl(TW_Device_Extension *tw_dev, int *flashed)
547 {
548 	int retval = 1;
549 	unsigned short fw_on_ctlr_srl = 0, fw_on_ctlr_arch_id = 0;
550 	unsigned short fw_on_ctlr_branch = 0, fw_on_ctlr_build = 0;
551 	u32 init_connect_result = 0;
552 
553 	if (twa_initconnection(tw_dev, TW_INIT_MESSAGE_CREDITS,
554 			       TW_EXTENDED_INIT_CONNECT, TW_CURRENT_DRIVER_SRL,
555 			       TW_9000_ARCH_ID, TW_CURRENT_DRIVER_BRANCH,
556 			       TW_CURRENT_DRIVER_BUILD, &fw_on_ctlr_srl,
557 			       &fw_on_ctlr_arch_id, &fw_on_ctlr_branch,
558 			       &fw_on_ctlr_build, &init_connect_result)) {
559 		TW_PRINTK(tw_dev->host, TW_DRIVER, 0x7, "Initconnection failed while checking SRL");
560 		goto out;
561 	}
562 
563 	tw_dev->working_srl = fw_on_ctlr_srl;
564 	tw_dev->working_branch = fw_on_ctlr_branch;
565 	tw_dev->working_build = fw_on_ctlr_build;
566 
567 	/* Try base mode compatibility */
568 	if (!(init_connect_result & TW_CTLR_FW_COMPATIBLE)) {
569 		if (twa_initconnection(tw_dev, TW_INIT_MESSAGE_CREDITS,
570 				       TW_EXTENDED_INIT_CONNECT,
571 				       TW_BASE_FW_SRL, TW_9000_ARCH_ID,
572 				       TW_BASE_FW_BRANCH, TW_BASE_FW_BUILD,
573 				       &fw_on_ctlr_srl, &fw_on_ctlr_arch_id,
574 				       &fw_on_ctlr_branch, &fw_on_ctlr_build,
575 				       &init_connect_result)) {
576 			TW_PRINTK(tw_dev->host, TW_DRIVER, 0xa, "Initconnection (base mode) failed while checking SRL");
577 			goto out;
578 		}
579 		if (!(init_connect_result & TW_CTLR_FW_COMPATIBLE)) {
580 			if (TW_CURRENT_DRIVER_SRL > fw_on_ctlr_srl) {
581 				TW_PRINTK(tw_dev->host, TW_DRIVER, 0x32, "Firmware and driver incompatibility: please upgrade firmware");
582 			} else {
583 				TW_PRINTK(tw_dev->host, TW_DRIVER, 0x33, "Firmware and driver incompatibility: please upgrade driver");
584 			}
585 			goto out;
586 		}
587 		tw_dev->working_srl = TW_BASE_FW_SRL;
588 		tw_dev->working_branch = TW_BASE_FW_BRANCH;
589 		tw_dev->working_build = TW_BASE_FW_BUILD;
590 	}
591 	retval = 0;
592 out:
593 	return retval;
594 } /* End twa_check_srl() */
595 
596 /* This function handles ioctl for the character device */
597 static int twa_chrdev_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
598 {
599 	long timeout;
600 	unsigned long *cpu_addr, data_buffer_length_adjusted = 0, flags = 0;
601 	dma_addr_t dma_handle;
602 	int request_id = 0;
603 	unsigned int sequence_id = 0;
604 	unsigned char event_index, start_index;
605 	TW_Ioctl_Driver_Command driver_command;
606 	TW_Ioctl_Buf_Apache *tw_ioctl;
607 	TW_Lock *tw_lock;
608 	TW_Command_Full *full_command_packet;
609 	TW_Compatibility_Info *tw_compat_info;
610 	TW_Event *event;
611 	struct timeval current_time;
612 	u32 current_time_ms;
613 	TW_Device_Extension *tw_dev = twa_device_extension_list[iminor(inode)];
614 	int retval = TW_IOCTL_ERROR_OS_EFAULT;
615 	void __user *argp = (void __user *)arg;
616 
617 	/* Only let one of these through at a time */
618 	if (down_interruptible(&tw_dev->ioctl_sem)) {
619 		retval = TW_IOCTL_ERROR_OS_EINTR;
620 		goto out;
621 	}
622 
623 	/* First copy down the driver command */
624 	if (copy_from_user(&driver_command, argp, sizeof(TW_Ioctl_Driver_Command)))
625 		goto out2;
626 
627 	/* Check data buffer size */
628 	if (driver_command.buffer_length > TW_MAX_SECTORS * 512) {
629 		retval = TW_IOCTL_ERROR_OS_EINVAL;
630 		goto out2;
631 	}
632 
633 	/* Hardware can only do multiple of 512 byte transfers */
634 	data_buffer_length_adjusted = (driver_command.buffer_length + 511) & ~511;
635 
636 	/* Now allocate ioctl buf memory */
637 	cpu_addr = dma_alloc_coherent(&tw_dev->tw_pci_dev->dev, data_buffer_length_adjusted+sizeof(TW_Ioctl_Buf_Apache) - 1, &dma_handle, GFP_KERNEL);
638 	if (!cpu_addr) {
639 		retval = TW_IOCTL_ERROR_OS_ENOMEM;
640 		goto out2;
641 	}
642 
643 	tw_ioctl = (TW_Ioctl_Buf_Apache *)cpu_addr;
644 
645 	/* Now copy down the entire ioctl */
646 	if (copy_from_user(tw_ioctl, argp, driver_command.buffer_length + sizeof(TW_Ioctl_Buf_Apache) - 1))
647 		goto out3;
648 
649 	/* See which ioctl we are doing */
650 	switch (cmd) {
651 	case TW_IOCTL_FIRMWARE_PASS_THROUGH:
652 		spin_lock_irqsave(tw_dev->host->host_lock, flags);
653 		twa_get_request_id(tw_dev, &request_id);
654 
655 		/* Flag internal command */
656 		tw_dev->srb[request_id] = NULL;
657 
658 		/* Flag chrdev ioctl */
659 		tw_dev->chrdev_request_id = request_id;
660 
661 		full_command_packet = &tw_ioctl->firmware_command;
662 
663 		/* Load request id and sglist for both command types */
664 		twa_load_sgl(full_command_packet, request_id, dma_handle, data_buffer_length_adjusted);
665 
666 		memcpy(tw_dev->command_packet_virt[request_id], &(tw_ioctl->firmware_command), sizeof(TW_Command_Full));
667 
668 		/* Now post the command packet to the controller */
669 		twa_post_command_packet(tw_dev, request_id, 1);
670 		spin_unlock_irqrestore(tw_dev->host->host_lock, flags);
671 
672 		timeout = TW_IOCTL_CHRDEV_TIMEOUT*HZ;
673 
674 		/* Now wait for command to complete */
675 		timeout = wait_event_timeout(tw_dev->ioctl_wqueue, tw_dev->chrdev_request_id == TW_IOCTL_CHRDEV_FREE, timeout);
676 
677 		/* See if we reset while waiting for the ioctl to complete */
678 		if (test_bit(TW_IN_RESET, &tw_dev->flags)) {
679 			clear_bit(TW_IN_RESET, &tw_dev->flags);
680 			retval = TW_IOCTL_ERROR_OS_ERESTARTSYS;
681 			goto out3;
682 		}
683 
684 		/* We timed out, and didn't get an interrupt */
685 		if (tw_dev->chrdev_request_id != TW_IOCTL_CHRDEV_FREE) {
686 			/* Now we need to reset the board */
687 			printk(KERN_WARNING "3w-9xxx: scsi%d: WARNING: (0x%02X:0x%04X): Character ioctl (0x%x) timed out, resetting card.\n",
688 			       tw_dev->host->host_no, TW_DRIVER, 0xc,
689 			       cmd);
690 			retval = TW_IOCTL_ERROR_OS_EIO;
691 			spin_lock_irqsave(tw_dev->host->host_lock, flags);
692 			tw_dev->state[request_id] = TW_S_COMPLETED;
693 			twa_free_request_id(tw_dev, request_id);
694 			tw_dev->posted_request_count--;
695 			spin_unlock_irqrestore(tw_dev->host->host_lock, flags);
696 			twa_reset_device_extension(tw_dev, 1);
697 			goto out3;
698 		}
699 
700 		/* Now copy in the command packet response */
701 		memcpy(&(tw_ioctl->firmware_command), tw_dev->command_packet_virt[request_id], sizeof(TW_Command_Full));
702 
703 		/* Now complete the io */
704 		spin_lock_irqsave(tw_dev->host->host_lock, flags);
705 		tw_dev->posted_request_count--;
706 		tw_dev->state[request_id] = TW_S_COMPLETED;
707 		twa_free_request_id(tw_dev, request_id);
708 		spin_unlock_irqrestore(tw_dev->host->host_lock, flags);
709 		break;
710 	case TW_IOCTL_GET_COMPATIBILITY_INFO:
711 		tw_ioctl->driver_command.status = 0;
712 		/* Copy compatiblity struct into ioctl data buffer */
713 		tw_compat_info = (TW_Compatibility_Info *)tw_ioctl->data_buffer;
714 		strncpy(tw_compat_info->driver_version, TW_DRIVER_VERSION, strlen(TW_DRIVER_VERSION));
715 		tw_compat_info->working_srl = tw_dev->working_srl;
716 		tw_compat_info->working_branch = tw_dev->working_branch;
717 		tw_compat_info->working_build = tw_dev->working_build;
718 		tw_compat_info->driver_srl_high = TW_CURRENT_DRIVER_SRL;
719 		tw_compat_info->driver_branch_high = TW_CURRENT_DRIVER_BRANCH;
720 		tw_compat_info->driver_build_high = TW_CURRENT_DRIVER_BUILD;
721 		tw_compat_info->driver_srl_low = TW_BASE_FW_SRL;
722 		tw_compat_info->driver_branch_low = TW_BASE_FW_BRANCH;
723 		tw_compat_info->driver_build_low = TW_BASE_FW_BUILD;
724 		break;
725 	case TW_IOCTL_GET_LAST_EVENT:
726 		if (tw_dev->event_queue_wrapped) {
727 			if (tw_dev->aen_clobber) {
728 				tw_ioctl->driver_command.status = TW_IOCTL_ERROR_STATUS_AEN_CLOBBER;
729 				tw_dev->aen_clobber = 0;
730 			} else
731 				tw_ioctl->driver_command.status = 0;
732 		} else {
733 			if (!tw_dev->error_index) {
734 				tw_ioctl->driver_command.status = TW_IOCTL_ERROR_STATUS_NO_MORE_EVENTS;
735 				break;
736 			}
737 			tw_ioctl->driver_command.status = 0;
738 		}
739 		event_index = (tw_dev->error_index - 1 + TW_Q_LENGTH) % TW_Q_LENGTH;
740 		memcpy(tw_ioctl->data_buffer, tw_dev->event_queue[event_index], sizeof(TW_Event));
741 		tw_dev->event_queue[event_index]->retrieved = TW_AEN_RETRIEVED;
742 		break;
743 	case TW_IOCTL_GET_FIRST_EVENT:
744 		if (tw_dev->event_queue_wrapped) {
745 			if (tw_dev->aen_clobber) {
746 				tw_ioctl->driver_command.status = TW_IOCTL_ERROR_STATUS_AEN_CLOBBER;
747 				tw_dev->aen_clobber = 0;
748 			} else
749 				tw_ioctl->driver_command.status = 0;
750 			event_index = tw_dev->error_index;
751 		} else {
752 			if (!tw_dev->error_index) {
753 				tw_ioctl->driver_command.status = TW_IOCTL_ERROR_STATUS_NO_MORE_EVENTS;
754 				break;
755 			}
756 			tw_ioctl->driver_command.status = 0;
757 			event_index = 0;
758 		}
759 		memcpy(tw_ioctl->data_buffer, tw_dev->event_queue[event_index], sizeof(TW_Event));
760 		tw_dev->event_queue[event_index]->retrieved = TW_AEN_RETRIEVED;
761 		break;
762 	case TW_IOCTL_GET_NEXT_EVENT:
763 		event = (TW_Event *)tw_ioctl->data_buffer;
764 		sequence_id = event->sequence_id;
765 		tw_ioctl->driver_command.status = 0;
766 
767 		if (tw_dev->event_queue_wrapped) {
768 			if (tw_dev->aen_clobber) {
769 				tw_ioctl->driver_command.status = TW_IOCTL_ERROR_STATUS_AEN_CLOBBER;
770 				tw_dev->aen_clobber = 0;
771 			}
772 			start_index = tw_dev->error_index;
773 		} else {
774 			if (!tw_dev->error_index) {
775 				tw_ioctl->driver_command.status = TW_IOCTL_ERROR_STATUS_NO_MORE_EVENTS;
776 				break;
777 			}
778 			start_index = 0;
779 		}
780 		event_index = (start_index + sequence_id - tw_dev->event_queue[start_index]->sequence_id + 1) % TW_Q_LENGTH;
781 
782 		if (!(tw_dev->event_queue[event_index]->sequence_id > sequence_id)) {
783 			if (tw_ioctl->driver_command.status == TW_IOCTL_ERROR_STATUS_AEN_CLOBBER)
784 				tw_dev->aen_clobber = 1;
785 			tw_ioctl->driver_command.status = TW_IOCTL_ERROR_STATUS_NO_MORE_EVENTS;
786 			break;
787 		}
788 		memcpy(tw_ioctl->data_buffer, tw_dev->event_queue[event_index], sizeof(TW_Event));
789 		tw_dev->event_queue[event_index]->retrieved = TW_AEN_RETRIEVED;
790 		break;
791 	case TW_IOCTL_GET_PREVIOUS_EVENT:
792 		event = (TW_Event *)tw_ioctl->data_buffer;
793 		sequence_id = event->sequence_id;
794 		tw_ioctl->driver_command.status = 0;
795 
796 		if (tw_dev->event_queue_wrapped) {
797 			if (tw_dev->aen_clobber) {
798 				tw_ioctl->driver_command.status = TW_IOCTL_ERROR_STATUS_AEN_CLOBBER;
799 				tw_dev->aen_clobber = 0;
800 			}
801 			start_index = tw_dev->error_index;
802 		} else {
803 			if (!tw_dev->error_index) {
804 				tw_ioctl->driver_command.status = TW_IOCTL_ERROR_STATUS_NO_MORE_EVENTS;
805 				break;
806 			}
807 			start_index = 0;
808 		}
809 		event_index = (start_index + sequence_id - tw_dev->event_queue[start_index]->sequence_id - 1) % TW_Q_LENGTH;
810 
811 		if (!(tw_dev->event_queue[event_index]->sequence_id < sequence_id)) {
812 			if (tw_ioctl->driver_command.status == TW_IOCTL_ERROR_STATUS_AEN_CLOBBER)
813 				tw_dev->aen_clobber = 1;
814 			tw_ioctl->driver_command.status = TW_IOCTL_ERROR_STATUS_NO_MORE_EVENTS;
815 			break;
816 		}
817 		memcpy(tw_ioctl->data_buffer, tw_dev->event_queue[event_index], sizeof(TW_Event));
818 		tw_dev->event_queue[event_index]->retrieved = TW_AEN_RETRIEVED;
819 		break;
820 	case TW_IOCTL_GET_LOCK:
821 		tw_lock = (TW_Lock *)tw_ioctl->data_buffer;
822 		do_gettimeofday(&current_time);
823 		current_time_ms = (current_time.tv_sec * 1000) + (current_time.tv_usec / 1000);
824 
825 		if ((tw_lock->force_flag == 1) || (tw_dev->ioctl_sem_lock == 0) || (current_time_ms >= tw_dev->ioctl_msec)) {
826 			tw_dev->ioctl_sem_lock = 1;
827 			tw_dev->ioctl_msec = current_time_ms + tw_lock->timeout_msec;
828 			tw_ioctl->driver_command.status = 0;
829 			tw_lock->time_remaining_msec = tw_lock->timeout_msec;
830 		} else {
831 			tw_ioctl->driver_command.status = TW_IOCTL_ERROR_STATUS_LOCKED;
832 			tw_lock->time_remaining_msec = tw_dev->ioctl_msec - current_time_ms;
833 		}
834 		break;
835 	case TW_IOCTL_RELEASE_LOCK:
836 		if (tw_dev->ioctl_sem_lock == 1) {
837 			tw_dev->ioctl_sem_lock = 0;
838 			tw_ioctl->driver_command.status = 0;
839 		} else {
840 			tw_ioctl->driver_command.status = TW_IOCTL_ERROR_STATUS_NOT_LOCKED;
841 		}
842 		break;
843 	default:
844 		retval = TW_IOCTL_ERROR_OS_ENOTTY;
845 		goto out3;
846 	}
847 
848 	/* Now copy the entire response to userspace */
849 	if (copy_to_user(argp, tw_ioctl, sizeof(TW_Ioctl_Buf_Apache) + driver_command.buffer_length - 1) == 0)
850 		retval = 0;
851 out3:
852 	/* Now free ioctl buf memory */
853 	dma_free_coherent(&tw_dev->tw_pci_dev->dev, data_buffer_length_adjusted+sizeof(TW_Ioctl_Buf_Apache) - 1, cpu_addr, dma_handle);
854 out2:
855 	up(&tw_dev->ioctl_sem);
856 out:
857 	return retval;
858 } /* End twa_chrdev_ioctl() */
859 
860 /* This function handles open for the character device */
861 static int twa_chrdev_open(struct inode *inode, struct file *file)
862 {
863 	unsigned int minor_number;
864 	int retval = TW_IOCTL_ERROR_OS_ENODEV;
865 
866 	minor_number = iminor(inode);
867 	if (minor_number >= twa_device_extension_count)
868 		goto out;
869 	retval = 0;
870 out:
871 	return retval;
872 } /* End twa_chrdev_open() */
873 
874 /* This function will print readable messages from status register errors */
875 static int twa_decode_bits(TW_Device_Extension *tw_dev, u32 status_reg_value)
876 {
877 	int retval = 1;
878 
879 	/* Check for various error conditions and handle them appropriately */
880 	if (status_reg_value & TW_STATUS_PCI_PARITY_ERROR) {
881 		TW_PRINTK(tw_dev->host, TW_DRIVER, 0xc, "PCI Parity Error: clearing");
882 		writel(TW_CONTROL_CLEAR_PARITY_ERROR, TW_CONTROL_REG_ADDR(tw_dev));
883 	}
884 
885 	if (status_reg_value & TW_STATUS_PCI_ABORT) {
886 		TW_PRINTK(tw_dev->host, TW_DRIVER, 0xd, "PCI Abort: clearing");
887 		writel(TW_CONTROL_CLEAR_PCI_ABORT, TW_CONTROL_REG_ADDR(tw_dev));
888 		pci_write_config_word(tw_dev->tw_pci_dev, PCI_STATUS, TW_PCI_CLEAR_PCI_ABORT);
889 	}
890 
891 	if (status_reg_value & TW_STATUS_QUEUE_ERROR) {
892 		TW_PRINTK(tw_dev->host, TW_DRIVER, 0xe, "Controller Queue Error: clearing");
893 		writel(TW_CONTROL_CLEAR_QUEUE_ERROR, TW_CONTROL_REG_ADDR(tw_dev));
894 	}
895 
896 	if (status_reg_value & TW_STATUS_MICROCONTROLLER_ERROR) {
897 		if (tw_dev->reset_print == 0) {
898 			TW_PRINTK(tw_dev->host, TW_DRIVER, 0x10, "Microcontroller Error: clearing");
899 			tw_dev->reset_print = 1;
900 		}
901 		goto out;
902 	}
903 	retval = 0;
904 out:
905 	return retval;
906 } /* End twa_decode_bits() */
907 
908 /* This function will empty the response queue */
909 static int twa_empty_response_queue(TW_Device_Extension *tw_dev)
910 {
911 	u32 status_reg_value, response_que_value;
912 	int count = 0, retval = 1;
913 
914 	status_reg_value = readl(TW_STATUS_REG_ADDR(tw_dev));
915 
916 	while (((status_reg_value & TW_STATUS_RESPONSE_QUEUE_EMPTY) == 0) && (count < TW_MAX_RESPONSE_DRAIN)) {
917 		response_que_value = readl(TW_RESPONSE_QUEUE_REG_ADDR(tw_dev));
918 		status_reg_value = readl(TW_STATUS_REG_ADDR(tw_dev));
919 		count++;
920 	}
921 	if (count == TW_MAX_RESPONSE_DRAIN)
922 		goto out;
923 
924 	retval = 0;
925 out:
926 	return retval;
927 } /* End twa_empty_response_queue() */
928 
929 /* This function will clear the pchip/response queue on 9550SX */
930 static int twa_empty_response_queue_large(TW_Device_Extension *tw_dev)
931 {
932 	u32 status_reg_value, response_que_value;
933 	int count = 0, retval = 1;
934 
935 	if (tw_dev->tw_pci_dev->device == PCI_DEVICE_ID_3WARE_9550SX) {
936 		status_reg_value = readl(TW_STATUS_REG_ADDR(tw_dev));
937 
938 		while (((status_reg_value & TW_STATUS_RESPONSE_QUEUE_EMPTY) == 0) && (count < TW_MAX_RESPONSE_DRAIN)) {
939 			response_que_value = readl(TW_RESPONSE_QUEUE_REG_ADDR_LARGE(tw_dev));
940 			if ((response_que_value & TW_9550SX_DRAIN_COMPLETED) == TW_9550SX_DRAIN_COMPLETED) {
941 				/* P-chip settle time */
942 				msleep(500);
943 				retval = 0;
944 				goto out;
945 			}
946 			status_reg_value = readl(TW_STATUS_REG_ADDR(tw_dev));
947 			count++;
948 		}
949 		if (count == TW_MAX_RESPONSE_DRAIN)
950 			goto out;
951 
952 		retval = 0;
953 	} else
954 		retval = 0;
955 out:
956 	return retval;
957 } /* End twa_empty_response_queue_large() */
958 
959 /* This function passes sense keys from firmware to scsi layer */
960 static int twa_fill_sense(TW_Device_Extension *tw_dev, int request_id, int copy_sense, int print_host)
961 {
962 	TW_Command_Full *full_command_packet;
963 	unsigned short error;
964 	int retval = 1;
965 	char *error_str;
966 
967 	full_command_packet = tw_dev->command_packet_virt[request_id];
968 
969 	/* Check for embedded error string */
970 	error_str = &(full_command_packet->header.err_specific_desc[strlen(full_command_packet->header.err_specific_desc) + 1]);
971 
972 	/* Don't print error for Logical unit not supported during rollcall */
973 	error = full_command_packet->header.status_block.error;
974 	if ((error != TW_ERROR_LOGICAL_UNIT_NOT_SUPPORTED) && (error != TW_ERROR_UNIT_OFFLINE)) {
975 		if (print_host)
976 			printk(KERN_WARNING "3w-9xxx: scsi%d: ERROR: (0x%02X:0x%04X): %s:%s.\n",
977 			       tw_dev->host->host_no,
978 			       TW_MESSAGE_SOURCE_CONTROLLER_ERROR,
979 			       full_command_packet->header.status_block.error,
980 			       error_str[0] == '\0' ?
981 			       twa_string_lookup(twa_error_table,
982 						 full_command_packet->header.status_block.error) : error_str,
983 			       full_command_packet->header.err_specific_desc);
984 		else
985 			printk(KERN_WARNING "3w-9xxx: ERROR: (0x%02X:0x%04X): %s:%s.\n",
986 			       TW_MESSAGE_SOURCE_CONTROLLER_ERROR,
987 			       full_command_packet->header.status_block.error,
988 			       error_str[0] == '\0' ?
989 			       twa_string_lookup(twa_error_table,
990 						 full_command_packet->header.status_block.error) : error_str,
991 			       full_command_packet->header.err_specific_desc);
992 	}
993 
994 	if (copy_sense) {
995 		memcpy(tw_dev->srb[request_id]->sense_buffer, full_command_packet->header.sense_data, TW_SENSE_DATA_LENGTH);
996 		tw_dev->srb[request_id]->result = (full_command_packet->command.newcommand.status << 1);
997 		retval = TW_ISR_DONT_RESULT;
998 		goto out;
999 	}
1000 	retval = 0;
1001 out:
1002 	return retval;
1003 } /* End twa_fill_sense() */
1004 
1005 /* This function will free up device extension resources */
1006 static void twa_free_device_extension(TW_Device_Extension *tw_dev)
1007 {
1008 	if (tw_dev->command_packet_virt[0])
1009 		pci_free_consistent(tw_dev->tw_pci_dev,
1010 				    sizeof(TW_Command_Full)*TW_Q_LENGTH,
1011 				    tw_dev->command_packet_virt[0],
1012 				    tw_dev->command_packet_phys[0]);
1013 
1014 	if (tw_dev->generic_buffer_virt[0])
1015 		pci_free_consistent(tw_dev->tw_pci_dev,
1016 				    TW_SECTOR_SIZE*TW_Q_LENGTH,
1017 				    tw_dev->generic_buffer_virt[0],
1018 				    tw_dev->generic_buffer_phys[0]);
1019 
1020 	if (tw_dev->event_queue[0])
1021 		kfree(tw_dev->event_queue[0]);
1022 } /* End twa_free_device_extension() */
1023 
1024 /* This function will free a request id */
1025 static void twa_free_request_id(TW_Device_Extension *tw_dev, int request_id)
1026 {
1027 	tw_dev->free_queue[tw_dev->free_tail] = request_id;
1028 	tw_dev->state[request_id] = TW_S_FINISHED;
1029 	tw_dev->free_tail = (tw_dev->free_tail + 1) % TW_Q_LENGTH;
1030 } /* End twa_free_request_id() */
1031 
1032 /* This function will get parameter table entires from the firmware */
1033 static void *twa_get_param(TW_Device_Extension *tw_dev, int request_id, int table_id, int parameter_id, int parameter_size_bytes)
1034 {
1035 	TW_Command_Full *full_command_packet;
1036 	TW_Command *command_packet;
1037 	TW_Param_Apache *param;
1038 	unsigned long param_value;
1039 	void *retval = NULL;
1040 
1041 	/* Setup the command packet */
1042 	full_command_packet = tw_dev->command_packet_virt[request_id];
1043 	memset(full_command_packet, 0, sizeof(TW_Command_Full));
1044 	command_packet = &full_command_packet->command.oldcommand;
1045 
1046 	command_packet->opcode__sgloffset = TW_OPSGL_IN(2, TW_OP_GET_PARAM);
1047 	command_packet->size              = TW_COMMAND_SIZE;
1048 	command_packet->request_id        = request_id;
1049 	command_packet->byte6_offset.block_count = 1;
1050 
1051 	/* Now setup the param */
1052 	param = (TW_Param_Apache *)tw_dev->generic_buffer_virt[request_id];
1053 	memset(param, 0, TW_SECTOR_SIZE);
1054 	param->table_id = table_id | 0x8000;
1055 	param->parameter_id = parameter_id;
1056 	param->parameter_size_bytes = parameter_size_bytes;
1057 	param_value = tw_dev->generic_buffer_phys[request_id];
1058 
1059 	command_packet->byte8_offset.param.sgl[0].address = param_value;
1060 	command_packet->byte8_offset.param.sgl[0].length = TW_SECTOR_SIZE;
1061 
1062 	/* Post the command packet to the board */
1063 	twa_post_command_packet(tw_dev, request_id, 1);
1064 
1065 	/* Poll for completion */
1066 	if (twa_poll_response(tw_dev, request_id, 30))
1067 		TW_PRINTK(tw_dev->host, TW_DRIVER, 0x13, "No valid response during get param")
1068 	else
1069 		retval = (void *)&(param->data[0]);
1070 
1071 	tw_dev->posted_request_count--;
1072 	tw_dev->state[request_id] = TW_S_INITIAL;
1073 
1074 	return retval;
1075 } /* End twa_get_param() */
1076 
1077 /* This function will assign an available request id */
1078 static void twa_get_request_id(TW_Device_Extension *tw_dev, int *request_id)
1079 {
1080 	*request_id = tw_dev->free_queue[tw_dev->free_head];
1081 	tw_dev->free_head = (tw_dev->free_head + 1) % TW_Q_LENGTH;
1082 	tw_dev->state[*request_id] = TW_S_STARTED;
1083 } /* End twa_get_request_id() */
1084 
1085 /* This function will send an initconnection command to controller */
1086 static int twa_initconnection(TW_Device_Extension *tw_dev, int message_credits,
1087  			      u32 set_features, unsigned short current_fw_srl,
1088 			      unsigned short current_fw_arch_id,
1089 			      unsigned short current_fw_branch,
1090 			      unsigned short current_fw_build,
1091 			      unsigned short *fw_on_ctlr_srl,
1092 			      unsigned short *fw_on_ctlr_arch_id,
1093 			      unsigned short *fw_on_ctlr_branch,
1094 			      unsigned short *fw_on_ctlr_build,
1095 			      u32 *init_connect_result)
1096 {
1097 	TW_Command_Full *full_command_packet;
1098 	TW_Initconnect *tw_initconnect;
1099 	int request_id = 0, retval = 1;
1100 
1101 	/* Initialize InitConnection command packet */
1102 	full_command_packet = tw_dev->command_packet_virt[request_id];
1103 	memset(full_command_packet, 0, sizeof(TW_Command_Full));
1104 	full_command_packet->header.header_desc.size_header = 128;
1105 
1106 	tw_initconnect = (TW_Initconnect *)&full_command_packet->command.oldcommand;
1107 	tw_initconnect->opcode__reserved = TW_OPRES_IN(0, TW_OP_INIT_CONNECTION);
1108 	tw_initconnect->request_id = request_id;
1109 	tw_initconnect->message_credits = message_credits;
1110 	tw_initconnect->features = set_features;
1111 
1112 	/* Turn on 64-bit sgl support if we need to */
1113 	tw_initconnect->features |= sizeof(dma_addr_t) > 4 ? 1 : 0;
1114 
1115 	if (set_features & TW_EXTENDED_INIT_CONNECT) {
1116 		tw_initconnect->size = TW_INIT_COMMAND_PACKET_SIZE_EXTENDED;
1117 		tw_initconnect->fw_srl = current_fw_srl;
1118 		tw_initconnect->fw_arch_id = current_fw_arch_id;
1119 		tw_initconnect->fw_branch = current_fw_branch;
1120 		tw_initconnect->fw_build = current_fw_build;
1121 	} else
1122 		tw_initconnect->size = TW_INIT_COMMAND_PACKET_SIZE;
1123 
1124 	/* Send command packet to the board */
1125 	twa_post_command_packet(tw_dev, request_id, 1);
1126 
1127 	/* Poll for completion */
1128 	if (twa_poll_response(tw_dev, request_id, 30)) {
1129 		TW_PRINTK(tw_dev->host, TW_DRIVER, 0x15, "No valid response during init connection");
1130 	} else {
1131 		if (set_features & TW_EXTENDED_INIT_CONNECT) {
1132 			*fw_on_ctlr_srl = tw_initconnect->fw_srl;
1133 			*fw_on_ctlr_arch_id = tw_initconnect->fw_arch_id;
1134 			*fw_on_ctlr_branch = tw_initconnect->fw_branch;
1135 			*fw_on_ctlr_build = tw_initconnect->fw_build;
1136 			*init_connect_result = tw_initconnect->result;
1137 		}
1138 		retval = 0;
1139 	}
1140 
1141 	tw_dev->posted_request_count--;
1142 	tw_dev->state[request_id] = TW_S_INITIAL;
1143 
1144 	return retval;
1145 } /* End twa_initconnection() */
1146 
1147 /* This function will initialize the fields of a device extension */
1148 static int twa_initialize_device_extension(TW_Device_Extension *tw_dev)
1149 {
1150 	int i, retval = 1;
1151 
1152 	/* Initialize command packet buffers */
1153 	if (twa_allocate_memory(tw_dev, sizeof(TW_Command_Full), 0)) {
1154 		TW_PRINTK(tw_dev->host, TW_DRIVER, 0x16, "Command packet memory allocation failed");
1155 		goto out;
1156 	}
1157 
1158 	/* Initialize generic buffer */
1159 	if (twa_allocate_memory(tw_dev, TW_SECTOR_SIZE, 1)) {
1160 		TW_PRINTK(tw_dev->host, TW_DRIVER, 0x17, "Generic memory allocation failed");
1161 		goto out;
1162 	}
1163 
1164 	/* Allocate event info space */
1165 	tw_dev->event_queue[0] = kmalloc(sizeof(TW_Event) * TW_Q_LENGTH, GFP_KERNEL);
1166 	if (!tw_dev->event_queue[0]) {
1167 		TW_PRINTK(tw_dev->host, TW_DRIVER, 0x18, "Event info memory allocation failed");
1168 		goto out;
1169 	}
1170 
1171 	memset(tw_dev->event_queue[0], 0, sizeof(TW_Event) * TW_Q_LENGTH);
1172 
1173 	for (i = 0; i < TW_Q_LENGTH; i++) {
1174 		tw_dev->event_queue[i] = (TW_Event *)((unsigned char *)tw_dev->event_queue[0] + (i * sizeof(TW_Event)));
1175 		tw_dev->free_queue[i] = i;
1176 		tw_dev->state[i] = TW_S_INITIAL;
1177 	}
1178 
1179 	tw_dev->pending_head = TW_Q_START;
1180 	tw_dev->pending_tail = TW_Q_START;
1181 	tw_dev->free_head = TW_Q_START;
1182 	tw_dev->free_tail = TW_Q_START;
1183 	tw_dev->error_sequence_id = 1;
1184 	tw_dev->chrdev_request_id = TW_IOCTL_CHRDEV_FREE;
1185 
1186 	init_MUTEX(&tw_dev->ioctl_sem);
1187 	init_waitqueue_head(&tw_dev->ioctl_wqueue);
1188 
1189 	retval = 0;
1190 out:
1191 	return retval;
1192 } /* End twa_initialize_device_extension() */
1193 
1194 /* This function is the interrupt service routine */
1195 static irqreturn_t twa_interrupt(int irq, void *dev_instance, struct pt_regs *regs)
1196 {
1197 	int request_id, error = 0;
1198 	u32 status_reg_value;
1199 	TW_Response_Queue response_que;
1200 	TW_Command_Full *full_command_packet;
1201 	TW_Command *command_packet;
1202 	TW_Device_Extension *tw_dev = (TW_Device_Extension *)dev_instance;
1203 	int handled = 0;
1204 
1205 	/* Get the per adapter lock */
1206 	spin_lock(tw_dev->host->host_lock);
1207 
1208 	/* Read the registers */
1209 	status_reg_value = readl(TW_STATUS_REG_ADDR(tw_dev));
1210 
1211 	/* Check if this is our interrupt, otherwise bail */
1212 	if (!(status_reg_value & TW_STATUS_VALID_INTERRUPT))
1213 		goto twa_interrupt_bail;
1214 
1215 	handled = 1;
1216 
1217 	/* Check controller for errors */
1218 	if (twa_check_bits(status_reg_value)) {
1219 		if (twa_decode_bits(tw_dev, status_reg_value)) {
1220 			TW_CLEAR_ALL_INTERRUPTS(tw_dev);
1221 			goto twa_interrupt_bail;
1222 		}
1223 	}
1224 
1225 	/* Handle host interrupt */
1226 	if (status_reg_value & TW_STATUS_HOST_INTERRUPT)
1227 		TW_CLEAR_HOST_INTERRUPT(tw_dev);
1228 
1229 	/* Handle attention interrupt */
1230 	if (status_reg_value & TW_STATUS_ATTENTION_INTERRUPT) {
1231 		TW_CLEAR_ATTENTION_INTERRUPT(tw_dev);
1232 		if (!(test_and_set_bit(TW_IN_ATTENTION_LOOP, &tw_dev->flags))) {
1233 			twa_get_request_id(tw_dev, &request_id);
1234 
1235 			error = twa_aen_read_queue(tw_dev, request_id);
1236 			if (error) {
1237 				tw_dev->state[request_id] = TW_S_COMPLETED;
1238 				twa_free_request_id(tw_dev, request_id);
1239 				clear_bit(TW_IN_ATTENTION_LOOP, &tw_dev->flags);
1240 			}
1241 		}
1242 	}
1243 
1244 	/* Handle command interrupt */
1245 	if (status_reg_value & TW_STATUS_COMMAND_INTERRUPT) {
1246 		TW_MASK_COMMAND_INTERRUPT(tw_dev);
1247 		/* Drain as many pending commands as we can */
1248 		while (tw_dev->pending_request_count > 0) {
1249 			request_id = tw_dev->pending_queue[tw_dev->pending_head];
1250 			if (tw_dev->state[request_id] != TW_S_PENDING) {
1251 				TW_PRINTK(tw_dev->host, TW_DRIVER, 0x19, "Found request id that wasn't pending");
1252 				TW_CLEAR_ALL_INTERRUPTS(tw_dev);
1253 				goto twa_interrupt_bail;
1254 			}
1255 			if (twa_post_command_packet(tw_dev, request_id, 1)==0) {
1256 				tw_dev->pending_head = (tw_dev->pending_head + 1) % TW_Q_LENGTH;
1257 				tw_dev->pending_request_count--;
1258 			} else {
1259 				/* If we get here, we will continue re-posting on the next command interrupt */
1260 				break;
1261 			}
1262 		}
1263 	}
1264 
1265 	/* Handle response interrupt */
1266 	if (status_reg_value & TW_STATUS_RESPONSE_INTERRUPT) {
1267 
1268 		/* Drain the response queue from the board */
1269 		while ((status_reg_value & TW_STATUS_RESPONSE_QUEUE_EMPTY) == 0) {
1270 			/* Complete the response */
1271 			response_que.value = readl(TW_RESPONSE_QUEUE_REG_ADDR(tw_dev));
1272 			request_id = TW_RESID_OUT(response_que.response_id);
1273 			full_command_packet = tw_dev->command_packet_virt[request_id];
1274 			error = 0;
1275 			command_packet = &full_command_packet->command.oldcommand;
1276 			/* Check for command packet errors */
1277 			if (full_command_packet->command.newcommand.status != 0) {
1278 				if (tw_dev->srb[request_id] != 0) {
1279 					error = twa_fill_sense(tw_dev, request_id, 1, 1);
1280 				} else {
1281 					/* Skip ioctl error prints */
1282 					if (request_id != tw_dev->chrdev_request_id) {
1283 						error = twa_fill_sense(tw_dev, request_id, 0, 1);
1284 					}
1285 				}
1286 			}
1287 
1288 			/* Check for correct state */
1289 			if (tw_dev->state[request_id] != TW_S_POSTED) {
1290 				if (tw_dev->srb[request_id] != 0) {
1291 					TW_PRINTK(tw_dev->host, TW_DRIVER, 0x1a, "Received a request id that wasn't posted");
1292 					TW_CLEAR_ALL_INTERRUPTS(tw_dev);
1293 					goto twa_interrupt_bail;
1294 				}
1295 			}
1296 
1297 			/* Check for internal command completion */
1298 			if (tw_dev->srb[request_id] == 0) {
1299 				if (request_id != tw_dev->chrdev_request_id) {
1300 					if (twa_aen_complete(tw_dev, request_id))
1301 						TW_PRINTK(tw_dev->host, TW_DRIVER, 0x1b, "Error completing AEN during attention interrupt");
1302 				} else {
1303 					tw_dev->chrdev_request_id = TW_IOCTL_CHRDEV_FREE;
1304 					wake_up(&tw_dev->ioctl_wqueue);
1305 				}
1306 			} else {
1307 				twa_scsiop_execute_scsi_complete(tw_dev, request_id);
1308 				/* If no error command was a success */
1309 				if (error == 0) {
1310 					tw_dev->srb[request_id]->result = (DID_OK << 16);
1311 				}
1312 
1313 				/* If error, command failed */
1314 				if (error == 1) {
1315 					/* Ask for a host reset */
1316 					tw_dev->srb[request_id]->result = (DID_OK << 16) | (CHECK_CONDITION << 1);
1317 				}
1318 
1319 				/* Report residual bytes for single sgl */
1320 				if ((tw_dev->srb[request_id]->use_sg <= 1) && (full_command_packet->command.newcommand.status == 0)) {
1321 					if (full_command_packet->command.newcommand.sg_list[0].length < tw_dev->srb[request_id]->request_bufflen)
1322 						tw_dev->srb[request_id]->resid = tw_dev->srb[request_id]->request_bufflen - full_command_packet->command.newcommand.sg_list[0].length;
1323 				}
1324 
1325 				/* Now complete the io */
1326 				tw_dev->state[request_id] = TW_S_COMPLETED;
1327 				twa_free_request_id(tw_dev, request_id);
1328 				tw_dev->posted_request_count--;
1329 				tw_dev->srb[request_id]->scsi_done(tw_dev->srb[request_id]);
1330 				twa_unmap_scsi_data(tw_dev, request_id);
1331 			}
1332 
1333 			/* Check for valid status after each drain */
1334 			status_reg_value = readl(TW_STATUS_REG_ADDR(tw_dev));
1335 			if (twa_check_bits(status_reg_value)) {
1336 				if (twa_decode_bits(tw_dev, status_reg_value)) {
1337 					TW_CLEAR_ALL_INTERRUPTS(tw_dev);
1338 					goto twa_interrupt_bail;
1339 				}
1340 			}
1341 		}
1342 	}
1343 
1344 twa_interrupt_bail:
1345 	spin_unlock(tw_dev->host->host_lock);
1346 	return IRQ_RETVAL(handled);
1347 } /* End twa_interrupt() */
1348 
1349 /* This function will load the request id and various sgls for ioctls */
1350 static void twa_load_sgl(TW_Command_Full *full_command_packet, int request_id, dma_addr_t dma_handle, int length)
1351 {
1352 	TW_Command *oldcommand;
1353 	TW_Command_Apache *newcommand;
1354 	TW_SG_Entry *sgl;
1355 
1356 	if (TW_OP_OUT(full_command_packet->command.newcommand.opcode__reserved) == TW_OP_EXECUTE_SCSI) {
1357 		newcommand = &full_command_packet->command.newcommand;
1358 		newcommand->request_id__lunl =
1359 			TW_REQ_LUN_IN(TW_LUN_OUT(newcommand->request_id__lunl), request_id);
1360 		newcommand->sg_list[0].address = dma_handle + sizeof(TW_Ioctl_Buf_Apache) - 1;
1361 		newcommand->sg_list[0].length = length;
1362 		newcommand->sgl_entries__lunh =
1363 			TW_REQ_LUN_IN(TW_LUN_OUT(newcommand->sgl_entries__lunh), 1);
1364 	} else {
1365 		oldcommand = &full_command_packet->command.oldcommand;
1366 		oldcommand->request_id = request_id;
1367 
1368 		if (TW_SGL_OUT(oldcommand->opcode__sgloffset)) {
1369 			/* Load the sg list */
1370 			sgl = (TW_SG_Entry *)((u32 *)oldcommand+TW_SGL_OUT(oldcommand->opcode__sgloffset));
1371 			sgl->address = dma_handle + sizeof(TW_Ioctl_Buf_Apache) - 1;
1372 			sgl->length = length;
1373 
1374 			if ((sizeof(long) < 8) && (sizeof(dma_addr_t) > 4))
1375 				oldcommand->size += 1;
1376 		}
1377 	}
1378 } /* End twa_load_sgl() */
1379 
1380 /* This function will perform a pci-dma mapping for a scatter gather list */
1381 static int twa_map_scsi_sg_data(TW_Device_Extension *tw_dev, int request_id)
1382 {
1383 	int use_sg;
1384 	struct scsi_cmnd *cmd = tw_dev->srb[request_id];
1385 	struct pci_dev *pdev = tw_dev->tw_pci_dev;
1386 	int retval = 0;
1387 
1388 	if (cmd->use_sg == 0)
1389 		goto out;
1390 
1391 	use_sg = pci_map_sg(pdev, cmd->buffer, cmd->use_sg, DMA_BIDIRECTIONAL);
1392 
1393 	if (use_sg == 0) {
1394 		TW_PRINTK(tw_dev->host, TW_DRIVER, 0x1c, "Failed to map scatter gather list");
1395 		goto out;
1396 	}
1397 
1398 	cmd->SCp.phase = TW_PHASE_SGLIST;
1399 	cmd->SCp.have_data_in = use_sg;
1400 	retval = use_sg;
1401 out:
1402 	return retval;
1403 } /* End twa_map_scsi_sg_data() */
1404 
1405 /* This function will perform a pci-dma map for a single buffer */
1406 static dma_addr_t twa_map_scsi_single_data(TW_Device_Extension *tw_dev, int request_id)
1407 {
1408 	dma_addr_t mapping;
1409 	struct scsi_cmnd *cmd = tw_dev->srb[request_id];
1410 	struct pci_dev *pdev = tw_dev->tw_pci_dev;
1411 	int retval = 0;
1412 
1413 	if (cmd->request_bufflen == 0) {
1414 		retval = 0;
1415 		goto out;
1416 	}
1417 
1418 	mapping = pci_map_single(pdev, cmd->request_buffer, cmd->request_bufflen, DMA_BIDIRECTIONAL);
1419 
1420 	if (mapping == 0) {
1421 		TW_PRINTK(tw_dev->host, TW_DRIVER, 0x1d, "Failed to map page");
1422 		goto out;
1423 	}
1424 
1425 	cmd->SCp.phase = TW_PHASE_SINGLE;
1426 	cmd->SCp.have_data_in = mapping;
1427 	retval = mapping;
1428 out:
1429 	return retval;
1430 } /* End twa_map_scsi_single_data() */
1431 
1432 /* This function will poll for a response interrupt of a request */
1433 static int twa_poll_response(TW_Device_Extension *tw_dev, int request_id, int seconds)
1434 {
1435 	int retval = 1, found = 0, response_request_id;
1436 	TW_Response_Queue response_queue;
1437 	TW_Command_Full *full_command_packet = tw_dev->command_packet_virt[request_id];
1438 
1439 	if (twa_poll_status_gone(tw_dev, TW_STATUS_RESPONSE_QUEUE_EMPTY, seconds) == 0) {
1440 		response_queue.value = readl(TW_RESPONSE_QUEUE_REG_ADDR(tw_dev));
1441 		response_request_id = TW_RESID_OUT(response_queue.response_id);
1442 		if (request_id != response_request_id) {
1443 			TW_PRINTK(tw_dev->host, TW_DRIVER, 0x1e, "Found unexpected request id while polling for response");
1444 			goto out;
1445 		}
1446 		if (TW_OP_OUT(full_command_packet->command.newcommand.opcode__reserved) == TW_OP_EXECUTE_SCSI) {
1447 			if (full_command_packet->command.newcommand.status != 0) {
1448 				/* bad response */
1449 				twa_fill_sense(tw_dev, request_id, 0, 0);
1450 				goto out;
1451 			}
1452 			found = 1;
1453 		} else {
1454 			if (full_command_packet->command.oldcommand.status != 0) {
1455 				/* bad response */
1456 				twa_fill_sense(tw_dev, request_id, 0, 0);
1457 				goto out;
1458 			}
1459 			found = 1;
1460 		}
1461 	}
1462 
1463 	if (found)
1464 		retval = 0;
1465 out:
1466 	return retval;
1467 } /* End twa_poll_response() */
1468 
1469 /* This function will poll the status register for a flag */
1470 static int twa_poll_status(TW_Device_Extension *tw_dev, u32 flag, int seconds)
1471 {
1472 	u32 status_reg_value;
1473 	unsigned long before;
1474 	int retval = 1;
1475 
1476 	status_reg_value = readl(TW_STATUS_REG_ADDR(tw_dev));
1477 	before = jiffies;
1478 
1479 	if (twa_check_bits(status_reg_value))
1480 		twa_decode_bits(tw_dev, status_reg_value);
1481 
1482 	while ((status_reg_value & flag) != flag) {
1483 		status_reg_value = readl(TW_STATUS_REG_ADDR(tw_dev));
1484 
1485 		if (twa_check_bits(status_reg_value))
1486 			twa_decode_bits(tw_dev, status_reg_value);
1487 
1488 		if (time_after(jiffies, before + HZ * seconds))
1489 			goto out;
1490 
1491 		msleep(50);
1492 	}
1493 	retval = 0;
1494 out:
1495 	return retval;
1496 } /* End twa_poll_status() */
1497 
1498 /* This function will poll the status register for disappearance of a flag */
1499 static int twa_poll_status_gone(TW_Device_Extension *tw_dev, u32 flag, int seconds)
1500 {
1501 	u32 status_reg_value;
1502 	unsigned long before;
1503 	int retval = 1;
1504 
1505 	status_reg_value = readl(TW_STATUS_REG_ADDR(tw_dev));
1506 	before = jiffies;
1507 
1508 	if (twa_check_bits(status_reg_value))
1509 		twa_decode_bits(tw_dev, status_reg_value);
1510 
1511 	while ((status_reg_value & flag) != 0) {
1512 		status_reg_value = readl(TW_STATUS_REG_ADDR(tw_dev));
1513 		if (twa_check_bits(status_reg_value))
1514 			twa_decode_bits(tw_dev, status_reg_value);
1515 
1516 		if (time_after(jiffies, before + HZ * seconds))
1517 			goto out;
1518 
1519 		msleep(50);
1520 	}
1521 	retval = 0;
1522 out:
1523 	return retval;
1524 } /* End twa_poll_status_gone() */
1525 
1526 /* This function will attempt to post a command packet to the board */
1527 static int twa_post_command_packet(TW_Device_Extension *tw_dev, int request_id, char internal)
1528 {
1529 	u32 status_reg_value;
1530 	dma_addr_t command_que_value;
1531 	int retval = 1;
1532 
1533 	command_que_value = tw_dev->command_packet_phys[request_id];
1534 	status_reg_value = readl(TW_STATUS_REG_ADDR(tw_dev));
1535 
1536 	if (twa_check_bits(status_reg_value))
1537 		twa_decode_bits(tw_dev, status_reg_value);
1538 
1539 	if (((tw_dev->pending_request_count > 0) && (tw_dev->state[request_id] != TW_S_PENDING)) || (status_reg_value & TW_STATUS_COMMAND_QUEUE_FULL)) {
1540 
1541 		/* Only pend internal driver commands */
1542 		if (!internal) {
1543 			retval = SCSI_MLQUEUE_HOST_BUSY;
1544 			goto out;
1545 		}
1546 
1547 		/* Couldn't post the command packet, so we do it later */
1548 		if (tw_dev->state[request_id] != TW_S_PENDING) {
1549 			tw_dev->state[request_id] = TW_S_PENDING;
1550 			tw_dev->pending_request_count++;
1551 			if (tw_dev->pending_request_count > tw_dev->max_pending_request_count) {
1552 				tw_dev->max_pending_request_count = tw_dev->pending_request_count;
1553 			}
1554 			tw_dev->pending_queue[tw_dev->pending_tail] = request_id;
1555 			tw_dev->pending_tail = (tw_dev->pending_tail + 1) % TW_Q_LENGTH;
1556 		}
1557 		TW_UNMASK_COMMAND_INTERRUPT(tw_dev);
1558 		goto out;
1559 	} else {
1560 		/* We successfully posted the command packet */
1561 		if (sizeof(dma_addr_t) > 4) {
1562 			command_que_value += TW_COMMAND_OFFSET;
1563 			writel((u32)command_que_value, TW_COMMAND_QUEUE_REG_ADDR(tw_dev));
1564 			writel((u32)((u64)command_que_value >> 32), TW_COMMAND_QUEUE_REG_ADDR(tw_dev) + 0x4);
1565 		} else {
1566 			writel(TW_COMMAND_OFFSET + command_que_value, TW_COMMAND_QUEUE_REG_ADDR(tw_dev));
1567 		}
1568 		tw_dev->state[request_id] = TW_S_POSTED;
1569 		tw_dev->posted_request_count++;
1570 		if (tw_dev->posted_request_count > tw_dev->max_posted_request_count) {
1571 			tw_dev->max_posted_request_count = tw_dev->posted_request_count;
1572 		}
1573 	}
1574 	retval = 0;
1575 out:
1576 	return retval;
1577 } /* End twa_post_command_packet() */
1578 
1579 /* This function will reset a device extension */
1580 static int twa_reset_device_extension(TW_Device_Extension *tw_dev, int ioctl_reset)
1581 {
1582 	int i = 0;
1583 	int retval = 1;
1584 	unsigned long flags = 0;
1585 
1586 	set_bit(TW_IN_RESET, &tw_dev->flags);
1587 	TW_DISABLE_INTERRUPTS(tw_dev);
1588 	TW_MASK_COMMAND_INTERRUPT(tw_dev);
1589 	spin_lock_irqsave(tw_dev->host->host_lock, flags);
1590 
1591 	/* Abort all requests that are in progress */
1592 	for (i = 0; i < TW_Q_LENGTH; i++) {
1593 		if ((tw_dev->state[i] != TW_S_FINISHED) &&
1594 		    (tw_dev->state[i] != TW_S_INITIAL) &&
1595 		    (tw_dev->state[i] != TW_S_COMPLETED)) {
1596 			if (tw_dev->srb[i]) {
1597 				tw_dev->srb[i]->result = (DID_RESET << 16);
1598 				tw_dev->srb[i]->scsi_done(tw_dev->srb[i]);
1599 				twa_unmap_scsi_data(tw_dev, i);
1600 			}
1601 		}
1602 	}
1603 
1604 	/* Reset queues and counts */
1605 	for (i = 0; i < TW_Q_LENGTH; i++) {
1606 		tw_dev->free_queue[i] = i;
1607 		tw_dev->state[i] = TW_S_INITIAL;
1608 	}
1609 	tw_dev->free_head = TW_Q_START;
1610 	tw_dev->free_tail = TW_Q_START;
1611 	tw_dev->posted_request_count = 0;
1612 	tw_dev->pending_request_count = 0;
1613 	tw_dev->pending_head = TW_Q_START;
1614 	tw_dev->pending_tail = TW_Q_START;
1615 	tw_dev->reset_print = 0;
1616 
1617 	spin_unlock_irqrestore(tw_dev->host->host_lock, flags);
1618 
1619 	if (twa_reset_sequence(tw_dev, 1))
1620 		goto out;
1621 
1622 	TW_ENABLE_AND_CLEAR_INTERRUPTS(tw_dev);
1623 
1624 	/* Wake up any ioctl that was pending before the reset */
1625 	if ((tw_dev->chrdev_request_id == TW_IOCTL_CHRDEV_FREE) || (ioctl_reset)) {
1626 		clear_bit(TW_IN_RESET, &tw_dev->flags);
1627 	} else {
1628 		tw_dev->chrdev_request_id = TW_IOCTL_CHRDEV_FREE;
1629 		wake_up(&tw_dev->ioctl_wqueue);
1630 	}
1631 	retval = 0;
1632 out:
1633 	return retval;
1634 } /* End twa_reset_device_extension() */
1635 
1636 /* This function will reset a controller */
1637 static int twa_reset_sequence(TW_Device_Extension *tw_dev, int soft_reset)
1638 {
1639 	int tries = 0, retval = 1, flashed = 0, do_soft_reset = soft_reset;
1640 
1641 	while (tries < TW_MAX_RESET_TRIES) {
1642 		if (do_soft_reset) {
1643 			TW_SOFT_RESET(tw_dev);
1644 			/* Clear pchip/response queue on 9550SX */
1645 			if (twa_empty_response_queue_large(tw_dev)) {
1646 				TW_PRINTK(tw_dev->host, TW_DRIVER, 0x36, "Response queue (large) empty failed during reset sequence");
1647 				do_soft_reset = 1;
1648 				tries++;
1649 				continue;
1650 			}
1651 		}
1652 
1653 		/* Make sure controller is in a good state */
1654 		if (twa_poll_status(tw_dev, TW_STATUS_MICROCONTROLLER_READY | (do_soft_reset == 1 ? TW_STATUS_ATTENTION_INTERRUPT : 0), 60)) {
1655 			TW_PRINTK(tw_dev->host, TW_DRIVER, 0x1f, "Microcontroller not ready during reset sequence");
1656 			do_soft_reset = 1;
1657 			tries++;
1658 			continue;
1659 		}
1660 
1661 		/* Empty response queue */
1662 		if (twa_empty_response_queue(tw_dev)) {
1663 			TW_PRINTK(tw_dev->host, TW_DRIVER, 0x20, "Response queue empty failed during reset sequence");
1664 			do_soft_reset = 1;
1665 			tries++;
1666 			continue;
1667 		}
1668 
1669 		flashed = 0;
1670 
1671 		/* Check for compatibility/flash */
1672 		if (twa_check_srl(tw_dev, &flashed)) {
1673 			TW_PRINTK(tw_dev->host, TW_DRIVER, 0x21, "Compatibility check failed during reset sequence");
1674 			do_soft_reset = 1;
1675 			tries++;
1676 			continue;
1677 		} else {
1678 			if (flashed) {
1679 				tries++;
1680 				continue;
1681 			}
1682 		}
1683 
1684 		/* Drain the AEN queue */
1685 		if (twa_aen_drain_queue(tw_dev, soft_reset)) {
1686 			TW_PRINTK(tw_dev->host, TW_DRIVER, 0x22, "AEN drain failed during reset sequence");
1687 			do_soft_reset = 1;
1688 			tries++;
1689 			continue;
1690 		}
1691 
1692 		/* If we got here, controller is in a good state */
1693 		retval = 0;
1694 		goto out;
1695 	}
1696 out:
1697 	return retval;
1698 } /* End twa_reset_sequence() */
1699 
1700 /* This funciton returns unit geometry in cylinders/heads/sectors */
1701 static int twa_scsi_biosparam(struct scsi_device *sdev, struct block_device *bdev, sector_t capacity, int geom[])
1702 {
1703 	int heads, sectors, cylinders;
1704 	TW_Device_Extension *tw_dev;
1705 
1706 	tw_dev = (TW_Device_Extension *)sdev->host->hostdata;
1707 
1708 	if (capacity >= 0x200000) {
1709 		heads = 255;
1710 		sectors = 63;
1711 		cylinders = sector_div(capacity, heads * sectors);
1712 	} else {
1713 		heads = 64;
1714 		sectors = 32;
1715 		cylinders = sector_div(capacity, heads * sectors);
1716 	}
1717 
1718 	geom[0] = heads;
1719 	geom[1] = sectors;
1720 	geom[2] = cylinders;
1721 
1722 	return 0;
1723 } /* End twa_scsi_biosparam() */
1724 
1725 /* This is the new scsi eh reset function */
1726 static int twa_scsi_eh_reset(struct scsi_cmnd *SCpnt)
1727 {
1728 	TW_Device_Extension *tw_dev = NULL;
1729 	int retval = FAILED;
1730 
1731 	tw_dev = (TW_Device_Extension *)SCpnt->device->host->hostdata;
1732 
1733 	tw_dev->num_resets++;
1734 
1735 	sdev_printk(KERN_WARNING, SCpnt->device,
1736 		"WARNING: (0x%02X:0x%04X): Command (0x%x) timed out, resetting card.\n",
1737 		TW_DRIVER, 0x2c, SCpnt->cmnd[0]);
1738 
1739 	/* Now reset the card and some of the device extension data */
1740 	if (twa_reset_device_extension(tw_dev, 0)) {
1741 		TW_PRINTK(tw_dev->host, TW_DRIVER, 0x2b, "Controller reset failed during scsi host reset");
1742 		goto out;
1743 	}
1744 
1745 	retval = SUCCESS;
1746 out:
1747 	return retval;
1748 } /* End twa_scsi_eh_reset() */
1749 
1750 /* This is the main scsi queue function to handle scsi opcodes */
1751 static int twa_scsi_queue(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))
1752 {
1753 	int request_id, retval;
1754 	TW_Device_Extension *tw_dev = (TW_Device_Extension *)SCpnt->device->host->hostdata;
1755 
1756 	/* Check if this FW supports luns */
1757 	if ((SCpnt->device->lun != 0) && (tw_dev->working_srl < TW_FW_SRL_LUNS_SUPPORTED)) {
1758 		SCpnt->result = (DID_BAD_TARGET << 16);
1759 		done(SCpnt);
1760 		retval = 0;
1761 		goto out;
1762 	}
1763 
1764 	/* Save done function into scsi_cmnd struct */
1765 	SCpnt->scsi_done = done;
1766 
1767 	/* Get a free request id */
1768 	twa_get_request_id(tw_dev, &request_id);
1769 
1770 	/* Save the scsi command for use by the ISR */
1771 	tw_dev->srb[request_id] = SCpnt;
1772 
1773 	/* Initialize phase to zero */
1774 	SCpnt->SCp.phase = TW_PHASE_INITIAL;
1775 
1776 	retval = twa_scsiop_execute_scsi(tw_dev, request_id, NULL, 0, NULL);
1777 	switch (retval) {
1778 	case SCSI_MLQUEUE_HOST_BUSY:
1779 		twa_free_request_id(tw_dev, request_id);
1780 		break;
1781 	case 1:
1782 		tw_dev->state[request_id] = TW_S_COMPLETED;
1783 		twa_free_request_id(tw_dev, request_id);
1784 		SCpnt->result = (DID_ERROR << 16);
1785 		done(SCpnt);
1786 		retval = 0;
1787 	}
1788 out:
1789 	return retval;
1790 } /* End twa_scsi_queue() */
1791 
1792 /* This function hands scsi cdb's to the firmware */
1793 static int twa_scsiop_execute_scsi(TW_Device_Extension *tw_dev, int request_id, char *cdb, int use_sg, TW_SG_Entry *sglistarg)
1794 {
1795 	TW_Command_Full *full_command_packet;
1796 	TW_Command_Apache *command_packet;
1797 	u32 num_sectors = 0x0;
1798 	int i, sg_count;
1799 	struct scsi_cmnd *srb = NULL;
1800 	struct scatterlist *sglist = NULL;
1801 	u32 buffaddr = 0x0;
1802 	int retval = 1;
1803 
1804 	if (tw_dev->srb[request_id]) {
1805 		if (tw_dev->srb[request_id]->request_buffer) {
1806 			sglist = (struct scatterlist *)tw_dev->srb[request_id]->request_buffer;
1807 		}
1808 		srb = tw_dev->srb[request_id];
1809 	}
1810 
1811 	/* Initialize command packet */
1812 	full_command_packet = tw_dev->command_packet_virt[request_id];
1813 	full_command_packet->header.header_desc.size_header = 128;
1814 	full_command_packet->header.status_block.error = 0;
1815 	full_command_packet->header.status_block.severity__reserved = 0;
1816 
1817 	command_packet = &full_command_packet->command.newcommand;
1818 	command_packet->status = 0;
1819 	command_packet->opcode__reserved = TW_OPRES_IN(0, TW_OP_EXECUTE_SCSI);
1820 
1821 	/* We forced 16 byte cdb use earlier */
1822 	if (!cdb)
1823 		memcpy(command_packet->cdb, srb->cmnd, TW_MAX_CDB_LEN);
1824 	else
1825 		memcpy(command_packet->cdb, cdb, TW_MAX_CDB_LEN);
1826 
1827 	if (srb) {
1828 		command_packet->unit = srb->device->id;
1829 		command_packet->request_id__lunl =
1830 			TW_REQ_LUN_IN(srb->device->lun, request_id);
1831 	} else {
1832 		command_packet->request_id__lunl =
1833 			TW_REQ_LUN_IN(0, request_id);
1834 		command_packet->unit = 0;
1835 	}
1836 
1837 	command_packet->sgl_offset = 16;
1838 
1839 	if (!sglistarg) {
1840 		/* Map sglist from scsi layer to cmd packet */
1841 		if (tw_dev->srb[request_id]->use_sg == 0) {
1842 			if (tw_dev->srb[request_id]->request_bufflen < TW_MIN_SGL_LENGTH) {
1843 				command_packet->sg_list[0].address = tw_dev->generic_buffer_phys[request_id];
1844 				command_packet->sg_list[0].length = TW_MIN_SGL_LENGTH;
1845 				if (tw_dev->srb[request_id]->sc_data_direction == DMA_TO_DEVICE || tw_dev->srb[request_id]->sc_data_direction == DMA_BIDIRECTIONAL)
1846 					memcpy(tw_dev->generic_buffer_virt[request_id], tw_dev->srb[request_id]->request_buffer, tw_dev->srb[request_id]->request_bufflen);
1847 			} else {
1848 				buffaddr = twa_map_scsi_single_data(tw_dev, request_id);
1849 				if (buffaddr == 0)
1850 					goto out;
1851 
1852 				command_packet->sg_list[0].address = buffaddr;
1853 				command_packet->sg_list[0].length = tw_dev->srb[request_id]->request_bufflen;
1854 			}
1855 			command_packet->sgl_entries__lunh = TW_REQ_LUN_IN((srb->device->lun >> 4), 1);
1856 
1857 			if (command_packet->sg_list[0].address & TW_ALIGNMENT_9000_SGL) {
1858 				TW_PRINTK(tw_dev->host, TW_DRIVER, 0x2d, "Found unaligned address during execute scsi");
1859 				goto out;
1860 			}
1861 		}
1862 
1863 		if (tw_dev->srb[request_id]->use_sg > 0) {
1864 			if ((tw_dev->srb[request_id]->use_sg == 1) && (tw_dev->srb[request_id]->request_bufflen < TW_MIN_SGL_LENGTH)) {
1865 				if (tw_dev->srb[request_id]->sc_data_direction == DMA_TO_DEVICE || tw_dev->srb[request_id]->sc_data_direction == DMA_BIDIRECTIONAL) {
1866 					struct scatterlist *sg = (struct scatterlist *)tw_dev->srb[request_id]->request_buffer;
1867 					char *buf = kmap_atomic(sg->page, KM_IRQ0) + sg->offset;
1868 					memcpy(tw_dev->generic_buffer_virt[request_id], buf, sg->length);
1869 					kunmap_atomic(buf - sg->offset, KM_IRQ0);
1870 				}
1871 				command_packet->sg_list[0].address = tw_dev->generic_buffer_phys[request_id];
1872 				command_packet->sg_list[0].length = TW_MIN_SGL_LENGTH;
1873 			} else {
1874 				sg_count = twa_map_scsi_sg_data(tw_dev, request_id);
1875 				if (sg_count == 0)
1876 					goto out;
1877 
1878 				for (i = 0; i < sg_count; i++) {
1879 					command_packet->sg_list[i].address = sg_dma_address(&sglist[i]);
1880 					command_packet->sg_list[i].length = sg_dma_len(&sglist[i]);
1881 					if (command_packet->sg_list[i].address & TW_ALIGNMENT_9000_SGL) {
1882 						TW_PRINTK(tw_dev->host, TW_DRIVER, 0x2e, "Found unaligned sgl address during execute scsi");
1883 						goto out;
1884 					}
1885 				}
1886 			}
1887 			command_packet->sgl_entries__lunh = TW_REQ_LUN_IN((srb->device->lun >> 4), tw_dev->srb[request_id]->use_sg);
1888 		}
1889 	} else {
1890 		/* Internal cdb post */
1891 		for (i = 0; i < use_sg; i++) {
1892 			command_packet->sg_list[i].address = sglistarg[i].address;
1893 			command_packet->sg_list[i].length = sglistarg[i].length;
1894 			if (command_packet->sg_list[i].address & TW_ALIGNMENT_9000_SGL) {
1895 				TW_PRINTK(tw_dev->host, TW_DRIVER, 0x2f, "Found unaligned sgl address during internal post");
1896 				goto out;
1897 			}
1898 		}
1899 		command_packet->sgl_entries__lunh = TW_REQ_LUN_IN(0, use_sg);
1900 	}
1901 
1902 	if (srb) {
1903 		if (srb->cmnd[0] == READ_6 || srb->cmnd[0] == WRITE_6)
1904 			num_sectors = (u32)srb->cmnd[4];
1905 
1906 		if (srb->cmnd[0] == READ_10 || srb->cmnd[0] == WRITE_10)
1907 			num_sectors = (u32)srb->cmnd[8] | ((u32)srb->cmnd[7] << 8);
1908 	}
1909 
1910 	/* Update sector statistic */
1911 	tw_dev->sector_count = num_sectors;
1912 	if (tw_dev->sector_count > tw_dev->max_sector_count)
1913 		tw_dev->max_sector_count = tw_dev->sector_count;
1914 
1915 	/* Update SG statistics */
1916 	if (srb) {
1917 		tw_dev->sgl_entries = tw_dev->srb[request_id]->use_sg;
1918 		if (tw_dev->sgl_entries > tw_dev->max_sgl_entries)
1919 			tw_dev->max_sgl_entries = tw_dev->sgl_entries;
1920 	}
1921 
1922 	/* Now post the command to the board */
1923 	if (srb) {
1924 		retval = twa_post_command_packet(tw_dev, request_id, 0);
1925 	} else {
1926 		twa_post_command_packet(tw_dev, request_id, 1);
1927 		retval = 0;
1928 	}
1929 out:
1930 	return retval;
1931 } /* End twa_scsiop_execute_scsi() */
1932 
1933 /* This function completes an execute scsi operation */
1934 static void twa_scsiop_execute_scsi_complete(TW_Device_Extension *tw_dev, int request_id)
1935 {
1936 	if (tw_dev->srb[request_id]->request_bufflen < TW_MIN_SGL_LENGTH &&
1937 	    (tw_dev->srb[request_id]->sc_data_direction == DMA_FROM_DEVICE ||
1938 	     tw_dev->srb[request_id]->sc_data_direction == DMA_BIDIRECTIONAL)) {
1939 		if (tw_dev->srb[request_id]->use_sg == 0) {
1940 			memcpy(tw_dev->srb[request_id]->request_buffer,
1941 			       tw_dev->generic_buffer_virt[request_id],
1942 			       tw_dev->srb[request_id]->request_bufflen);
1943 		}
1944 		if (tw_dev->srb[request_id]->use_sg == 1) {
1945 			struct scatterlist *sg = (struct scatterlist *)tw_dev->srb[request_id]->request_buffer;
1946 			char *buf = kmap_atomic(sg->page, KM_IRQ0) + sg->offset;
1947 			memcpy(buf, tw_dev->generic_buffer_virt[request_id], sg->length);
1948 			kunmap_atomic(buf - sg->offset, KM_IRQ0);
1949 		}
1950 	}
1951 } /* End twa_scsiop_execute_scsi_complete() */
1952 
1953 /* This function tells the controller to shut down */
1954 static void __twa_shutdown(TW_Device_Extension *tw_dev)
1955 {
1956 	/* Disable interrupts */
1957 	TW_DISABLE_INTERRUPTS(tw_dev);
1958 
1959 	printk(KERN_WARNING "3w-9xxx: Shutting down host %d.\n", tw_dev->host->host_no);
1960 
1961 	/* Tell the card we are shutting down */
1962 	if (twa_initconnection(tw_dev, 1, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL)) {
1963 		TW_PRINTK(tw_dev->host, TW_DRIVER, 0x31, "Connection shutdown failed");
1964 	} else {
1965 		printk(KERN_WARNING "3w-9xxx: Shutdown complete.\n");
1966 	}
1967 
1968 	/* Clear all interrupts just before exit */
1969 	TW_CLEAR_ALL_INTERRUPTS(tw_dev);
1970 } /* End __twa_shutdown() */
1971 
1972 /* Wrapper for __twa_shutdown */
1973 static void twa_shutdown(struct pci_dev *pdev)
1974 {
1975 	struct Scsi_Host *host = pci_get_drvdata(pdev);
1976 	TW_Device_Extension *tw_dev = (TW_Device_Extension *)host->hostdata;
1977 
1978 	__twa_shutdown(tw_dev);
1979 } /* End twa_shutdown() */
1980 
1981 /* This function will look up a string */
1982 static char *twa_string_lookup(twa_message_type *table, unsigned int code)
1983 {
1984 	int index;
1985 
1986 	for (index = 0; ((code != table[index].code) &&
1987 		      (table[index].text != (char *)0)); index++);
1988 	return(table[index].text);
1989 } /* End twa_string_lookup() */
1990 
1991 /* This function will perform a pci-dma unmap */
1992 static void twa_unmap_scsi_data(TW_Device_Extension *tw_dev, int request_id)
1993 {
1994 	struct scsi_cmnd *cmd = tw_dev->srb[request_id];
1995 	struct pci_dev *pdev = tw_dev->tw_pci_dev;
1996 
1997 	switch(cmd->SCp.phase) {
1998 	case TW_PHASE_SINGLE:
1999 		pci_unmap_single(pdev, cmd->SCp.have_data_in, cmd->request_bufflen, DMA_BIDIRECTIONAL);
2000 		break;
2001 	case TW_PHASE_SGLIST:
2002 		pci_unmap_sg(pdev, cmd->request_buffer, cmd->use_sg, DMA_BIDIRECTIONAL);
2003 		break;
2004 	}
2005 } /* End twa_unmap_scsi_data() */
2006 
2007 /* scsi_host_template initializer */
2008 static struct scsi_host_template driver_template = {
2009 	.module			= THIS_MODULE,
2010 	.name			= "3ware 9000 Storage Controller",
2011 	.queuecommand		= twa_scsi_queue,
2012 	.eh_host_reset_handler	= twa_scsi_eh_reset,
2013 	.bios_param		= twa_scsi_biosparam,
2014 	.change_queue_depth	= twa_change_queue_depth,
2015 	.can_queue		= TW_Q_LENGTH-2,
2016 	.this_id		= -1,
2017 	.sg_tablesize		= TW_APACHE_MAX_SGL_LENGTH,
2018 	.max_sectors		= TW_MAX_SECTORS,
2019 	.cmd_per_lun		= TW_MAX_CMDS_PER_LUN,
2020 	.use_clustering		= ENABLE_CLUSTERING,
2021 	.shost_attrs		= twa_host_attrs,
2022 	.emulated		= 1
2023 };
2024 
2025 /* This function will probe and initialize a card */
2026 static int __devinit twa_probe(struct pci_dev *pdev, const struct pci_device_id *dev_id)
2027 {
2028 	struct Scsi_Host *host = NULL;
2029 	TW_Device_Extension *tw_dev;
2030 	u32 mem_addr;
2031 	int retval = -ENODEV;
2032 
2033 	retval = pci_enable_device(pdev);
2034 	if (retval) {
2035 		TW_PRINTK(host, TW_DRIVER, 0x34, "Failed to enable pci device");
2036 		goto out_disable_device;
2037 	}
2038 
2039 	pci_set_master(pdev);
2040 
2041 	retval = pci_set_dma_mask(pdev, sizeof(dma_addr_t) > 4 ? DMA_64BIT_MASK : DMA_32BIT_MASK);
2042 	if (retval) {
2043 		TW_PRINTK(host, TW_DRIVER, 0x23, "Failed to set dma mask");
2044 		goto out_disable_device;
2045 	}
2046 
2047 	host = scsi_host_alloc(&driver_template, sizeof(TW_Device_Extension));
2048 	if (!host) {
2049 		TW_PRINTK(host, TW_DRIVER, 0x24, "Failed to allocate memory for device extension");
2050 		retval = -ENOMEM;
2051 		goto out_disable_device;
2052 	}
2053 	tw_dev = (TW_Device_Extension *)host->hostdata;
2054 
2055 	memset(tw_dev, 0, sizeof(TW_Device_Extension));
2056 
2057 	/* Save values to device extension */
2058 	tw_dev->host = host;
2059 	tw_dev->tw_pci_dev = pdev;
2060 
2061 	if (twa_initialize_device_extension(tw_dev)) {
2062 		TW_PRINTK(tw_dev->host, TW_DRIVER, 0x25, "Failed to initialize device extension");
2063 		goto out_free_device_extension;
2064 	}
2065 
2066 	/* Request IO regions */
2067 	retval = pci_request_regions(pdev, "3w-9xxx");
2068 	if (retval) {
2069 		TW_PRINTK(tw_dev->host, TW_DRIVER, 0x26, "Failed to get mem region");
2070 		goto out_free_device_extension;
2071 	}
2072 
2073 	if (pdev->device == PCI_DEVICE_ID_3WARE_9000)
2074 		mem_addr = pci_resource_start(pdev, 1);
2075 	else
2076 		mem_addr = pci_resource_start(pdev, 2);
2077 
2078 	/* Save base address */
2079 	tw_dev->base_addr = ioremap(mem_addr, PAGE_SIZE);
2080 	if (!tw_dev->base_addr) {
2081 		TW_PRINTK(tw_dev->host, TW_DRIVER, 0x35, "Failed to ioremap");
2082 		goto out_release_mem_region;
2083 	}
2084 
2085 	/* Disable interrupts on the card */
2086 	TW_DISABLE_INTERRUPTS(tw_dev);
2087 
2088 	/* Initialize the card */
2089 	if (twa_reset_sequence(tw_dev, 0))
2090 		goto out_release_mem_region;
2091 
2092 	/* Set host specific parameters */
2093 	host->max_id = TW_MAX_UNITS;
2094 	host->max_cmd_len = TW_MAX_CDB_LEN;
2095 
2096 	/* Channels aren't supported by adapter */
2097 	host->max_lun = TW_MAX_LUNS(tw_dev->working_srl);
2098 	host->max_channel = 0;
2099 
2100 	/* Register the card with the kernel SCSI layer */
2101 	retval = scsi_add_host(host, &pdev->dev);
2102 	if (retval) {
2103 		TW_PRINTK(tw_dev->host, TW_DRIVER, 0x27, "scsi add host failed");
2104 		goto out_release_mem_region;
2105 	}
2106 
2107 	pci_set_drvdata(pdev, host);
2108 
2109 	printk(KERN_WARNING "3w-9xxx: scsi%d: Found a 3ware 9000 Storage Controller at 0x%x, IRQ: %d.\n",
2110 	       host->host_no, mem_addr, pdev->irq);
2111 	printk(KERN_WARNING "3w-9xxx: scsi%d: Firmware %s, BIOS %s, Ports: %d.\n",
2112 	       host->host_no,
2113 	       (char *)twa_get_param(tw_dev, 0, TW_VERSION_TABLE,
2114 				     TW_PARAM_FWVER, TW_PARAM_FWVER_LENGTH),
2115 	       (char *)twa_get_param(tw_dev, 1, TW_VERSION_TABLE,
2116 				     TW_PARAM_BIOSVER, TW_PARAM_BIOSVER_LENGTH),
2117 	       *(int *)twa_get_param(tw_dev, 2, TW_INFORMATION_TABLE,
2118 				     TW_PARAM_PORTCOUNT, TW_PARAM_PORTCOUNT_LENGTH));
2119 
2120 	/* Now setup the interrupt handler */
2121 	retval = request_irq(pdev->irq, twa_interrupt, SA_SHIRQ, "3w-9xxx", tw_dev);
2122 	if (retval) {
2123 		TW_PRINTK(tw_dev->host, TW_DRIVER, 0x30, "Error requesting IRQ");
2124 		goto out_remove_host;
2125 	}
2126 
2127 	twa_device_extension_list[twa_device_extension_count] = tw_dev;
2128 	twa_device_extension_count++;
2129 
2130 	/* Re-enable interrupts on the card */
2131 	TW_ENABLE_AND_CLEAR_INTERRUPTS(tw_dev);
2132 
2133 	/* Finally, scan the host */
2134 	scsi_scan_host(host);
2135 
2136 	if (twa_major == -1) {
2137 		if ((twa_major = register_chrdev (0, "twa", &twa_fops)) < 0)
2138 			TW_PRINTK(host, TW_DRIVER, 0x29, "Failed to register character device");
2139 	}
2140 	return 0;
2141 
2142 out_remove_host:
2143 	scsi_remove_host(host);
2144 out_release_mem_region:
2145 	pci_release_regions(pdev);
2146 out_free_device_extension:
2147 	twa_free_device_extension(tw_dev);
2148 	scsi_host_put(host);
2149 out_disable_device:
2150 	pci_disable_device(pdev);
2151 
2152 	return retval;
2153 } /* End twa_probe() */
2154 
2155 /* This function is called to remove a device */
2156 static void twa_remove(struct pci_dev *pdev)
2157 {
2158 	struct Scsi_Host *host = pci_get_drvdata(pdev);
2159 	TW_Device_Extension *tw_dev = (TW_Device_Extension *)host->hostdata;
2160 
2161 	scsi_remove_host(tw_dev->host);
2162 
2163 	/* Unregister character device */
2164 	if (twa_major >= 0) {
2165 		unregister_chrdev(twa_major, "twa");
2166 		twa_major = -1;
2167 	}
2168 
2169 	/* Free up the IRQ */
2170 	free_irq(tw_dev->tw_pci_dev->irq, tw_dev);
2171 
2172 	/* Shutdown the card */
2173 	__twa_shutdown(tw_dev);
2174 
2175 	/* Free up the mem region */
2176 	pci_release_regions(pdev);
2177 
2178 	/* Free up device extension resources */
2179 	twa_free_device_extension(tw_dev);
2180 
2181 	scsi_host_put(tw_dev->host);
2182 	pci_disable_device(pdev);
2183 	twa_device_extension_count--;
2184 } /* End twa_remove() */
2185 
2186 /* PCI Devices supported by this driver */
2187 static struct pci_device_id twa_pci_tbl[] __devinitdata = {
2188 	{ PCI_VENDOR_ID_3WARE, PCI_DEVICE_ID_3WARE_9000,
2189 	  PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
2190 	{ PCI_VENDOR_ID_3WARE, PCI_DEVICE_ID_3WARE_9550SX,
2191 	  PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
2192 	{ }
2193 };
2194 MODULE_DEVICE_TABLE(pci, twa_pci_tbl);
2195 
2196 /* pci_driver initializer */
2197 static struct pci_driver twa_driver = {
2198 	.name		= "3w-9xxx",
2199 	.id_table	= twa_pci_tbl,
2200 	.probe		= twa_probe,
2201 	.remove		= twa_remove,
2202 	.shutdown	= twa_shutdown
2203 };
2204 
2205 /* This function is called on driver initialization */
2206 static int __init twa_init(void)
2207 {
2208 	printk(KERN_WARNING "3ware 9000 Storage Controller device driver for Linux v%s.\n", TW_DRIVER_VERSION);
2209 
2210 	return pci_module_init(&twa_driver);
2211 } /* End twa_init() */
2212 
2213 /* This function is called on driver exit */
2214 static void __exit twa_exit(void)
2215 {
2216 	pci_unregister_driver(&twa_driver);
2217 } /* End twa_exit() */
2218 
2219 module_init(twa_init);
2220 module_exit(twa_exit);
2221 
2222