xref: /linux/drivers/scsi/3w-9xxx.c (revision 14b42963f64b98ab61fa9723c03d71aa5ef4f862)
1 /*
2    3w-9xxx.c -- 3ware 9000 Storage Controller device driver for Linux.
3 
4    Written By: Adam Radford <linuxraid@amcc.com>
5    Modifications By: Tom Couch <linuxraid@amcc.com>
6 
7    Copyright (C) 2004-2006 Applied Micro Circuits Corporation.
8 
9    This program is free software; you can redistribute it and/or modify
10    it under the terms of the GNU General Public License as published by
11    the Free Software Foundation; version 2 of the License.
12 
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17 
18    NO WARRANTY
19    THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR
20    CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT
21    LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
22    MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is
23    solely responsible for determining the appropriateness of using and
24    distributing the Program and assumes all risks associated with its
25    exercise of rights under this Agreement, including but not limited to
26    the risks and costs of program errors, damage to or loss of data,
27    programs or equipment, and unavailability or interruption of operations.
28 
29    DISCLAIMER OF LIABILITY
30    NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY
31    DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
32    DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND
33    ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
34    TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
35    USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
36    HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES
37 
38    You should have received a copy of the GNU General Public License
39    along with this program; if not, write to the Free Software
40    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
41 
42    Bugs/Comments/Suggestions should be mailed to:
43    linuxraid@amcc.com
44 
45    For more information, goto:
46    http://www.amcc.com
47 
48    Note: This version of the driver does not contain a bundled firmware
49          image.
50 
51    History
52    -------
53    2.26.02.000 - Driver cleanup for kernel submission.
54    2.26.02.001 - Replace schedule_timeout() calls with msleep().
55    2.26.02.002 - Add support for PAE mode.
56                  Add lun support.
57                  Fix twa_remove() to free irq handler/unregister_chrdev()
58                  before shutting down card.
59                  Change to new 'change_queue_depth' api.
60                  Fix 'handled=1' ISR usage, remove bogus IRQ check.
61                  Remove un-needed eh_abort handler.
62                  Add support for embedded firmware error strings.
63    2.26.02.003 - Correctly handle single sgl's with use_sg=1.
64    2.26.02.004 - Add support for 9550SX controllers.
65    2.26.02.005 - Fix use_sg == 0 mapping on systems with 4GB or higher.
66    2.26.02.006 - Fix 9550SX pchip reset timeout.
67                  Add big endian support.
68    2.26.02.007 - Disable local interrupts during kmap/unmap_atomic().
69 */
70 
71 #include <linux/module.h>
72 #include <linux/reboot.h>
73 #include <linux/spinlock.h>
74 #include <linux/interrupt.h>
75 #include <linux/moduleparam.h>
76 #include <linux/errno.h>
77 #include <linux/types.h>
78 #include <linux/delay.h>
79 #include <linux/pci.h>
80 #include <linux/time.h>
81 #include <linux/mutex.h>
82 #include <asm/io.h>
83 #include <asm/irq.h>
84 #include <asm/uaccess.h>
85 #include <scsi/scsi.h>
86 #include <scsi/scsi_host.h>
87 #include <scsi/scsi_tcq.h>
88 #include <scsi/scsi_cmnd.h>
89 #include "3w-9xxx.h"
90 
91 /* Globals */
92 #define TW_DRIVER_VERSION "2.26.02.007"
93 static TW_Device_Extension *twa_device_extension_list[TW_MAX_SLOT];
94 static unsigned int twa_device_extension_count;
95 static int twa_major = -1;
96 extern struct timezone sys_tz;
97 
98 /* Module parameters */
99 MODULE_AUTHOR ("AMCC");
100 MODULE_DESCRIPTION ("3ware 9000 Storage Controller Linux Driver");
101 MODULE_LICENSE("GPL");
102 MODULE_VERSION(TW_DRIVER_VERSION);
103 
104 /* Function prototypes */
105 static void twa_aen_queue_event(TW_Device_Extension *tw_dev, TW_Command_Apache_Header *header);
106 static int twa_aen_read_queue(TW_Device_Extension *tw_dev, int request_id);
107 static char *twa_aen_severity_lookup(unsigned char severity_code);
108 static void twa_aen_sync_time(TW_Device_Extension *tw_dev, int request_id);
109 static int twa_chrdev_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg);
110 static int twa_chrdev_open(struct inode *inode, struct file *file);
111 static int twa_fill_sense(TW_Device_Extension *tw_dev, int request_id, int copy_sense, int print_host);
112 static void twa_free_request_id(TW_Device_Extension *tw_dev,int request_id);
113 static void twa_get_request_id(TW_Device_Extension *tw_dev, int *request_id);
114 static int twa_initconnection(TW_Device_Extension *tw_dev, int message_credits,
115  			      u32 set_features, unsigned short current_fw_srl,
116 			      unsigned short current_fw_arch_id,
117 			      unsigned short current_fw_branch,
118 			      unsigned short current_fw_build,
119 			      unsigned short *fw_on_ctlr_srl,
120 			      unsigned short *fw_on_ctlr_arch_id,
121 			      unsigned short *fw_on_ctlr_branch,
122 			      unsigned short *fw_on_ctlr_build,
123 			      u32 *init_connect_result);
124 static void twa_load_sgl(TW_Command_Full *full_command_packet, int request_id, dma_addr_t dma_handle, int length);
125 static int twa_poll_response(TW_Device_Extension *tw_dev, int request_id, int seconds);
126 static int twa_poll_status_gone(TW_Device_Extension *tw_dev, u32 flag, int seconds);
127 static int twa_post_command_packet(TW_Device_Extension *tw_dev, int request_id, char internal);
128 static int twa_reset_device_extension(TW_Device_Extension *tw_dev, int ioctl_reset);
129 static int twa_reset_sequence(TW_Device_Extension *tw_dev, int soft_reset);
130 static int twa_scsiop_execute_scsi(TW_Device_Extension *tw_dev, int request_id, char *cdb, int use_sg, TW_SG_Entry *sglistarg);
131 static void twa_scsiop_execute_scsi_complete(TW_Device_Extension *tw_dev, int request_id);
132 static char *twa_string_lookup(twa_message_type *table, unsigned int aen_code);
133 static void twa_unmap_scsi_data(TW_Device_Extension *tw_dev, int request_id);
134 
135 /* Functions */
136 
137 /* Show some statistics about the card */
138 static ssize_t twa_show_stats(struct class_device *class_dev, char *buf)
139 {
140 	struct Scsi_Host *host = class_to_shost(class_dev);
141 	TW_Device_Extension *tw_dev = (TW_Device_Extension *)host->hostdata;
142 	unsigned long flags = 0;
143 	ssize_t len;
144 
145 	spin_lock_irqsave(tw_dev->host->host_lock, flags);
146 	len = snprintf(buf, PAGE_SIZE, "3w-9xxx Driver version: %s\n"
147 		       "Current commands posted:   %4d\n"
148 		       "Max commands posted:       %4d\n"
149 		       "Current pending commands:  %4d\n"
150 		       "Max pending commands:      %4d\n"
151 		       "Last sgl length:           %4d\n"
152 		       "Max sgl length:            %4d\n"
153 		       "Last sector count:         %4d\n"
154 		       "Max sector count:          %4d\n"
155 		       "SCSI Host Resets:          %4d\n"
156 		       "AEN's:                     %4d\n",
157 		       TW_DRIVER_VERSION,
158 		       tw_dev->posted_request_count,
159 		       tw_dev->max_posted_request_count,
160 		       tw_dev->pending_request_count,
161 		       tw_dev->max_pending_request_count,
162 		       tw_dev->sgl_entries,
163 		       tw_dev->max_sgl_entries,
164 		       tw_dev->sector_count,
165 		       tw_dev->max_sector_count,
166 		       tw_dev->num_resets,
167 		       tw_dev->aen_count);
168 	spin_unlock_irqrestore(tw_dev->host->host_lock, flags);
169 	return len;
170 } /* End twa_show_stats() */
171 
172 /* This function will set a devices queue depth */
173 static int twa_change_queue_depth(struct scsi_device *sdev, int queue_depth)
174 {
175 	if (queue_depth > TW_Q_LENGTH-2)
176 		queue_depth = TW_Q_LENGTH-2;
177 	scsi_adjust_queue_depth(sdev, MSG_ORDERED_TAG, queue_depth);
178 	return queue_depth;
179 } /* End twa_change_queue_depth() */
180 
181 /* Create sysfs 'stats' entry */
182 static struct class_device_attribute twa_host_stats_attr = {
183 	.attr = {
184 		.name = 	"stats",
185 		.mode =		S_IRUGO,
186 	},
187 	.show = twa_show_stats
188 };
189 
190 /* Host attributes initializer */
191 static struct class_device_attribute *twa_host_attrs[] = {
192 	&twa_host_stats_attr,
193 	NULL,
194 };
195 
196 /* File operations struct for character device */
197 static struct file_operations twa_fops = {
198 	.owner		= THIS_MODULE,
199 	.ioctl		= twa_chrdev_ioctl,
200 	.open		= twa_chrdev_open,
201 	.release	= NULL
202 };
203 
204 /* This function will complete an aen request from the isr */
205 static int twa_aen_complete(TW_Device_Extension *tw_dev, int request_id)
206 {
207 	TW_Command_Full *full_command_packet;
208 	TW_Command *command_packet;
209 	TW_Command_Apache_Header *header;
210 	unsigned short aen;
211 	int retval = 1;
212 
213 	header = (TW_Command_Apache_Header *)tw_dev->generic_buffer_virt[request_id];
214 	tw_dev->posted_request_count--;
215 	aen = le16_to_cpu(header->status_block.error);
216 	full_command_packet = tw_dev->command_packet_virt[request_id];
217 	command_packet = &full_command_packet->command.oldcommand;
218 
219 	/* First check for internal completion of set param for time sync */
220 	if (TW_OP_OUT(command_packet->opcode__sgloffset) == TW_OP_SET_PARAM) {
221 		/* Keep reading the queue in case there are more aen's */
222 		if (twa_aen_read_queue(tw_dev, request_id))
223 			goto out2;
224 	        else {
225 			retval = 0;
226 			goto out;
227 		}
228 	}
229 
230 	switch (aen) {
231 	case TW_AEN_QUEUE_EMPTY:
232 		/* Quit reading the queue if this is the last one */
233 		break;
234 	case TW_AEN_SYNC_TIME_WITH_HOST:
235 		twa_aen_sync_time(tw_dev, request_id);
236 		retval = 0;
237 		goto out;
238 	default:
239 		twa_aen_queue_event(tw_dev, header);
240 
241 		/* If there are more aen's, keep reading the queue */
242 		if (twa_aen_read_queue(tw_dev, request_id))
243 			goto out2;
244 		else {
245 			retval = 0;
246 			goto out;
247 		}
248 	}
249 	retval = 0;
250 out2:
251 	tw_dev->state[request_id] = TW_S_COMPLETED;
252 	twa_free_request_id(tw_dev, request_id);
253 	clear_bit(TW_IN_ATTENTION_LOOP, &tw_dev->flags);
254 out:
255 	return retval;
256 } /* End twa_aen_complete() */
257 
258 /* This function will drain aen queue */
259 static int twa_aen_drain_queue(TW_Device_Extension *tw_dev, int no_check_reset)
260 {
261 	int request_id = 0;
262 	char cdb[TW_MAX_CDB_LEN];
263 	TW_SG_Entry sglist[1];
264 	int finished = 0, count = 0;
265 	TW_Command_Full *full_command_packet;
266 	TW_Command_Apache_Header *header;
267 	unsigned short aen;
268 	int first_reset = 0, queue = 0, retval = 1;
269 
270 	if (no_check_reset)
271 		first_reset = 0;
272 	else
273 		first_reset = 1;
274 
275 	full_command_packet = tw_dev->command_packet_virt[request_id];
276 	memset(full_command_packet, 0, sizeof(TW_Command_Full));
277 
278 	/* Initialize cdb */
279 	memset(&cdb, 0, TW_MAX_CDB_LEN);
280 	cdb[0] = REQUEST_SENSE; /* opcode */
281 	cdb[4] = TW_ALLOCATION_LENGTH; /* allocation length */
282 
283 	/* Initialize sglist */
284 	memset(&sglist, 0, sizeof(TW_SG_Entry));
285 	sglist[0].length = TW_SECTOR_SIZE;
286 	sglist[0].address = tw_dev->generic_buffer_phys[request_id];
287 
288 	if (sglist[0].address & TW_ALIGNMENT_9000_SGL) {
289 		TW_PRINTK(tw_dev->host, TW_DRIVER, 0x1, "Found unaligned address during AEN drain");
290 		goto out;
291 	}
292 
293 	/* Mark internal command */
294 	tw_dev->srb[request_id] = NULL;
295 
296 	do {
297 		/* Send command to the board */
298 		if (twa_scsiop_execute_scsi(tw_dev, request_id, cdb, 1, sglist)) {
299 			TW_PRINTK(tw_dev->host, TW_DRIVER, 0x2, "Error posting request sense");
300 			goto out;
301 		}
302 
303 		/* Now poll for completion */
304 		if (twa_poll_response(tw_dev, request_id, 30)) {
305 			TW_PRINTK(tw_dev->host, TW_DRIVER, 0x3, "No valid response while draining AEN queue");
306 			tw_dev->posted_request_count--;
307 			goto out;
308 		}
309 
310 		tw_dev->posted_request_count--;
311 		header = (TW_Command_Apache_Header *)tw_dev->generic_buffer_virt[request_id];
312 		aen = le16_to_cpu(header->status_block.error);
313 		queue = 0;
314 		count++;
315 
316 		switch (aen) {
317 		case TW_AEN_QUEUE_EMPTY:
318 			if (first_reset != 1)
319 				goto out;
320 			else
321 				finished = 1;
322 			break;
323 		case TW_AEN_SOFT_RESET:
324 			if (first_reset == 0)
325 				first_reset = 1;
326 			else
327 				queue = 1;
328 			break;
329 		case TW_AEN_SYNC_TIME_WITH_HOST:
330 			break;
331 		default:
332 			queue = 1;
333 		}
334 
335 		/* Now queue an event info */
336 		if (queue)
337 			twa_aen_queue_event(tw_dev, header);
338 	} while ((finished == 0) && (count < TW_MAX_AEN_DRAIN));
339 
340 	if (count == TW_MAX_AEN_DRAIN)
341 		goto out;
342 
343 	retval = 0;
344 out:
345 	tw_dev->state[request_id] = TW_S_INITIAL;
346 	return retval;
347 } /* End twa_aen_drain_queue() */
348 
349 /* This function will queue an event */
350 static void twa_aen_queue_event(TW_Device_Extension *tw_dev, TW_Command_Apache_Header *header)
351 {
352 	u32 local_time;
353 	struct timeval time;
354 	TW_Event *event;
355 	unsigned short aen;
356 	char host[16];
357 	char *error_str;
358 
359 	tw_dev->aen_count++;
360 
361 	/* Fill out event info */
362 	event = tw_dev->event_queue[tw_dev->error_index];
363 
364 	/* Check for clobber */
365 	host[0] = '\0';
366 	if (tw_dev->host) {
367 		sprintf(host, " scsi%d:", tw_dev->host->host_no);
368 		if (event->retrieved == TW_AEN_NOT_RETRIEVED)
369 			tw_dev->aen_clobber = 1;
370 	}
371 
372 	aen = le16_to_cpu(header->status_block.error);
373 	memset(event, 0, sizeof(TW_Event));
374 
375 	event->severity = TW_SEV_OUT(header->status_block.severity__reserved);
376 	do_gettimeofday(&time);
377 	local_time = (u32)(time.tv_sec - (sys_tz.tz_minuteswest * 60));
378 	event->time_stamp_sec = local_time;
379 	event->aen_code = aen;
380 	event->retrieved = TW_AEN_NOT_RETRIEVED;
381 	event->sequence_id = tw_dev->error_sequence_id;
382 	tw_dev->error_sequence_id++;
383 
384 	/* Check for embedded error string */
385 	error_str = &(header->err_specific_desc[strlen(header->err_specific_desc)+1]);
386 
387 	header->err_specific_desc[sizeof(header->err_specific_desc) - 1] = '\0';
388 	event->parameter_len = strlen(header->err_specific_desc);
389 	memcpy(event->parameter_data, header->err_specific_desc, event->parameter_len + (error_str[0] == '\0' ? 0 : (1 + strlen(error_str))));
390 	if (event->severity != TW_AEN_SEVERITY_DEBUG)
391 		printk(KERN_WARNING "3w-9xxx:%s AEN: %s (0x%02X:0x%04X): %s:%s.\n",
392 		       host,
393 		       twa_aen_severity_lookup(TW_SEV_OUT(header->status_block.severity__reserved)),
394 		       TW_MESSAGE_SOURCE_CONTROLLER_EVENT, aen,
395 		       error_str[0] == '\0' ? twa_string_lookup(twa_aen_table, aen) : error_str,
396 		       header->err_specific_desc);
397 	else
398 		tw_dev->aen_count--;
399 
400 	if ((tw_dev->error_index + 1) == TW_Q_LENGTH)
401 		tw_dev->event_queue_wrapped = 1;
402 	tw_dev->error_index = (tw_dev->error_index + 1 ) % TW_Q_LENGTH;
403 } /* End twa_aen_queue_event() */
404 
405 /* This function will read the aen queue from the isr */
406 static int twa_aen_read_queue(TW_Device_Extension *tw_dev, int request_id)
407 {
408 	char cdb[TW_MAX_CDB_LEN];
409 	TW_SG_Entry sglist[1];
410 	TW_Command_Full *full_command_packet;
411 	int retval = 1;
412 
413 	full_command_packet = tw_dev->command_packet_virt[request_id];
414 	memset(full_command_packet, 0, sizeof(TW_Command_Full));
415 
416 	/* Initialize cdb */
417 	memset(&cdb, 0, TW_MAX_CDB_LEN);
418 	cdb[0] = REQUEST_SENSE; /* opcode */
419 	cdb[4] = TW_ALLOCATION_LENGTH; /* allocation length */
420 
421 	/* Initialize sglist */
422 	memset(&sglist, 0, sizeof(TW_SG_Entry));
423 	sglist[0].length = TW_SECTOR_SIZE;
424 	sglist[0].address = tw_dev->generic_buffer_phys[request_id];
425 
426 	/* Mark internal command */
427 	tw_dev->srb[request_id] = NULL;
428 
429 	/* Now post the command packet */
430 	if (twa_scsiop_execute_scsi(tw_dev, request_id, cdb, 1, sglist)) {
431 		TW_PRINTK(tw_dev->host, TW_DRIVER, 0x4, "Post failed while reading AEN queue");
432 		goto out;
433 	}
434 	retval = 0;
435 out:
436 	return retval;
437 } /* End twa_aen_read_queue() */
438 
439 /* This function will look up an AEN severity string */
440 static char *twa_aen_severity_lookup(unsigned char severity_code)
441 {
442 	char *retval = NULL;
443 
444 	if ((severity_code < (unsigned char) TW_AEN_SEVERITY_ERROR) ||
445 	    (severity_code > (unsigned char) TW_AEN_SEVERITY_DEBUG))
446 		goto out;
447 
448 	retval = twa_aen_severity_table[severity_code];
449 out:
450 	return retval;
451 } /* End twa_aen_severity_lookup() */
452 
453 /* This function will sync firmware time with the host time */
454 static void twa_aen_sync_time(TW_Device_Extension *tw_dev, int request_id)
455 {
456 	u32 schedulertime;
457 	struct timeval utc;
458 	TW_Command_Full *full_command_packet;
459 	TW_Command *command_packet;
460 	TW_Param_Apache *param;
461 	u32 local_time;
462 
463 	/* Fill out the command packet */
464 	full_command_packet = tw_dev->command_packet_virt[request_id];
465 	memset(full_command_packet, 0, sizeof(TW_Command_Full));
466 	command_packet = &full_command_packet->command.oldcommand;
467 	command_packet->opcode__sgloffset = TW_OPSGL_IN(2, TW_OP_SET_PARAM);
468 	command_packet->request_id = request_id;
469 	command_packet->byte8_offset.param.sgl[0].address = TW_CPU_TO_SGL(tw_dev->generic_buffer_phys[request_id]);
470 	command_packet->byte8_offset.param.sgl[0].length = cpu_to_le32(TW_SECTOR_SIZE);
471 	command_packet->size = TW_COMMAND_SIZE;
472 	command_packet->byte6_offset.parameter_count = cpu_to_le16(1);
473 
474 	/* Setup the param */
475 	param = (TW_Param_Apache *)tw_dev->generic_buffer_virt[request_id];
476 	memset(param, 0, TW_SECTOR_SIZE);
477 	param->table_id = cpu_to_le16(TW_TIMEKEEP_TABLE | 0x8000); /* Controller time keep table */
478 	param->parameter_id = cpu_to_le16(0x3); /* SchedulerTime */
479 	param->parameter_size_bytes = cpu_to_le16(4);
480 
481 	/* Convert system time in UTC to local time seconds since last
482            Sunday 12:00AM */
483 	do_gettimeofday(&utc);
484 	local_time = (u32)(utc.tv_sec - (sys_tz.tz_minuteswest * 60));
485 	schedulertime = local_time - (3 * 86400);
486 	schedulertime = cpu_to_le32(schedulertime % 604800);
487 
488 	memcpy(param->data, &schedulertime, sizeof(u32));
489 
490 	/* Mark internal command */
491 	tw_dev->srb[request_id] = NULL;
492 
493 	/* Now post the command */
494 	twa_post_command_packet(tw_dev, request_id, 1);
495 } /* End twa_aen_sync_time() */
496 
497 /* This function will allocate memory and check if it is correctly aligned */
498 static int twa_allocate_memory(TW_Device_Extension *tw_dev, int size, int which)
499 {
500 	int i;
501 	dma_addr_t dma_handle;
502 	unsigned long *cpu_addr;
503 	int retval = 1;
504 
505 	cpu_addr = pci_alloc_consistent(tw_dev->tw_pci_dev, size*TW_Q_LENGTH, &dma_handle);
506 	if (!cpu_addr) {
507 		TW_PRINTK(tw_dev->host, TW_DRIVER, 0x5, "Memory allocation failed");
508 		goto out;
509 	}
510 
511 	if ((unsigned long)cpu_addr % (TW_ALIGNMENT_9000)) {
512 		TW_PRINTK(tw_dev->host, TW_DRIVER, 0x6, "Failed to allocate correctly aligned memory");
513 		pci_free_consistent(tw_dev->tw_pci_dev, size*TW_Q_LENGTH, cpu_addr, dma_handle);
514 		goto out;
515 	}
516 
517 	memset(cpu_addr, 0, size*TW_Q_LENGTH);
518 
519 	for (i = 0; i < TW_Q_LENGTH; i++) {
520 		switch(which) {
521 		case 0:
522 			tw_dev->command_packet_phys[i] = dma_handle+(i*size);
523 			tw_dev->command_packet_virt[i] = (TW_Command_Full *)((unsigned char *)cpu_addr + (i*size));
524 			break;
525 		case 1:
526 			tw_dev->generic_buffer_phys[i] = dma_handle+(i*size);
527 			tw_dev->generic_buffer_virt[i] = (unsigned long *)((unsigned char *)cpu_addr + (i*size));
528 			break;
529 		}
530 	}
531 	retval = 0;
532 out:
533 	return retval;
534 } /* End twa_allocate_memory() */
535 
536 /* This function will check the status register for unexpected bits */
537 static int twa_check_bits(u32 status_reg_value)
538 {
539 	int retval = 1;
540 
541 	if ((status_reg_value & TW_STATUS_EXPECTED_BITS) != TW_STATUS_EXPECTED_BITS)
542 		goto out;
543 	if ((status_reg_value & TW_STATUS_UNEXPECTED_BITS) != 0)
544 		goto out;
545 
546 	retval = 0;
547 out:
548 	return retval;
549 } /* End twa_check_bits() */
550 
551 /* This function will check the srl and decide if we are compatible  */
552 static int twa_check_srl(TW_Device_Extension *tw_dev, int *flashed)
553 {
554 	int retval = 1;
555 	unsigned short fw_on_ctlr_srl = 0, fw_on_ctlr_arch_id = 0;
556 	unsigned short fw_on_ctlr_branch = 0, fw_on_ctlr_build = 0;
557 	u32 init_connect_result = 0;
558 
559 	if (twa_initconnection(tw_dev, TW_INIT_MESSAGE_CREDITS,
560 			       TW_EXTENDED_INIT_CONNECT, TW_CURRENT_DRIVER_SRL,
561 			       TW_9000_ARCH_ID, TW_CURRENT_DRIVER_BRANCH,
562 			       TW_CURRENT_DRIVER_BUILD, &fw_on_ctlr_srl,
563 			       &fw_on_ctlr_arch_id, &fw_on_ctlr_branch,
564 			       &fw_on_ctlr_build, &init_connect_result)) {
565 		TW_PRINTK(tw_dev->host, TW_DRIVER, 0x7, "Initconnection failed while checking SRL");
566 		goto out;
567 	}
568 
569 	tw_dev->working_srl = fw_on_ctlr_srl;
570 	tw_dev->working_branch = fw_on_ctlr_branch;
571 	tw_dev->working_build = fw_on_ctlr_build;
572 
573 	/* Try base mode compatibility */
574 	if (!(init_connect_result & TW_CTLR_FW_COMPATIBLE)) {
575 		if (twa_initconnection(tw_dev, TW_INIT_MESSAGE_CREDITS,
576 				       TW_EXTENDED_INIT_CONNECT,
577 				       TW_BASE_FW_SRL, TW_9000_ARCH_ID,
578 				       TW_BASE_FW_BRANCH, TW_BASE_FW_BUILD,
579 				       &fw_on_ctlr_srl, &fw_on_ctlr_arch_id,
580 				       &fw_on_ctlr_branch, &fw_on_ctlr_build,
581 				       &init_connect_result)) {
582 			TW_PRINTK(tw_dev->host, TW_DRIVER, 0xa, "Initconnection (base mode) failed while checking SRL");
583 			goto out;
584 		}
585 		if (!(init_connect_result & TW_CTLR_FW_COMPATIBLE)) {
586 			if (TW_CURRENT_DRIVER_SRL > fw_on_ctlr_srl) {
587 				TW_PRINTK(tw_dev->host, TW_DRIVER, 0x32, "Firmware and driver incompatibility: please upgrade firmware");
588 			} else {
589 				TW_PRINTK(tw_dev->host, TW_DRIVER, 0x33, "Firmware and driver incompatibility: please upgrade driver");
590 			}
591 			goto out;
592 		}
593 		tw_dev->working_srl = TW_BASE_FW_SRL;
594 		tw_dev->working_branch = TW_BASE_FW_BRANCH;
595 		tw_dev->working_build = TW_BASE_FW_BUILD;
596 	}
597 	retval = 0;
598 out:
599 	return retval;
600 } /* End twa_check_srl() */
601 
602 /* This function handles ioctl for the character device */
603 static int twa_chrdev_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
604 {
605 	long timeout;
606 	unsigned long *cpu_addr, data_buffer_length_adjusted = 0, flags = 0;
607 	dma_addr_t dma_handle;
608 	int request_id = 0;
609 	unsigned int sequence_id = 0;
610 	unsigned char event_index, start_index;
611 	TW_Ioctl_Driver_Command driver_command;
612 	TW_Ioctl_Buf_Apache *tw_ioctl;
613 	TW_Lock *tw_lock;
614 	TW_Command_Full *full_command_packet;
615 	TW_Compatibility_Info *tw_compat_info;
616 	TW_Event *event;
617 	struct timeval current_time;
618 	u32 current_time_ms;
619 	TW_Device_Extension *tw_dev = twa_device_extension_list[iminor(inode)];
620 	int retval = TW_IOCTL_ERROR_OS_EFAULT;
621 	void __user *argp = (void __user *)arg;
622 
623 	/* Only let one of these through at a time */
624 	if (mutex_lock_interruptible(&tw_dev->ioctl_lock)) {
625 		retval = TW_IOCTL_ERROR_OS_EINTR;
626 		goto out;
627 	}
628 
629 	/* First copy down the driver command */
630 	if (copy_from_user(&driver_command, argp, sizeof(TW_Ioctl_Driver_Command)))
631 		goto out2;
632 
633 	/* Check data buffer size */
634 	if (driver_command.buffer_length > TW_MAX_SECTORS * 512) {
635 		retval = TW_IOCTL_ERROR_OS_EINVAL;
636 		goto out2;
637 	}
638 
639 	/* Hardware can only do multiple of 512 byte transfers */
640 	data_buffer_length_adjusted = (driver_command.buffer_length + 511) & ~511;
641 
642 	/* Now allocate ioctl buf memory */
643 	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);
644 	if (!cpu_addr) {
645 		retval = TW_IOCTL_ERROR_OS_ENOMEM;
646 		goto out2;
647 	}
648 
649 	tw_ioctl = (TW_Ioctl_Buf_Apache *)cpu_addr;
650 
651 	/* Now copy down the entire ioctl */
652 	if (copy_from_user(tw_ioctl, argp, driver_command.buffer_length + sizeof(TW_Ioctl_Buf_Apache) - 1))
653 		goto out3;
654 
655 	/* See which ioctl we are doing */
656 	switch (cmd) {
657 	case TW_IOCTL_FIRMWARE_PASS_THROUGH:
658 		spin_lock_irqsave(tw_dev->host->host_lock, flags);
659 		twa_get_request_id(tw_dev, &request_id);
660 
661 		/* Flag internal command */
662 		tw_dev->srb[request_id] = NULL;
663 
664 		/* Flag chrdev ioctl */
665 		tw_dev->chrdev_request_id = request_id;
666 
667 		full_command_packet = &tw_ioctl->firmware_command;
668 
669 		/* Load request id and sglist for both command types */
670 		twa_load_sgl(full_command_packet, request_id, dma_handle, data_buffer_length_adjusted);
671 
672 		memcpy(tw_dev->command_packet_virt[request_id], &(tw_ioctl->firmware_command), sizeof(TW_Command_Full));
673 
674 		/* Now post the command packet to the controller */
675 		twa_post_command_packet(tw_dev, request_id, 1);
676 		spin_unlock_irqrestore(tw_dev->host->host_lock, flags);
677 
678 		timeout = TW_IOCTL_CHRDEV_TIMEOUT*HZ;
679 
680 		/* Now wait for command to complete */
681 		timeout = wait_event_timeout(tw_dev->ioctl_wqueue, tw_dev->chrdev_request_id == TW_IOCTL_CHRDEV_FREE, timeout);
682 
683 		/* See if we reset while waiting for the ioctl to complete */
684 		if (test_bit(TW_IN_RESET, &tw_dev->flags)) {
685 			clear_bit(TW_IN_RESET, &tw_dev->flags);
686 			retval = TW_IOCTL_ERROR_OS_ERESTARTSYS;
687 			goto out3;
688 		}
689 
690 		/* We timed out, and didn't get an interrupt */
691 		if (tw_dev->chrdev_request_id != TW_IOCTL_CHRDEV_FREE) {
692 			/* Now we need to reset the board */
693 			printk(KERN_WARNING "3w-9xxx: scsi%d: WARNING: (0x%02X:0x%04X): Character ioctl (0x%x) timed out, resetting card.\n",
694 			       tw_dev->host->host_no, TW_DRIVER, 0xc,
695 			       cmd);
696 			retval = TW_IOCTL_ERROR_OS_EIO;
697 			spin_lock_irqsave(tw_dev->host->host_lock, flags);
698 			tw_dev->state[request_id] = TW_S_COMPLETED;
699 			twa_free_request_id(tw_dev, request_id);
700 			tw_dev->posted_request_count--;
701 			spin_unlock_irqrestore(tw_dev->host->host_lock, flags);
702 			twa_reset_device_extension(tw_dev, 1);
703 			goto out3;
704 		}
705 
706 		/* Now copy in the command packet response */
707 		memcpy(&(tw_ioctl->firmware_command), tw_dev->command_packet_virt[request_id], sizeof(TW_Command_Full));
708 
709 		/* Now complete the io */
710 		spin_lock_irqsave(tw_dev->host->host_lock, flags);
711 		tw_dev->posted_request_count--;
712 		tw_dev->state[request_id] = TW_S_COMPLETED;
713 		twa_free_request_id(tw_dev, request_id);
714 		spin_unlock_irqrestore(tw_dev->host->host_lock, flags);
715 		break;
716 	case TW_IOCTL_GET_COMPATIBILITY_INFO:
717 		tw_ioctl->driver_command.status = 0;
718 		/* Copy compatiblity struct into ioctl data buffer */
719 		tw_compat_info = (TW_Compatibility_Info *)tw_ioctl->data_buffer;
720 		strncpy(tw_compat_info->driver_version, TW_DRIVER_VERSION, strlen(TW_DRIVER_VERSION));
721 		tw_compat_info->working_srl = tw_dev->working_srl;
722 		tw_compat_info->working_branch = tw_dev->working_branch;
723 		tw_compat_info->working_build = tw_dev->working_build;
724 		tw_compat_info->driver_srl_high = TW_CURRENT_DRIVER_SRL;
725 		tw_compat_info->driver_branch_high = TW_CURRENT_DRIVER_BRANCH;
726 		tw_compat_info->driver_build_high = TW_CURRENT_DRIVER_BUILD;
727 		tw_compat_info->driver_srl_low = TW_BASE_FW_SRL;
728 		tw_compat_info->driver_branch_low = TW_BASE_FW_BRANCH;
729 		tw_compat_info->driver_build_low = TW_BASE_FW_BUILD;
730 		break;
731 	case TW_IOCTL_GET_LAST_EVENT:
732 		if (tw_dev->event_queue_wrapped) {
733 			if (tw_dev->aen_clobber) {
734 				tw_ioctl->driver_command.status = TW_IOCTL_ERROR_STATUS_AEN_CLOBBER;
735 				tw_dev->aen_clobber = 0;
736 			} else
737 				tw_ioctl->driver_command.status = 0;
738 		} else {
739 			if (!tw_dev->error_index) {
740 				tw_ioctl->driver_command.status = TW_IOCTL_ERROR_STATUS_NO_MORE_EVENTS;
741 				break;
742 			}
743 			tw_ioctl->driver_command.status = 0;
744 		}
745 		event_index = (tw_dev->error_index - 1 + TW_Q_LENGTH) % TW_Q_LENGTH;
746 		memcpy(tw_ioctl->data_buffer, tw_dev->event_queue[event_index], sizeof(TW_Event));
747 		tw_dev->event_queue[event_index]->retrieved = TW_AEN_RETRIEVED;
748 		break;
749 	case TW_IOCTL_GET_FIRST_EVENT:
750 		if (tw_dev->event_queue_wrapped) {
751 			if (tw_dev->aen_clobber) {
752 				tw_ioctl->driver_command.status = TW_IOCTL_ERROR_STATUS_AEN_CLOBBER;
753 				tw_dev->aen_clobber = 0;
754 			} else
755 				tw_ioctl->driver_command.status = 0;
756 			event_index = tw_dev->error_index;
757 		} else {
758 			if (!tw_dev->error_index) {
759 				tw_ioctl->driver_command.status = TW_IOCTL_ERROR_STATUS_NO_MORE_EVENTS;
760 				break;
761 			}
762 			tw_ioctl->driver_command.status = 0;
763 			event_index = 0;
764 		}
765 		memcpy(tw_ioctl->data_buffer, tw_dev->event_queue[event_index], sizeof(TW_Event));
766 		tw_dev->event_queue[event_index]->retrieved = TW_AEN_RETRIEVED;
767 		break;
768 	case TW_IOCTL_GET_NEXT_EVENT:
769 		event = (TW_Event *)tw_ioctl->data_buffer;
770 		sequence_id = event->sequence_id;
771 		tw_ioctl->driver_command.status = 0;
772 
773 		if (tw_dev->event_queue_wrapped) {
774 			if (tw_dev->aen_clobber) {
775 				tw_ioctl->driver_command.status = TW_IOCTL_ERROR_STATUS_AEN_CLOBBER;
776 				tw_dev->aen_clobber = 0;
777 			}
778 			start_index = tw_dev->error_index;
779 		} else {
780 			if (!tw_dev->error_index) {
781 				tw_ioctl->driver_command.status = TW_IOCTL_ERROR_STATUS_NO_MORE_EVENTS;
782 				break;
783 			}
784 			start_index = 0;
785 		}
786 		event_index = (start_index + sequence_id - tw_dev->event_queue[start_index]->sequence_id + 1) % TW_Q_LENGTH;
787 
788 		if (!(tw_dev->event_queue[event_index]->sequence_id > sequence_id)) {
789 			if (tw_ioctl->driver_command.status == TW_IOCTL_ERROR_STATUS_AEN_CLOBBER)
790 				tw_dev->aen_clobber = 1;
791 			tw_ioctl->driver_command.status = TW_IOCTL_ERROR_STATUS_NO_MORE_EVENTS;
792 			break;
793 		}
794 		memcpy(tw_ioctl->data_buffer, tw_dev->event_queue[event_index], sizeof(TW_Event));
795 		tw_dev->event_queue[event_index]->retrieved = TW_AEN_RETRIEVED;
796 		break;
797 	case TW_IOCTL_GET_PREVIOUS_EVENT:
798 		event = (TW_Event *)tw_ioctl->data_buffer;
799 		sequence_id = event->sequence_id;
800 		tw_ioctl->driver_command.status = 0;
801 
802 		if (tw_dev->event_queue_wrapped) {
803 			if (tw_dev->aen_clobber) {
804 				tw_ioctl->driver_command.status = TW_IOCTL_ERROR_STATUS_AEN_CLOBBER;
805 				tw_dev->aen_clobber = 0;
806 			}
807 			start_index = tw_dev->error_index;
808 		} else {
809 			if (!tw_dev->error_index) {
810 				tw_ioctl->driver_command.status = TW_IOCTL_ERROR_STATUS_NO_MORE_EVENTS;
811 				break;
812 			}
813 			start_index = 0;
814 		}
815 		event_index = (start_index + sequence_id - tw_dev->event_queue[start_index]->sequence_id - 1) % TW_Q_LENGTH;
816 
817 		if (!(tw_dev->event_queue[event_index]->sequence_id < sequence_id)) {
818 			if (tw_ioctl->driver_command.status == TW_IOCTL_ERROR_STATUS_AEN_CLOBBER)
819 				tw_dev->aen_clobber = 1;
820 			tw_ioctl->driver_command.status = TW_IOCTL_ERROR_STATUS_NO_MORE_EVENTS;
821 			break;
822 		}
823 		memcpy(tw_ioctl->data_buffer, tw_dev->event_queue[event_index], sizeof(TW_Event));
824 		tw_dev->event_queue[event_index]->retrieved = TW_AEN_RETRIEVED;
825 		break;
826 	case TW_IOCTL_GET_LOCK:
827 		tw_lock = (TW_Lock *)tw_ioctl->data_buffer;
828 		do_gettimeofday(&current_time);
829 		current_time_ms = (current_time.tv_sec * 1000) + (current_time.tv_usec / 1000);
830 
831 		if ((tw_lock->force_flag == 1) || (tw_dev->ioctl_sem_lock == 0) || (current_time_ms >= tw_dev->ioctl_msec)) {
832 			tw_dev->ioctl_sem_lock = 1;
833 			tw_dev->ioctl_msec = current_time_ms + tw_lock->timeout_msec;
834 			tw_ioctl->driver_command.status = 0;
835 			tw_lock->time_remaining_msec = tw_lock->timeout_msec;
836 		} else {
837 			tw_ioctl->driver_command.status = TW_IOCTL_ERROR_STATUS_LOCKED;
838 			tw_lock->time_remaining_msec = tw_dev->ioctl_msec - current_time_ms;
839 		}
840 		break;
841 	case TW_IOCTL_RELEASE_LOCK:
842 		if (tw_dev->ioctl_sem_lock == 1) {
843 			tw_dev->ioctl_sem_lock = 0;
844 			tw_ioctl->driver_command.status = 0;
845 		} else {
846 			tw_ioctl->driver_command.status = TW_IOCTL_ERROR_STATUS_NOT_LOCKED;
847 		}
848 		break;
849 	default:
850 		retval = TW_IOCTL_ERROR_OS_ENOTTY;
851 		goto out3;
852 	}
853 
854 	/* Now copy the entire response to userspace */
855 	if (copy_to_user(argp, tw_ioctl, sizeof(TW_Ioctl_Buf_Apache) + driver_command.buffer_length - 1) == 0)
856 		retval = 0;
857 out3:
858 	/* Now free ioctl buf memory */
859 	dma_free_coherent(&tw_dev->tw_pci_dev->dev, data_buffer_length_adjusted+sizeof(TW_Ioctl_Buf_Apache) - 1, cpu_addr, dma_handle);
860 out2:
861 	mutex_unlock(&tw_dev->ioctl_lock);
862 out:
863 	return retval;
864 } /* End twa_chrdev_ioctl() */
865 
866 /* This function handles open for the character device */
867 static int twa_chrdev_open(struct inode *inode, struct file *file)
868 {
869 	unsigned int minor_number;
870 	int retval = TW_IOCTL_ERROR_OS_ENODEV;
871 
872 	minor_number = iminor(inode);
873 	if (minor_number >= twa_device_extension_count)
874 		goto out;
875 	retval = 0;
876 out:
877 	return retval;
878 } /* End twa_chrdev_open() */
879 
880 /* This function will print readable messages from status register errors */
881 static int twa_decode_bits(TW_Device_Extension *tw_dev, u32 status_reg_value)
882 {
883 	int retval = 1;
884 
885 	/* Check for various error conditions and handle them appropriately */
886 	if (status_reg_value & TW_STATUS_PCI_PARITY_ERROR) {
887 		TW_PRINTK(tw_dev->host, TW_DRIVER, 0xc, "PCI Parity Error: clearing");
888 		writel(TW_CONTROL_CLEAR_PARITY_ERROR, TW_CONTROL_REG_ADDR(tw_dev));
889 	}
890 
891 	if (status_reg_value & TW_STATUS_PCI_ABORT) {
892 		TW_PRINTK(tw_dev->host, TW_DRIVER, 0xd, "PCI Abort: clearing");
893 		writel(TW_CONTROL_CLEAR_PCI_ABORT, TW_CONTROL_REG_ADDR(tw_dev));
894 		pci_write_config_word(tw_dev->tw_pci_dev, PCI_STATUS, TW_PCI_CLEAR_PCI_ABORT);
895 	}
896 
897 	if (status_reg_value & TW_STATUS_QUEUE_ERROR) {
898 		TW_PRINTK(tw_dev->host, TW_DRIVER, 0xe, "Controller Queue Error: clearing");
899 		writel(TW_CONTROL_CLEAR_QUEUE_ERROR, TW_CONTROL_REG_ADDR(tw_dev));
900 	}
901 
902 	if (status_reg_value & TW_STATUS_MICROCONTROLLER_ERROR) {
903 		if (tw_dev->reset_print == 0) {
904 			TW_PRINTK(tw_dev->host, TW_DRIVER, 0x10, "Microcontroller Error: clearing");
905 			tw_dev->reset_print = 1;
906 		}
907 		goto out;
908 	}
909 	retval = 0;
910 out:
911 	return retval;
912 } /* End twa_decode_bits() */
913 
914 /* This function will empty the response queue */
915 static int twa_empty_response_queue(TW_Device_Extension *tw_dev)
916 {
917 	u32 status_reg_value, response_que_value;
918 	int count = 0, retval = 1;
919 
920 	status_reg_value = readl(TW_STATUS_REG_ADDR(tw_dev));
921 
922 	while (((status_reg_value & TW_STATUS_RESPONSE_QUEUE_EMPTY) == 0) && (count < TW_MAX_RESPONSE_DRAIN)) {
923 		response_que_value = readl(TW_RESPONSE_QUEUE_REG_ADDR(tw_dev));
924 		status_reg_value = readl(TW_STATUS_REG_ADDR(tw_dev));
925 		count++;
926 	}
927 	if (count == TW_MAX_RESPONSE_DRAIN)
928 		goto out;
929 
930 	retval = 0;
931 out:
932 	return retval;
933 } /* End twa_empty_response_queue() */
934 
935 /* This function will clear the pchip/response queue on 9550SX */
936 static int twa_empty_response_queue_large(TW_Device_Extension *tw_dev)
937 {
938 	u32 response_que_value = 0;
939 	unsigned long before;
940 	int retval = 1;
941 
942 	if (tw_dev->tw_pci_dev->device == PCI_DEVICE_ID_3WARE_9550SX) {
943 		before = jiffies;
944 		while ((response_que_value & TW_9550SX_DRAIN_COMPLETED) != TW_9550SX_DRAIN_COMPLETED) {
945 			response_que_value = readl(TW_RESPONSE_QUEUE_REG_ADDR_LARGE(tw_dev));
946 			if (time_after(jiffies, before + HZ * 30))
947 				goto out;
948 		}
949 		/* P-chip settle time */
950 		msleep(500);
951 		retval = 0;
952 	} else
953 		retval = 0;
954 out:
955 	return retval;
956 } /* End twa_empty_response_queue_large() */
957 
958 /* This function passes sense keys from firmware to scsi layer */
959 static int twa_fill_sense(TW_Device_Extension *tw_dev, int request_id, int copy_sense, int print_host)
960 {
961 	TW_Command_Full *full_command_packet;
962 	unsigned short error;
963 	int retval = 1;
964 	char *error_str;
965 
966 	full_command_packet = tw_dev->command_packet_virt[request_id];
967 
968 	/* Check for embedded error string */
969 	error_str = &(full_command_packet->header.err_specific_desc[strlen(full_command_packet->header.err_specific_desc) + 1]);
970 
971 	/* Don't print error for Logical unit not supported during rollcall */
972 	error = le16_to_cpu(full_command_packet->header.status_block.error);
973 	if ((error != TW_ERROR_LOGICAL_UNIT_NOT_SUPPORTED) && (error != TW_ERROR_UNIT_OFFLINE)) {
974 		if (print_host)
975 			printk(KERN_WARNING "3w-9xxx: scsi%d: ERROR: (0x%02X:0x%04X): %s:%s.\n",
976 			       tw_dev->host->host_no,
977 			       TW_MESSAGE_SOURCE_CONTROLLER_ERROR,
978 			       full_command_packet->header.status_block.error,
979 			       error_str[0] == '\0' ?
980 			       twa_string_lookup(twa_error_table,
981 						 full_command_packet->header.status_block.error) : error_str,
982 			       full_command_packet->header.err_specific_desc);
983 		else
984 			printk(KERN_WARNING "3w-9xxx: ERROR: (0x%02X:0x%04X): %s:%s.\n",
985 			       TW_MESSAGE_SOURCE_CONTROLLER_ERROR,
986 			       full_command_packet->header.status_block.error,
987 			       error_str[0] == '\0' ?
988 			       twa_string_lookup(twa_error_table,
989 						 full_command_packet->header.status_block.error) : error_str,
990 			       full_command_packet->header.err_specific_desc);
991 	}
992 
993 	if (copy_sense) {
994 		memcpy(tw_dev->srb[request_id]->sense_buffer, full_command_packet->header.sense_data, TW_SENSE_DATA_LENGTH);
995 		tw_dev->srb[request_id]->result = (full_command_packet->command.newcommand.status << 1);
996 		retval = TW_ISR_DONT_RESULT;
997 		goto out;
998 	}
999 	retval = 0;
1000 out:
1001 	return retval;
1002 } /* End twa_fill_sense() */
1003 
1004 /* This function will free up device extension resources */
1005 static void twa_free_device_extension(TW_Device_Extension *tw_dev)
1006 {
1007 	if (tw_dev->command_packet_virt[0])
1008 		pci_free_consistent(tw_dev->tw_pci_dev,
1009 				    sizeof(TW_Command_Full)*TW_Q_LENGTH,
1010 				    tw_dev->command_packet_virt[0],
1011 				    tw_dev->command_packet_phys[0]);
1012 
1013 	if (tw_dev->generic_buffer_virt[0])
1014 		pci_free_consistent(tw_dev->tw_pci_dev,
1015 				    TW_SECTOR_SIZE*TW_Q_LENGTH,
1016 				    tw_dev->generic_buffer_virt[0],
1017 				    tw_dev->generic_buffer_phys[0]);
1018 
1019 	kfree(tw_dev->event_queue[0]);
1020 } /* End twa_free_device_extension() */
1021 
1022 /* This function will free a request id */
1023 static void twa_free_request_id(TW_Device_Extension *tw_dev, int request_id)
1024 {
1025 	tw_dev->free_queue[tw_dev->free_tail] = request_id;
1026 	tw_dev->state[request_id] = TW_S_FINISHED;
1027 	tw_dev->free_tail = (tw_dev->free_tail + 1) % TW_Q_LENGTH;
1028 } /* End twa_free_request_id() */
1029 
1030 /* This function will get parameter table entries from the firmware */
1031 static void *twa_get_param(TW_Device_Extension *tw_dev, int request_id, int table_id, int parameter_id, int parameter_size_bytes)
1032 {
1033 	TW_Command_Full *full_command_packet;
1034 	TW_Command *command_packet;
1035 	TW_Param_Apache *param;
1036 	unsigned long param_value;
1037 	void *retval = NULL;
1038 
1039 	/* Setup the command packet */
1040 	full_command_packet = tw_dev->command_packet_virt[request_id];
1041 	memset(full_command_packet, 0, sizeof(TW_Command_Full));
1042 	command_packet = &full_command_packet->command.oldcommand;
1043 
1044 	command_packet->opcode__sgloffset = TW_OPSGL_IN(2, TW_OP_GET_PARAM);
1045 	command_packet->size              = TW_COMMAND_SIZE;
1046 	command_packet->request_id        = request_id;
1047 	command_packet->byte6_offset.block_count = cpu_to_le16(1);
1048 
1049 	/* Now setup the param */
1050 	param = (TW_Param_Apache *)tw_dev->generic_buffer_virt[request_id];
1051 	memset(param, 0, TW_SECTOR_SIZE);
1052 	param->table_id = cpu_to_le16(table_id | 0x8000);
1053 	param->parameter_id = cpu_to_le16(parameter_id);
1054 	param->parameter_size_bytes = cpu_to_le16(parameter_size_bytes);
1055 	param_value = tw_dev->generic_buffer_phys[request_id];
1056 
1057 	command_packet->byte8_offset.param.sgl[0].address = TW_CPU_TO_SGL(param_value);
1058 	command_packet->byte8_offset.param.sgl[0].length = cpu_to_le32(TW_SECTOR_SIZE);
1059 
1060 	/* Post the command packet to the board */
1061 	twa_post_command_packet(tw_dev, request_id, 1);
1062 
1063 	/* Poll for completion */
1064 	if (twa_poll_response(tw_dev, request_id, 30))
1065 		TW_PRINTK(tw_dev->host, TW_DRIVER, 0x13, "No valid response during get param")
1066 	else
1067 		retval = (void *)&(param->data[0]);
1068 
1069 	tw_dev->posted_request_count--;
1070 	tw_dev->state[request_id] = TW_S_INITIAL;
1071 
1072 	return retval;
1073 } /* End twa_get_param() */
1074 
1075 /* This function will assign an available request id */
1076 static void twa_get_request_id(TW_Device_Extension *tw_dev, int *request_id)
1077 {
1078 	*request_id = tw_dev->free_queue[tw_dev->free_head];
1079 	tw_dev->free_head = (tw_dev->free_head + 1) % TW_Q_LENGTH;
1080 	tw_dev->state[*request_id] = TW_S_STARTED;
1081 } /* End twa_get_request_id() */
1082 
1083 /* This function will send an initconnection command to controller */
1084 static int twa_initconnection(TW_Device_Extension *tw_dev, int message_credits,
1085  			      u32 set_features, unsigned short current_fw_srl,
1086 			      unsigned short current_fw_arch_id,
1087 			      unsigned short current_fw_branch,
1088 			      unsigned short current_fw_build,
1089 			      unsigned short *fw_on_ctlr_srl,
1090 			      unsigned short *fw_on_ctlr_arch_id,
1091 			      unsigned short *fw_on_ctlr_branch,
1092 			      unsigned short *fw_on_ctlr_build,
1093 			      u32 *init_connect_result)
1094 {
1095 	TW_Command_Full *full_command_packet;
1096 	TW_Initconnect *tw_initconnect;
1097 	int request_id = 0, retval = 1;
1098 
1099 	/* Initialize InitConnection command packet */
1100 	full_command_packet = tw_dev->command_packet_virt[request_id];
1101 	memset(full_command_packet, 0, sizeof(TW_Command_Full));
1102 	full_command_packet->header.header_desc.size_header = 128;
1103 
1104 	tw_initconnect = (TW_Initconnect *)&full_command_packet->command.oldcommand;
1105 	tw_initconnect->opcode__reserved = TW_OPRES_IN(0, TW_OP_INIT_CONNECTION);
1106 	tw_initconnect->request_id = request_id;
1107 	tw_initconnect->message_credits = cpu_to_le16(message_credits);
1108 	tw_initconnect->features = set_features;
1109 
1110 	/* Turn on 64-bit sgl support if we need to */
1111 	tw_initconnect->features |= sizeof(dma_addr_t) > 4 ? 1 : 0;
1112 
1113 	tw_initconnect->features = cpu_to_le32(tw_initconnect->features);
1114 
1115 	if (set_features & TW_EXTENDED_INIT_CONNECT) {
1116 		tw_initconnect->size = TW_INIT_COMMAND_PACKET_SIZE_EXTENDED;
1117 		tw_initconnect->fw_srl = cpu_to_le16(current_fw_srl);
1118 		tw_initconnect->fw_arch_id = cpu_to_le16(current_fw_arch_id);
1119 		tw_initconnect->fw_branch = cpu_to_le16(current_fw_branch);
1120 		tw_initconnect->fw_build = cpu_to_le16(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 = le16_to_cpu(tw_initconnect->fw_srl);
1133 			*fw_on_ctlr_arch_id = le16_to_cpu(tw_initconnect->fw_arch_id);
1134 			*fw_on_ctlr_branch = le16_to_cpu(tw_initconnect->fw_branch);
1135 			*fw_on_ctlr_build = le16_to_cpu(tw_initconnect->fw_build);
1136 			*init_connect_result = le32_to_cpu(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 	mutex_init(&tw_dev->ioctl_lock);
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 = TW_CPU_TO_SGL(dma_handle + sizeof(TW_Ioctl_Buf_Apache) - 1);
1361 		newcommand->sg_list[0].length = cpu_to_le32(length);
1362 		newcommand->sgl_entries__lunh =
1363 			cpu_to_le16(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 = TW_CPU_TO_SGL(dma_handle + sizeof(TW_Ioctl_Buf_Apache) - 1);
1372 			sgl->length = cpu_to_le32(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->request_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 	dma_addr_t 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 	dma_addr_t 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 			cpu_to_le16(TW_REQ_LUN_IN(srb->device->lun, request_id));
1831 	} else {
1832 		command_packet->request_id__lunl =
1833 			cpu_to_le16(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_CPU_TO_SGL(tw_dev->generic_buffer_phys[request_id]);
1844 				command_packet->sg_list[0].length = cpu_to_le32(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 = TW_CPU_TO_SGL(buffaddr);
1853 				command_packet->sg_list[0].length = cpu_to_le32(tw_dev->srb[request_id]->request_bufflen);
1854 			}
1855 			command_packet->sgl_entries__lunh = cpu_to_le16(TW_REQ_LUN_IN((srb->device->lun >> 4), 1));
1856 
1857 			if (command_packet->sg_list[0].address & TW_CPU_TO_SGL(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_CPU_TO_SGL(tw_dev->generic_buffer_phys[request_id]);
1872 				command_packet->sg_list[0].length = cpu_to_le32(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 = TW_CPU_TO_SGL(sg_dma_address(&sglist[i]));
1880 					command_packet->sg_list[i].length = cpu_to_le32(sg_dma_len(&sglist[i]));
1881 					if (command_packet->sg_list[i].address & TW_CPU_TO_SGL(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 = cpu_to_le16(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 = TW_CPU_TO_SGL(sglistarg[i].address);
1893 			command_packet->sg_list[i].length = cpu_to_le32(sglistarg[i].length);
1894 			if (command_packet->sg_list[i].address & TW_CPU_TO_SGL(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 = cpu_to_le16(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;
1947 			unsigned long flags = 0;
1948 			local_irq_save(flags);
1949 			buf = kmap_atomic(sg->page, KM_IRQ0) + sg->offset;
1950 			memcpy(buf, tw_dev->generic_buffer_virt[request_id], sg->length);
1951 			kunmap_atomic(buf - sg->offset, KM_IRQ0);
1952 			local_irq_restore(flags);
1953 		}
1954 	}
1955 } /* End twa_scsiop_execute_scsi_complete() */
1956 
1957 /* This function tells the controller to shut down */
1958 static void __twa_shutdown(TW_Device_Extension *tw_dev)
1959 {
1960 	/* Disable interrupts */
1961 	TW_DISABLE_INTERRUPTS(tw_dev);
1962 
1963 	printk(KERN_WARNING "3w-9xxx: Shutting down host %d.\n", tw_dev->host->host_no);
1964 
1965 	/* Tell the card we are shutting down */
1966 	if (twa_initconnection(tw_dev, 1, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL)) {
1967 		TW_PRINTK(tw_dev->host, TW_DRIVER, 0x31, "Connection shutdown failed");
1968 	} else {
1969 		printk(KERN_WARNING "3w-9xxx: Shutdown complete.\n");
1970 	}
1971 
1972 	/* Clear all interrupts just before exit */
1973 	TW_CLEAR_ALL_INTERRUPTS(tw_dev);
1974 } /* End __twa_shutdown() */
1975 
1976 /* Wrapper for __twa_shutdown */
1977 static void twa_shutdown(struct pci_dev *pdev)
1978 {
1979 	struct Scsi_Host *host = pci_get_drvdata(pdev);
1980 	TW_Device_Extension *tw_dev = (TW_Device_Extension *)host->hostdata;
1981 
1982 	__twa_shutdown(tw_dev);
1983 } /* End twa_shutdown() */
1984 
1985 /* This function will look up a string */
1986 static char *twa_string_lookup(twa_message_type *table, unsigned int code)
1987 {
1988 	int index;
1989 
1990 	for (index = 0; ((code != table[index].code) &&
1991 		      (table[index].text != (char *)0)); index++);
1992 	return(table[index].text);
1993 } /* End twa_string_lookup() */
1994 
1995 /* This function will perform a pci-dma unmap */
1996 static void twa_unmap_scsi_data(TW_Device_Extension *tw_dev, int request_id)
1997 {
1998 	struct scsi_cmnd *cmd = tw_dev->srb[request_id];
1999 	struct pci_dev *pdev = tw_dev->tw_pci_dev;
2000 
2001 	switch(cmd->SCp.phase) {
2002 	case TW_PHASE_SINGLE:
2003 		pci_unmap_single(pdev, cmd->SCp.have_data_in, cmd->request_bufflen, DMA_BIDIRECTIONAL);
2004 		break;
2005 	case TW_PHASE_SGLIST:
2006 		pci_unmap_sg(pdev, cmd->request_buffer, cmd->use_sg, DMA_BIDIRECTIONAL);
2007 		break;
2008 	}
2009 } /* End twa_unmap_scsi_data() */
2010 
2011 /* scsi_host_template initializer */
2012 static struct scsi_host_template driver_template = {
2013 	.module			= THIS_MODULE,
2014 	.name			= "3ware 9000 Storage Controller",
2015 	.queuecommand		= twa_scsi_queue,
2016 	.eh_host_reset_handler	= twa_scsi_eh_reset,
2017 	.bios_param		= twa_scsi_biosparam,
2018 	.change_queue_depth	= twa_change_queue_depth,
2019 	.can_queue		= TW_Q_LENGTH-2,
2020 	.this_id		= -1,
2021 	.sg_tablesize		= TW_APACHE_MAX_SGL_LENGTH,
2022 	.max_sectors		= TW_MAX_SECTORS,
2023 	.cmd_per_lun		= TW_MAX_CMDS_PER_LUN,
2024 	.use_clustering		= ENABLE_CLUSTERING,
2025 	.shost_attrs		= twa_host_attrs,
2026 	.emulated		= 1
2027 };
2028 
2029 /* This function will probe and initialize a card */
2030 static int __devinit twa_probe(struct pci_dev *pdev, const struct pci_device_id *dev_id)
2031 {
2032 	struct Scsi_Host *host = NULL;
2033 	TW_Device_Extension *tw_dev;
2034 	u32 mem_addr;
2035 	int retval = -ENODEV;
2036 
2037 	retval = pci_enable_device(pdev);
2038 	if (retval) {
2039 		TW_PRINTK(host, TW_DRIVER, 0x34, "Failed to enable pci device");
2040 		goto out_disable_device;
2041 	}
2042 
2043 	pci_set_master(pdev);
2044 
2045 	retval = pci_set_dma_mask(pdev, sizeof(dma_addr_t) > 4 ? DMA_64BIT_MASK : DMA_32BIT_MASK);
2046 	if (retval) {
2047 		TW_PRINTK(host, TW_DRIVER, 0x23, "Failed to set dma mask");
2048 		goto out_disable_device;
2049 	}
2050 
2051 	host = scsi_host_alloc(&driver_template, sizeof(TW_Device_Extension));
2052 	if (!host) {
2053 		TW_PRINTK(host, TW_DRIVER, 0x24, "Failed to allocate memory for device extension");
2054 		retval = -ENOMEM;
2055 		goto out_disable_device;
2056 	}
2057 	tw_dev = (TW_Device_Extension *)host->hostdata;
2058 
2059 	memset(tw_dev, 0, sizeof(TW_Device_Extension));
2060 
2061 	/* Save values to device extension */
2062 	tw_dev->host = host;
2063 	tw_dev->tw_pci_dev = pdev;
2064 
2065 	if (twa_initialize_device_extension(tw_dev)) {
2066 		TW_PRINTK(tw_dev->host, TW_DRIVER, 0x25, "Failed to initialize device extension");
2067 		goto out_free_device_extension;
2068 	}
2069 
2070 	/* Request IO regions */
2071 	retval = pci_request_regions(pdev, "3w-9xxx");
2072 	if (retval) {
2073 		TW_PRINTK(tw_dev->host, TW_DRIVER, 0x26, "Failed to get mem region");
2074 		goto out_free_device_extension;
2075 	}
2076 
2077 	if (pdev->device == PCI_DEVICE_ID_3WARE_9000)
2078 		mem_addr = pci_resource_start(pdev, 1);
2079 	else
2080 		mem_addr = pci_resource_start(pdev, 2);
2081 
2082 	/* Save base address */
2083 	tw_dev->base_addr = ioremap(mem_addr, PAGE_SIZE);
2084 	if (!tw_dev->base_addr) {
2085 		TW_PRINTK(tw_dev->host, TW_DRIVER, 0x35, "Failed to ioremap");
2086 		goto out_release_mem_region;
2087 	}
2088 
2089 	/* Disable interrupts on the card */
2090 	TW_DISABLE_INTERRUPTS(tw_dev);
2091 
2092 	/* Initialize the card */
2093 	if (twa_reset_sequence(tw_dev, 0))
2094 		goto out_release_mem_region;
2095 
2096 	/* Set host specific parameters */
2097 	host->max_id = TW_MAX_UNITS;
2098 	host->max_cmd_len = TW_MAX_CDB_LEN;
2099 
2100 	/* Channels aren't supported by adapter */
2101 	host->max_lun = TW_MAX_LUNS(tw_dev->working_srl);
2102 	host->max_channel = 0;
2103 
2104 	/* Register the card with the kernel SCSI layer */
2105 	retval = scsi_add_host(host, &pdev->dev);
2106 	if (retval) {
2107 		TW_PRINTK(tw_dev->host, TW_DRIVER, 0x27, "scsi add host failed");
2108 		goto out_release_mem_region;
2109 	}
2110 
2111 	pci_set_drvdata(pdev, host);
2112 
2113 	printk(KERN_WARNING "3w-9xxx: scsi%d: Found a 3ware 9000 Storage Controller at 0x%x, IRQ: %d.\n",
2114 	       host->host_no, mem_addr, pdev->irq);
2115 	printk(KERN_WARNING "3w-9xxx: scsi%d: Firmware %s, BIOS %s, Ports: %d.\n",
2116 	       host->host_no,
2117 	       (char *)twa_get_param(tw_dev, 0, TW_VERSION_TABLE,
2118 				     TW_PARAM_FWVER, TW_PARAM_FWVER_LENGTH),
2119 	       (char *)twa_get_param(tw_dev, 1, TW_VERSION_TABLE,
2120 				     TW_PARAM_BIOSVER, TW_PARAM_BIOSVER_LENGTH),
2121 	       le32_to_cpu(*(int *)twa_get_param(tw_dev, 2, TW_INFORMATION_TABLE,
2122 				     TW_PARAM_PORTCOUNT, TW_PARAM_PORTCOUNT_LENGTH)));
2123 
2124 	/* Now setup the interrupt handler */
2125 	retval = request_irq(pdev->irq, twa_interrupt, IRQF_SHARED, "3w-9xxx", tw_dev);
2126 	if (retval) {
2127 		TW_PRINTK(tw_dev->host, TW_DRIVER, 0x30, "Error requesting IRQ");
2128 		goto out_remove_host;
2129 	}
2130 
2131 	twa_device_extension_list[twa_device_extension_count] = tw_dev;
2132 	twa_device_extension_count++;
2133 
2134 	/* Re-enable interrupts on the card */
2135 	TW_ENABLE_AND_CLEAR_INTERRUPTS(tw_dev);
2136 
2137 	/* Finally, scan the host */
2138 	scsi_scan_host(host);
2139 
2140 	if (twa_major == -1) {
2141 		if ((twa_major = register_chrdev (0, "twa", &twa_fops)) < 0)
2142 			TW_PRINTK(host, TW_DRIVER, 0x29, "Failed to register character device");
2143 	}
2144 	return 0;
2145 
2146 out_remove_host:
2147 	scsi_remove_host(host);
2148 out_release_mem_region:
2149 	pci_release_regions(pdev);
2150 out_free_device_extension:
2151 	twa_free_device_extension(tw_dev);
2152 	scsi_host_put(host);
2153 out_disable_device:
2154 	pci_disable_device(pdev);
2155 
2156 	return retval;
2157 } /* End twa_probe() */
2158 
2159 /* This function is called to remove a device */
2160 static void twa_remove(struct pci_dev *pdev)
2161 {
2162 	struct Scsi_Host *host = pci_get_drvdata(pdev);
2163 	TW_Device_Extension *tw_dev = (TW_Device_Extension *)host->hostdata;
2164 
2165 	scsi_remove_host(tw_dev->host);
2166 
2167 	/* Unregister character device */
2168 	if (twa_major >= 0) {
2169 		unregister_chrdev(twa_major, "twa");
2170 		twa_major = -1;
2171 	}
2172 
2173 	/* Free up the IRQ */
2174 	free_irq(tw_dev->tw_pci_dev->irq, tw_dev);
2175 
2176 	/* Shutdown the card */
2177 	__twa_shutdown(tw_dev);
2178 
2179 	/* Free up the mem region */
2180 	pci_release_regions(pdev);
2181 
2182 	/* Free up device extension resources */
2183 	twa_free_device_extension(tw_dev);
2184 
2185 	scsi_host_put(tw_dev->host);
2186 	pci_disable_device(pdev);
2187 	twa_device_extension_count--;
2188 } /* End twa_remove() */
2189 
2190 /* PCI Devices supported by this driver */
2191 static struct pci_device_id twa_pci_tbl[] __devinitdata = {
2192 	{ PCI_VENDOR_ID_3WARE, PCI_DEVICE_ID_3WARE_9000,
2193 	  PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
2194 	{ PCI_VENDOR_ID_3WARE, PCI_DEVICE_ID_3WARE_9550SX,
2195 	  PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
2196 	{ }
2197 };
2198 MODULE_DEVICE_TABLE(pci, twa_pci_tbl);
2199 
2200 /* pci_driver initializer */
2201 static struct pci_driver twa_driver = {
2202 	.name		= "3w-9xxx",
2203 	.id_table	= twa_pci_tbl,
2204 	.probe		= twa_probe,
2205 	.remove		= twa_remove,
2206 	.shutdown	= twa_shutdown
2207 };
2208 
2209 /* This function is called on driver initialization */
2210 static int __init twa_init(void)
2211 {
2212 	printk(KERN_WARNING "3ware 9000 Storage Controller device driver for Linux v%s.\n", TW_DRIVER_VERSION);
2213 
2214 	return pci_module_init(&twa_driver);
2215 } /* End twa_init() */
2216 
2217 /* This function is called on driver exit */
2218 static void __exit twa_exit(void)
2219 {
2220 	pci_unregister_driver(&twa_driver);
2221 } /* End twa_exit() */
2222 
2223 module_init(twa_init);
2224 module_exit(twa_exit);
2225 
2226