• Home
  • Raw
  • Download

Lines Matching +full:host +full:- +full:command

2    3w-xxxx.c -- 3ware Storage Controller device driver for Linux.
9 Copyright (C) 1999-2010 3ware Inc.
12 Non-Copyright (C) 2000 Andre Hedrick <andre@suse.com>
28 LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
47 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
55 -------
56 0.1.000 - Initial release.
57 0.4.000 - Added support for Asynchronous Event Notification through
59 1.0.000 - Added DPO & FUA bit support for WRITE_10 & WRITE_6 cdb
60 to disable drive write-cache before writes.
61 1.1.000 - Fixed performance bug with DPO & FUA not existing for WRITE_6.
62 1.2.000 - Added support for clean shutdown notification/feature table.
63 1.02.00.001 - Added support for full command packet posts through ioctls
66 1.02.00.002 - Fix bug with tw_setfeature() call that caused oops on some
68 08/21/00 - release previously allocated resources on failure at
70 1.02.00.003 - Fix tw_interrupt() to report error to scsi layer when
71 controller status is non-zero.
75 1.02.00.004 - Add support for device id of 3ware 7000 series controllers.
79 1.02.00.005 - Allocate bounce buffers and custom queue depth for raid5 for
84 Add aen count to /proc/scsi/3w-xxxx.
86 1.02.00.006 - Remove unit from printk in tw_scsi_eh_abort(), causing
90 1.02.00.007 - Fix possible null pointer dereferences in tw_ioctl().
93 1.02.00.008 - Set max sectors per io to TW_MAX_SECTORS in tw_findcards().
99 Re-add spinlocks in tw_scsi_detect().
103 1.02.00.009 - Remove redundant increment in tw_state_request_start().
104 Add ioctl support for direct ATA command passthru.
106 1.02.00.010 - Cleanup queueing code, fix jbod thoughput.
108 1.02.00.011 - Fix bug in tw_aen_complete() where aen's could be lost.
110 Set tw_host->max_id for 12 port cards.
111 Add ioctl support for raw command packet post from userspace
113 1.02.00.012 - Fix read capacity to under report by 1 sector to fix get
115 1.02.00.013 - Fix bug where more AEN codes weren't coming out during
118 1.02.00.014 - Fix bug in tw_findcards() where AEN code could be lost.
120 1.02.00.015 - Re-write raw command post with data ioctl method.
125 1.02.00.016 - Set host->max_sectors back up to 256.
126 1.02.00.017 - Modified pci parity error handling/clearing from config space
128 1.02.00.018 - Better handling of request sense opcode and sense information
131 1.02.00.019 - Revert mdelay's and scsi_sleep's, this caused problems on
133 1.02.00.020 - Add pci_set_dma_mask(), rewrite kmalloc()/virt_to_bus() to
137 1.02.00.021 - Bump cmd_per_lun in SHT to 255 for better jbod performance.
143 1.02.00.022 - Fix possible null pointer dereference in tw_scsi_release().
144 1.02.00.023 - Fix bug in tw_aen_drain_queue() where unit # was always zero.
145 1.02.00.024 - Add severity levels to AEN strings.
146 1.02.00.025 - Fix command interrupt spurious error messages.
147 Fix bug in raw command post with data ioctl method.
149 Print unit # on all command timeouts.
150 1.02.00.026 - Fix possible infinite retry bug with power glitch induced
153 1.02.00.027 - Add drive not supported AEN code for SATA controllers.
155 1.02.00.028 - Fix bug where multiple controllers with no units were the
158 1.02.00.029 - Add missing pci_free_consistent() in tw_allocate_memory().
161 1.02.00.030 - Make driver 64-bit clean.
162 1.02.00.031 - Cleanup polling timeouts/routines in several places.
166 1.02.00.032 - Fix small multicard rollcall bug.
171 1.02.00.033 - Fix tw_aen_complete() to not queue 'queue empty' AEN's.
173 1.02.00.034 - Fix tw_decode_bits() to handle multiple errors.
175 Add support for sht->slave_configure().
176 1.02.00.035 - Improve tw_allocate_memory() memory allocation.
178 1.02.00.036 - Increase character ioctl timeout to 60 seconds.
179 1.02.00.037 - Fix tw_ioctl() to handle all non-data ATA passthru cmds
181 1.26.00.038 - Roll driver minor version to 26 to denote kernel 2.6.
183 1.26.00.039 - Fix bug in tw_chrdev_ioctl() polling code.
186 1.26.02.000 - Convert driver to pci_driver format.
187 1.26.02.001 - Increase max ioctl buffer size to 512 sectors.
193 1.26.02.002 - Free irq handler in __tw_shutdown().
196 1.26.02.003 - Force 60 second timeout default.
219 #include "3w-xxxx.h"
226 static int twe_major = -1;
243 dprintk(KERN_WARNING "3w-xxxx: tw_check_bits(): No expected bits (0x%x).\n", status_reg_value); in tw_check_bits()
247 …dprintk(KERN_WARNING "3w-xxxx: tw_check_bits(): Found unexpected bits (0x%x).\n", status_reg_value… in tw_check_bits()
257 char host[16]; in tw_decode_bits() local
259 dprintk(KERN_WARNING "3w-xxxx: tw_decode_bits()\n"); in tw_decode_bits()
262 sprintf(host, " scsi%d:", tw_dev->host->host_no); in tw_decode_bits()
264 host[0] = '\0'; in tw_decode_bits()
267 printk(KERN_WARNING "3w-xxxx:%s PCI Parity Error: clearing.\n", host); in tw_decode_bits()
272 printk(KERN_WARNING "3w-xxxx:%s PCI Abort: clearing.\n", host); in tw_decode_bits()
274 pci_write_config_word(tw_dev->tw_pci_dev, PCI_STATUS, TW_PCI_CLEAR_PCI_ABORT); in tw_decode_bits()
278 printk(KERN_WARNING "3w-xxxx:%s Controller Queue Error: clearing.\n", host); in tw_decode_bits()
283 printk(KERN_WARNING "3w-xxxx:%s SBUF Write Error: clearing.\n", host); in tw_decode_bits()
288 if (tw_dev->reset_print == 0) { in tw_decode_bits()
289 printk(KERN_WARNING "3w-xxxx:%s Microcontroller Error: clearing.\n", host); in tw_decode_bits()
290 tw_dev->reset_print = 1; in tw_decode_bits()
356 /* This function will attempt to post a command packet to the board */
362 dprintk(KERN_NOTICE "3w-xxxx: tw_post_command_packet()\n"); in tw_post_command_packet()
363 command_que_value = tw_dev->command_packet_physical_address[request_id]; in tw_post_command_packet()
367 dprintk(KERN_WARNING "3w-xxxx: tw_post_command_packet(): Unexpected bits.\n"); in tw_post_command_packet()
372 /* We successfully posted the command packet */ in tw_post_command_packet()
374 tw_dev->state[request_id] = TW_S_POSTED; in tw_post_command_packet()
375 tw_dev->posted_request_count++; in tw_post_command_packet()
376 if (tw_dev->posted_request_count > tw_dev->max_posted_request_count) { in tw_post_command_packet()
377 tw_dev->max_posted_request_count = tw_dev->posted_request_count; in tw_post_command_packet()
380 /* Couldn't post the command packet, so we do it in the isr */ in tw_post_command_packet()
381 if (tw_dev->state[request_id] != TW_S_PENDING) { in tw_post_command_packet()
382 tw_dev->state[request_id] = TW_S_PENDING; in tw_post_command_packet()
383 tw_dev->pending_request_count++; in tw_post_command_packet()
384 if (tw_dev->pending_request_count > tw_dev->max_pending_request_count) { in tw_post_command_packet()
385 tw_dev->max_pending_request_count = tw_dev->pending_request_count; in tw_post_command_packet()
387 tw_dev->pending_queue[tw_dev->pending_tail] = request_id; in tw_post_command_packet()
388 if (tw_dev->pending_tail == TW_Q_LENGTH-1) { in tw_post_command_packet()
389 tw_dev->pending_tail = TW_Q_START; in tw_post_command_packet()
391 tw_dev->pending_tail = tw_dev->pending_tail + 1; in tw_post_command_packet()
404 TW_Command *command; in tw_decode_sense() local
406 dprintk(KERN_WARNING "3w-xxxx: tw_decode_sense()\n"); in tw_decode_sense()
407 command = (TW_Command *)tw_dev->command_packet_virtual_address[request_id]; in tw_decode_sense()
409 …w-xxxx: scsi%d: Command failed: status = 0x%x, flags = 0x%x, unit #%d.\n", tw_dev->host->host_no, in tw_decode_sense()
413 if ((command->status == 0xc7) || (command->status == 0xcb)) { in tw_decode_sense()
415 if (command->flags == tw_sense_table[i][0]) { in tw_decode_sense()
418 tw_dev->srb[request_id]->sense_buffer[0] = (0x1 << 7 | 0x70); in tw_decode_sense()
421 tw_dev->srb[request_id]->sense_buffer[2] = tw_sense_table[i][1]; in tw_decode_sense()
424 tw_dev->srb[request_id]->sense_buffer[7] = 0xa; /* 10 bytes */ in tw_decode_sense()
427 tw_dev->srb[request_id]->sense_buffer[12] = tw_sense_table[i][2]; in tw_decode_sense()
430 tw_dev->srb[request_id]->sense_buffer[13] = tw_sense_table[i][3]; in tw_decode_sense()
432 tw_dev->srb[request_id]->result = (DID_OK << 16) | (CHECK_CONDITION << 1); in tw_decode_sense()
433 return TW_ISR_DONT_RESULT; /* Special case for isr to not over-write result */ in tw_decode_sense()
476 tw_dev->free_queue[tw_dev->free_tail] = request_id; in tw_state_request_finish()
477 tw_dev->state[request_id] = TW_S_FINISHED; in tw_state_request_finish()
478 tw_dev->free_tail = (tw_dev->free_tail + 1) % TW_Q_LENGTH; in tw_state_request_finish()
484 *request_id = tw_dev->free_queue[tw_dev->free_head]; in tw_state_request_start()
485 tw_dev->free_head = (tw_dev->free_head + 1) % TW_Q_LENGTH; in tw_state_request_start()
486 tw_dev->state[*request_id] = TW_S_STARTED; in tw_state_request_start()
493 struct Scsi_Host *host = class_to_shost(dev); in tw_show_stats() local
494 TW_Device_Extension *tw_dev = (TW_Device_Extension *)host->hostdata; in tw_show_stats()
498 spin_lock_irqsave(tw_dev->host->host_lock, flags); in tw_show_stats()
499 len = snprintf(buf, PAGE_SIZE, "3w-xxxx Driver version: %s\n" in tw_show_stats()
508 "SCSI Host Resets: %4d\n" in tw_show_stats()
511 tw_dev->posted_request_count, in tw_show_stats()
512 tw_dev->max_posted_request_count, in tw_show_stats()
513 tw_dev->pending_request_count, in tw_show_stats()
514 tw_dev->max_pending_request_count, in tw_show_stats()
515 tw_dev->sgl_entries, in tw_show_stats()
516 tw_dev->max_sgl_entries, in tw_show_stats()
517 tw_dev->sector_count, in tw_show_stats()
518 tw_dev->max_sector_count, in tw_show_stats()
519 tw_dev->num_resets, in tw_show_stats()
520 tw_dev->aen_count); in tw_show_stats()
521 spin_unlock_irqrestore(tw_dev->host->host_lock, flags); in tw_show_stats()
534 /* Host attributes initializer */
549 dprintk(KERN_NOTICE "3w-xxxx: tw_aen_read_queue()\n"); in tw_aen_read_queue()
553 dprintk(KERN_WARNING "3w-xxxx: tw_aen_read_queue(): Unexpected bits.\n"); in tw_aen_read_queue()
557 if (tw_dev->command_packet_virtual_address[request_id] == NULL) { in tw_aen_read_queue()
558 printk(KERN_WARNING "3w-xxxx: tw_aen_read_queue(): Bad command packet virtual address.\n"); in tw_aen_read_queue()
561 command_packet = (TW_Command *)tw_dev->command_packet_virtual_address[request_id]; in tw_aen_read_queue()
563 command_packet->opcode__sgloffset = TW_OPSGL_IN(2, TW_OP_GET_PARAM); in tw_aen_read_queue()
564 command_packet->size = 4; in tw_aen_read_queue()
565 command_packet->request_id = request_id; in tw_aen_read_queue()
566 command_packet->status = 0; in tw_aen_read_queue()
567 command_packet->flags = 0; in tw_aen_read_queue()
568 command_packet->byte6.parameter_count = 1; in tw_aen_read_queue()
569 command_que_value = tw_dev->command_packet_physical_address[request_id]; in tw_aen_read_queue()
571 printk(KERN_WARNING "3w-xxxx: tw_aen_read_queue(): Bad command packet physical address.\n"); in tw_aen_read_queue()
575 if (tw_dev->alignment_virtual_address[request_id] == NULL) { in tw_aen_read_queue()
576 printk(KERN_WARNING "3w-xxxx: tw_aen_read_queue(): Bad alignment virtual address.\n"); in tw_aen_read_queue()
579 param = (TW_Param *)tw_dev->alignment_virtual_address[request_id]; in tw_aen_read_queue()
581 param->table_id = 0x401; /* AEN table */ in tw_aen_read_queue()
582 param->parameter_id = 2; /* Unit code */ in tw_aen_read_queue()
583 param->parameter_size_bytes = 2; in tw_aen_read_queue()
584 param_value = tw_dev->alignment_physical_address[request_id]; in tw_aen_read_queue()
586 printk(KERN_WARNING "3w-xxxx: tw_aen_read_queue(): Bad alignment physical address.\n"); in tw_aen_read_queue()
589 command_packet->byte8.param.sgl[0].address = param_value; in tw_aen_read_queue()
590 command_packet->byte8.param.sgl[0].length = sizeof(TW_Sector); in tw_aen_read_queue()
592 /* Now post the command packet */ in tw_aen_read_queue()
594 dprintk(KERN_WARNING "3w-xxxx: tw_aen_read_queue(): Post succeeded.\n"); in tw_aen_read_queue()
595 tw_dev->srb[request_id] = NULL; /* Flag internal command */ in tw_aen_read_queue()
596 tw_dev->state[request_id] = TW_S_POSTED; in tw_aen_read_queue()
599 printk(KERN_WARNING "3w-xxxx: tw_aen_read_queue(): Post failed, will retry.\n"); in tw_aen_read_queue()
613 dprintk(KERN_WARNING "3w-xxxx: tw_aen_complete()\n"); in tw_aen_complete()
614 if (tw_dev->alignment_virtual_address[request_id] == NULL) { in tw_aen_complete()
615 printk(KERN_WARNING "3w-xxxx: tw_aen_complete(): Bad alignment virtual address.\n"); in tw_aen_complete()
618 param = (TW_Param *)tw_dev->alignment_virtual_address[request_id]; in tw_aen_complete()
619 aen = *(unsigned short *)(param->data); in tw_aen_complete()
620 dprintk(KERN_NOTICE "3w-xxxx: tw_aen_complete(): Queue'd code 0x%x\n", aen); in tw_aen_complete()
624 printk(KERN_WARNING "3w-xxxx: scsi%d: AEN: INFO: AEN queue overflow.\n", tw_dev->host->host_no); in tw_aen_complete()
628 if ((tw_aen_string[aen & 0xff][strlen(tw_aen_string[aen & 0xff])-1]) == '#') { in tw_aen_complete()
629 …printk(KERN_WARNING "3w-xxxx: scsi%d: AEN: %s%d.\n", tw_dev->host->host_no, tw_aen_string[aen & 0x… in tw_aen_complete()
632 …printk(KERN_WARNING "3w-xxxx: scsi%d: AEN: %s.\n", tw_dev->host->host_no, tw_aen_string[aen & 0xff… in tw_aen_complete()
635 printk(KERN_WARNING "3w-xxxx: scsi%d: Received AEN %d.\n", tw_dev->host->host_no, aen); in tw_aen_complete()
639 tw_dev->aen_count++; in tw_aen_complete()
642 tw_dev->aen_queue[tw_dev->aen_tail] = aen; in tw_aen_complete()
643 if (tw_dev->aen_tail == TW_Q_LENGTH - 1) { in tw_aen_complete()
644 tw_dev->aen_tail = TW_Q_START; in tw_aen_complete()
646 tw_dev->aen_tail = tw_dev->aen_tail + 1; in tw_aen_complete()
648 if (tw_dev->aen_head == tw_dev->aen_tail) { in tw_aen_complete()
649 if (tw_dev->aen_head == TW_Q_LENGTH - 1) { in tw_aen_complete()
650 tw_dev->aen_head = TW_Q_START; in tw_aen_complete()
652 tw_dev->aen_head = tw_dev->aen_head + 1; in tw_aen_complete()
658 printk(KERN_WARNING "3w-xxxx: scsi%d: Error completing AEN.\n", tw_dev->host->host_no); in tw_aen_complete()
659 tw_dev->state[request_id] = TW_S_COMPLETED; in tw_aen_complete()
663 tw_dev->state[request_id] = TW_S_COMPLETED; in tw_aen_complete()
686 dprintk(KERN_NOTICE "3w-xxxx: tw_aen_drain_queue()\n"); in tw_aen_drain_queue()
689 …dprintk(KERN_WARNING "3w-xxxx: tw_aen_drain_queue(): No attention interrupt for card %d.\n", tw_de… in tw_aen_drain_queue()
697 /* Initialize command packet */ in tw_aen_drain_queue()
698 if (tw_dev->command_packet_virtual_address[request_id] == NULL) { in tw_aen_drain_queue()
699 printk(KERN_WARNING "3w-xxxx: tw_aen_drain_queue(): Bad command packet virtual address.\n"); in tw_aen_drain_queue()
702 command_packet = (TW_Command *)tw_dev->command_packet_virtual_address[request_id]; in tw_aen_drain_queue()
704 command_packet->opcode__sgloffset = TW_OPSGL_IN(2, TW_OP_GET_PARAM); in tw_aen_drain_queue()
705 command_packet->size = 4; in tw_aen_drain_queue()
706 command_packet->request_id = request_id; in tw_aen_drain_queue()
707 command_packet->status = 0; in tw_aen_drain_queue()
708 command_packet->flags = 0; in tw_aen_drain_queue()
709 command_packet->byte6.parameter_count = 1; in tw_aen_drain_queue()
710 command_que_value = tw_dev->command_packet_physical_address[request_id]; in tw_aen_drain_queue()
712 printk(KERN_WARNING "3w-xxxx: tw_aen_drain_queue(): Bad command packet physical address.\n"); in tw_aen_drain_queue()
717 if (tw_dev->alignment_virtual_address[request_id] == NULL) { in tw_aen_drain_queue()
718 printk(KERN_WARNING "3w-xxxx: tw_aen_drain_queue(): Bad alignment virtual address.\n"); in tw_aen_drain_queue()
721 param = (TW_Param *)tw_dev->alignment_virtual_address[request_id]; in tw_aen_drain_queue()
723 param->table_id = 0x401; /* AEN table */ in tw_aen_drain_queue()
724 param->parameter_id = 2; /* Unit code */ in tw_aen_drain_queue()
725 param->parameter_size_bytes = 2; in tw_aen_drain_queue()
726 param_value = tw_dev->alignment_physical_address[request_id]; in tw_aen_drain_queue()
728 printk(KERN_WARNING "3w-xxxx: tw_aen_drain_queue(): Bad alignment physical address.\n"); in tw_aen_drain_queue()
731 command_packet->byte8.param.sgl[0].address = param_value; in tw_aen_drain_queue()
732 command_packet->byte8.param.sgl[0].length = sizeof(TW_Sector); in tw_aen_drain_queue()
736 /* Post command packet */ in tw_aen_drain_queue()
746 printk(KERN_WARNING "3w-xxxx: tw_aen_drain_queue(): Unexpected request id.\n"); in tw_aen_drain_queue()
750 if (command_packet->status != 0) { in tw_aen_drain_queue()
751 if (command_packet->flags != TW_AEN_TABLE_UNDEFINED) { in tw_aen_drain_queue()
756 /* We know this is a 3w-1x00, and doesn't support aen's */ in tw_aen_drain_queue()
762 aen = *(unsigned short *)(param->data); in tw_aen_drain_queue()
767 dprintk(KERN_WARNING "3w-xxxx: AEN: %s.\n", tw_aen_string[aen & 0xff]); in tw_aen_drain_queue()
778 printk(KERN_WARNING "3w-xxxx: AEN: %s.\n", tw_aen_string[aen & 0xff]); in tw_aen_drain_queue()
779 tw_dev->aen_count++; in tw_aen_drain_queue()
785 printk(KERN_WARNING "3w-xxxx: AEN: INFO: AEN queue overflow.\n"); in tw_aen_drain_queue()
789 if ((tw_aen_string[aen & 0xff][strlen(tw_aen_string[aen & 0xff])-1]) == '#') { in tw_aen_drain_queue()
790 printk(KERN_WARNING "3w-xxxx: AEN: %s%d.\n", tw_aen_string[aen & 0xff], aen >> 8); in tw_aen_drain_queue()
792 printk(KERN_WARNING "3w-xxxx: AEN: %s.\n", tw_aen_string[aen & 0xff]); in tw_aen_drain_queue()
795 printk(KERN_WARNING "3w-xxxx: Received AEN %d.\n", aen); in tw_aen_drain_queue()
797 tw_dev->aen_count++; in tw_aen_drain_queue()
803 tw_dev->aen_queue[tw_dev->aen_tail] = aen; in tw_aen_drain_queue()
804 if (tw_dev->aen_tail == TW_Q_LENGTH - 1) { in tw_aen_drain_queue()
805 tw_dev->aen_tail = TW_Q_START; in tw_aen_drain_queue()
807 tw_dev->aen_tail = tw_dev->aen_tail + 1; in tw_aen_drain_queue()
809 if (tw_dev->aen_head == tw_dev->aen_tail) { in tw_aen_drain_queue()
810 if (tw_dev->aen_head == TW_Q_LENGTH - 1) { in tw_aen_drain_queue()
811 tw_dev->aen_head = TW_Q_START; in tw_aen_drain_queue()
813 tw_dev->aen_head = tw_dev->aen_head + 1; in tw_aen_drain_queue()
820 printk(KERN_WARNING "3w-xxxx: tw_aen_drain_queue(): Response never received.\n"); in tw_aen_drain_queue()
835 dprintk(KERN_NOTICE "3w-xxxx: tw_allocate_memory()\n"); in tw_allocate_memory()
837 cpu_addr = pci_alloc_consistent(tw_dev->tw_pci_dev, size*TW_Q_LENGTH, &dma_handle); in tw_allocate_memory()
839 printk(KERN_WARNING "3w-xxxx: pci_alloc_consistent() failed.\n"); in tw_allocate_memory()
843 …if ((unsigned long)cpu_addr % (tw_dev->tw_pci_dev->device == TW_DEVICE_ID ? TW_ALIGNMENT_6000 : TW… in tw_allocate_memory()
844 printk(KERN_WARNING "3w-xxxx: Couldn't allocate correctly aligned memory.\n"); in tw_allocate_memory()
845 pci_free_consistent(tw_dev->tw_pci_dev, size*TW_Q_LENGTH, cpu_addr, dma_handle); in tw_allocate_memory()
854 tw_dev->command_packet_physical_address[i] = dma_handle+(i*size); in tw_allocate_memory()
855 …tw_dev->command_packet_virtual_address[i] = (unsigned long *)((unsigned char *)cpu_addr + (i*size)… in tw_allocate_memory()
858 tw_dev->alignment_physical_address[i] = dma_handle+(i*size); in tw_allocate_memory()
859 tw_dev->alignment_virtual_address[i] = (unsigned long *)((unsigned char *)cpu_addr + (i*size)); in tw_allocate_memory()
862 printk(KERN_WARNING "3w-xxxx: tw_allocate_memory(): case slip in tw_allocate_memory()\n"); in tw_allocate_memory()
885 int retval = -EFAULT; in tw_chrdev_ioctl()
888 dprintk(KERN_WARNING "3w-xxxx: tw_chrdev_ioctl()\n"); in tw_chrdev_ioctl()
892 if (mutex_lock_interruptible(&tw_dev->ioctl_lock)) { in tw_chrdev_ioctl()
894 return -EINTR; in tw_chrdev_ioctl()
903 retval = -EINVAL; in tw_chrdev_ioctl()
911 …cpu_addr = dma_alloc_coherent(&tw_dev->tw_pci_dev->dev, data_buffer_length_adjusted+sizeof(TW_New_… in tw_chrdev_ioctl()
913 retval = -ENOMEM; in tw_chrdev_ioctl()
920 if (copy_from_user(tw_ioctl, argp, data_buffer_length + sizeof(TW_New_Ioctl) - 1)) in tw_chrdev_ioctl()
923 passthru = (TW_Passthru *)&tw_ioctl->firmware_command; in tw_chrdev_ioctl()
928 dprintk(KERN_WARNING "3w-xxxx: tw_chrdev_ioctl(): caught TW_OP_NOP.\n"); in tw_chrdev_ioctl()
931 dprintk(KERN_WARNING "3w-xxxx: tw_chrdev_ioctl(): caught TW_AEN_LISTEN.\n"); in tw_chrdev_ioctl()
932 memset(tw_ioctl->data_buffer, 0, data_buffer_length); in tw_chrdev_ioctl()
934 spin_lock_irqsave(tw_dev->host->host_lock, flags); in tw_chrdev_ioctl()
935 if (tw_dev->aen_head == tw_dev->aen_tail) { in tw_chrdev_ioctl()
938 tw_aen_code = tw_dev->aen_queue[tw_dev->aen_head]; in tw_chrdev_ioctl()
939 if (tw_dev->aen_head == TW_Q_LENGTH - 1) { in tw_chrdev_ioctl()
940 tw_dev->aen_head = TW_Q_START; in tw_chrdev_ioctl()
942 tw_dev->aen_head = tw_dev->aen_head + 1; in tw_chrdev_ioctl()
945 spin_unlock_irqrestore(tw_dev->host->host_lock, flags); in tw_chrdev_ioctl()
946 memcpy(tw_ioctl->data_buffer, &tw_aen_code, sizeof(tw_aen_code)); in tw_chrdev_ioctl()
949 dprintk(KERN_WARNING "3w-xxxx: tw_chrdev_ioctl(): caught TW_CMD_PACKET_WITH_DATA.\n"); in tw_chrdev_ioctl()
950 spin_lock_irqsave(tw_dev->host->host_lock, flags); in tw_chrdev_ioctl()
954 /* Flag internal command */ in tw_chrdev_ioctl()
955 tw_dev->srb[request_id] = NULL; in tw_chrdev_ioctl()
958 tw_dev->chrdev_request_id = request_id; in tw_chrdev_ioctl()
960 tw_ioctl->firmware_command.request_id = request_id; in tw_chrdev_ioctl()
963 switch (TW_SGL_OUT(tw_ioctl->firmware_command.opcode__sgloffset)) { in tw_chrdev_ioctl()
965 tw_ioctl->firmware_command.byte8.param.sgl[0].address = dma_handle + sizeof(TW_New_Ioctl) - 1; in tw_chrdev_ioctl()
966 tw_ioctl->firmware_command.byte8.param.sgl[0].length = data_buffer_length_adjusted; in tw_chrdev_ioctl()
969 tw_ioctl->firmware_command.byte8.io.sgl[0].address = dma_handle + sizeof(TW_New_Ioctl) - 1; in tw_chrdev_ioctl()
970 tw_ioctl->firmware_command.byte8.io.sgl[0].length = data_buffer_length_adjusted; in tw_chrdev_ioctl()
973 passthru->sg_list[0].address = dma_handle + sizeof(TW_New_Ioctl) - 1; in tw_chrdev_ioctl()
974 passthru->sg_list[0].length = data_buffer_length_adjusted; in tw_chrdev_ioctl()
978 …memcpy(tw_dev->command_packet_virtual_address[request_id], &(tw_ioctl->firmware_command), sizeof(T… in tw_chrdev_ioctl()
980 /* Now post the command packet to the controller */ in tw_chrdev_ioctl()
982 spin_unlock_irqrestore(tw_dev->host->host_lock, flags); in tw_chrdev_ioctl()
986 /* Now wait for the command to complete */ in tw_chrdev_ioctl()
987 …timeout = wait_event_timeout(tw_dev->ioctl_wqueue, tw_dev->chrdev_request_id == TW_IOCTL_CHRDEV_FR… in tw_chrdev_ioctl()
990 if (tw_dev->chrdev_request_id != TW_IOCTL_CHRDEV_FREE) { in tw_chrdev_ioctl()
992 …printk(KERN_WARNING "3w-xxxx: scsi%d: Character ioctl (0x%x) timed out, resetting card.\n", tw_dev in tw_chrdev_ioctl()
993 retval = -EIO; in tw_chrdev_ioctl()
995 …printk(KERN_WARNING "3w-xxxx: tw_chrdev_ioctl(): Reset failed for card %d.\n", tw_dev->host->host_… in tw_chrdev_ioctl()
1000 /* Now copy in the command packet response */ in tw_chrdev_ioctl()
1001 …memcpy(&(tw_ioctl->firmware_command), tw_dev->command_packet_virtual_address[request_id], sizeof(T… in tw_chrdev_ioctl()
1004 spin_lock_irqsave(tw_dev->host->host_lock, flags); in tw_chrdev_ioctl()
1005 tw_dev->posted_request_count--; in tw_chrdev_ioctl()
1006 tw_dev->state[request_id] = TW_S_COMPLETED; in tw_chrdev_ioctl()
1008 spin_unlock_irqrestore(tw_dev->host->host_lock, flags); in tw_chrdev_ioctl()
1011 retval = -ENOTTY; in tw_chrdev_ioctl()
1016 if (copy_to_user(argp, tw_ioctl, sizeof(TW_New_Ioctl) + data_buffer_length - 1)) in tw_chrdev_ioctl()
1021 …dma_free_coherent(&tw_dev->tw_pci_dev->dev, data_buffer_length_adjusted+sizeof(TW_New_Ioctl) - 1, … in tw_chrdev_ioctl()
1023 mutex_unlock(&tw_dev->ioctl_lock); in tw_chrdev_ioctl()
1034 dprintk(KERN_WARNING "3w-xxxx: tw_ioctl_open()\n"); in tw_chrdev_open()
1037 return -EACCES; in tw_chrdev_open()
1041 return -ENODEV; in tw_chrdev_open()
1061 dprintk(KERN_NOTICE "3w-xxxx: tw_free_device_extension()\n"); in tw_free_device_extension()
1063 /* Free command packet and generic buffer memory */ in tw_free_device_extension()
1064 if (tw_dev->command_packet_virtual_address[0]) in tw_free_device_extension()
1065 …pci_free_consistent(tw_dev->tw_pci_dev, sizeof(TW_Command)*TW_Q_LENGTH, tw_dev->command_packet_vir… in tw_free_device_extension()
1067 if (tw_dev->alignment_virtual_address[0]) in tw_free_device_extension()
1068 …pci_free_consistent(tw_dev->tw_pci_dev, sizeof(TW_Sector)*TW_Q_LENGTH, tw_dev->alignment_virtual_a… in tw_free_device_extension()
1071 /* This function will send an initconnection command to controller */
1079 dprintk(KERN_NOTICE "3w-xxxx: tw_initconnection()\n"); in tw_initconnection()
1081 /* Initialize InitConnection command packet */ in tw_initconnection()
1082 if (tw_dev->command_packet_virtual_address[request_id] == NULL) { in tw_initconnection()
1083 printk(KERN_WARNING "3w-xxxx: tw_initconnection(): Bad command packet virtual address.\n"); in tw_initconnection()
1087 command_packet = (TW_Command *)tw_dev->command_packet_virtual_address[request_id]; in tw_initconnection()
1089 command_packet->opcode__sgloffset = TW_OPSGL_IN(0, TW_OP_INIT_CONNECTION); in tw_initconnection()
1090 command_packet->size = TW_INIT_COMMAND_PACKET_SIZE; in tw_initconnection()
1091 command_packet->request_id = request_id; in tw_initconnection()
1092 command_packet->status = 0x0; in tw_initconnection()
1093 command_packet->flags = 0x0; in tw_initconnection()
1094 command_packet->byte6.message_credits = message_credits; in tw_initconnection()
1095 command_packet->byte8.init_connection.response_queue_pointer = 0x0; in tw_initconnection()
1096 command_que_value = tw_dev->command_packet_physical_address[request_id]; in tw_initconnection()
1099 printk(KERN_WARNING "3w-xxxx: tw_initconnection(): Bad command packet physical address.\n"); in tw_initconnection()
1103 /* Send command packet to the board */ in tw_initconnection()
1113 printk(KERN_WARNING "3w-xxxx: tw_initconnection(): Unexpected request id.\n"); in tw_initconnection()
1116 if (command_packet->status != 0) { in tw_initconnection()
1136 /* Initialize SetParam command packet */ in tw_setfeature()
1137 if (tw_dev->command_packet_virtual_address[request_id] == NULL) { in tw_setfeature()
1138 printk(KERN_WARNING "3w-xxxx: tw_setfeature(): Bad command packet virtual address.\n"); in tw_setfeature()
1141 command_packet = (TW_Command *)tw_dev->command_packet_virtual_address[request_id]; in tw_setfeature()
1143 param = (TW_Param *)tw_dev->alignment_virtual_address[request_id]; in tw_setfeature()
1145 command_packet->opcode__sgloffset = TW_OPSGL_IN(2, TW_OP_SET_PARAM); in tw_setfeature()
1146 param->table_id = 0x404; /* Features table */ in tw_setfeature()
1147 param->parameter_id = parm; in tw_setfeature()
1148 param->parameter_size_bytes = param_size; in tw_setfeature()
1149 memcpy(param->data, val, param_size); in tw_setfeature()
1151 param_value = tw_dev->alignment_physical_address[request_id]; in tw_setfeature()
1153 printk(KERN_WARNING "3w-xxxx: tw_setfeature(): Bad alignment physical address.\n"); in tw_setfeature()
1154 tw_dev->state[request_id] = TW_S_COMPLETED; in tw_setfeature()
1156 tw_dev->srb[request_id]->result = (DID_OK << 16); in tw_setfeature()
1157 tw_dev->srb[request_id]->scsi_done(tw_dev->srb[request_id]); in tw_setfeature()
1159 command_packet->byte8.param.sgl[0].address = param_value; in tw_setfeature()
1160 command_packet->byte8.param.sgl[0].length = sizeof(TW_Sector); in tw_setfeature()
1162 command_packet->size = 4; in tw_setfeature()
1163 command_packet->request_id = request_id; in tw_setfeature()
1164 command_packet->byte6.parameter_count = 1; in tw_setfeature()
1166 command_que_value = tw_dev->command_packet_physical_address[request_id]; in tw_setfeature()
1168 printk(KERN_WARNING "3w-xxxx: tw_setfeature(): Bad command packet physical address.\n"); in tw_setfeature()
1172 /* Send command packet to the board */ in tw_setfeature()
1182 printk(KERN_WARNING "3w-xxxx: tw_setfeature(): Unexpected request id.\n"); in tw_setfeature()
1185 if (command_packet->status != 0) { in tw_setfeature()
1208 printk(KERN_WARNING "3w-xxxx: scsi%d: AEN drain failed, retrying.\n", tw_dev->host->host_no); in tw_reset_sequence()
1215 …printk(KERN_WARNING "3w-xxxx: scsi%d: Controller errors found, retrying.\n", tw_dev->host->host_no… in tw_reset_sequence()
1225 …printk(KERN_WARNING "3w-xxxx: scsi%d: Controller errors, card not responding, check all cabling.\n… in tw_reset_sequence()
1231 …printk(KERN_WARNING "3w-xxxx: scsi%d: Connection initialization failed.\n", tw_dev->host->host_no); in tw_reset_sequence()
1237 printk(KERN_WARNING "3w-xxxx: Unable to set features for card, probable old firmware or card.\n"); in tw_reset_sequence()
1248 dprintk(KERN_NOTICE "3w-xxxx: tw_initialize_device_extension()\n"); in tw_initialize_device_extension()
1250 /* Initialize command packet buffers */ in tw_initialize_device_extension()
1253 printk(KERN_WARNING "3w-xxxx: Command packet memory allocation failed.\n"); in tw_initialize_device_extension()
1260 printk(KERN_WARNING "3w-xxxx: Generic memory allocation failed.\n"); in tw_initialize_device_extension()
1265 tw_dev->free_queue[i] = i; in tw_initialize_device_extension()
1266 tw_dev->state[i] = TW_S_INITIAL; in tw_initialize_device_extension()
1269 tw_dev->pending_head = TW_Q_START; in tw_initialize_device_extension()
1270 tw_dev->pending_tail = TW_Q_START; in tw_initialize_device_extension()
1271 tw_dev->chrdev_request_id = TW_IOCTL_CHRDEV_FREE; in tw_initialize_device_extension()
1273 mutex_init(&tw_dev->ioctl_lock); in tw_initialize_device_extension()
1274 init_waitqueue_head(&tw_dev->ioctl_wqueue); in tw_initialize_device_extension()
1286 dprintk(KERN_NOTICE "3w-xxxx: tw_reset_device_extension()\n"); in tw_reset_device_extension()
1288 set_bit(TW_IN_RESET, &tw_dev->flags); in tw_reset_device_extension()
1291 spin_lock_irqsave(tw_dev->host->host_lock, flags); in tw_reset_device_extension()
1295 if ((tw_dev->state[i] != TW_S_FINISHED) && in tw_reset_device_extension()
1296 (tw_dev->state[i] != TW_S_INITIAL) && in tw_reset_device_extension()
1297 (tw_dev->state[i] != TW_S_COMPLETED)) { in tw_reset_device_extension()
1298 srb = tw_dev->srb[i]; in tw_reset_device_extension()
1300 srb->result = (DID_RESET << 16); in tw_reset_device_extension()
1302 srb->scsi_done(srb); in tw_reset_device_extension()
1309 tw_dev->free_queue[i] = i; in tw_reset_device_extension()
1310 tw_dev->state[i] = TW_S_INITIAL; in tw_reset_device_extension()
1312 tw_dev->free_head = TW_Q_START; in tw_reset_device_extension()
1313 tw_dev->free_tail = TW_Q_START; in tw_reset_device_extension()
1314 tw_dev->posted_request_count = 0; in tw_reset_device_extension()
1315 tw_dev->pending_request_count = 0; in tw_reset_device_extension()
1316 tw_dev->pending_head = TW_Q_START; in tw_reset_device_extension()
1317 tw_dev->pending_tail = TW_Q_START; in tw_reset_device_extension()
1318 tw_dev->reset_print = 0; in tw_reset_device_extension()
1320 spin_unlock_irqrestore(tw_dev->host->host_lock, flags); in tw_reset_device_extension()
1323 printk(KERN_WARNING "3w-xxxx: scsi%d: Reset sequence failed.\n", tw_dev->host->host_no); in tw_reset_device_extension()
1328 clear_bit(TW_IN_RESET, &tw_dev->flags); in tw_reset_device_extension()
1329 tw_dev->chrdev_request_id = TW_IOCTL_CHRDEV_FREE; in tw_reset_device_extension()
1341 dprintk(KERN_NOTICE "3w-xxxx: tw_scsi_biosparam()\n"); in tw_scsi_biosparam()
1342 tw_dev = (TW_Device_Extension *)sdev->host->hostdata; in tw_scsi_biosparam()
1354 …dprintk(KERN_NOTICE "3w-xxxx: tw_scsi_biosparam(): heads = %d, sectors = %d, cylinders = %d\n", he… in tw_scsi_biosparam()
1368 tw_dev = (TW_Device_Extension *)SCpnt->device->host->hostdata; in tw_scsi_eh_reset()
1370 tw_dev->num_resets++; in tw_scsi_eh_reset()
1372 sdev_printk(KERN_WARNING, SCpnt->device, in tw_scsi_eh_reset()
1373 "WARNING: Command (0x%x) timed out, resetting card.\n", in tw_scsi_eh_reset()
1374 SCpnt->cmnd[0]); in tw_scsi_eh_reset()
1377 mutex_lock(&tw_dev->ioctl_lock); in tw_scsi_eh_reset()
1381 printk(KERN_WARNING "3w-xxxx: scsi%d: Reset failed.\n", tw_dev->host->host_no); in tw_scsi_eh_reset()
1387 mutex_unlock(&tw_dev->ioctl_lock); in tw_scsi_eh_reset()
1399 dprintk(KERN_NOTICE "3w-xxxx: tw_scsiop_inquiry()\n"); in tw_scsiop_inquiry()
1401 /* Initialize command packet */ in tw_scsiop_inquiry()
1402 command_packet = (TW_Command *)tw_dev->command_packet_virtual_address[request_id]; in tw_scsiop_inquiry()
1404 printk(KERN_WARNING "3w-xxxx: tw_scsiop_inquiry(): Bad command packet virtual address.\n"); in tw_scsiop_inquiry()
1408 command_packet->opcode__sgloffset = TW_OPSGL_IN(2, TW_OP_GET_PARAM); in tw_scsiop_inquiry()
1409 command_packet->size = 4; in tw_scsiop_inquiry()
1410 command_packet->request_id = request_id; in tw_scsiop_inquiry()
1411 command_packet->status = 0; in tw_scsiop_inquiry()
1412 command_packet->flags = 0; in tw_scsiop_inquiry()
1413 command_packet->byte6.parameter_count = 1; in tw_scsiop_inquiry()
1416 if (tw_dev->alignment_virtual_address[request_id] == NULL) { in tw_scsiop_inquiry()
1417 printk(KERN_WARNING "3w-xxxx: tw_scsiop_inquiry(): Bad alignment virtual address.\n"); in tw_scsiop_inquiry()
1420 param = (TW_Param *)tw_dev->alignment_virtual_address[request_id]; in tw_scsiop_inquiry()
1422 param->table_id = 3; /* unit summary table */ in tw_scsiop_inquiry()
1423 param->parameter_id = 3; /* unitsstatus parameter */ in tw_scsiop_inquiry()
1424 param->parameter_size_bytes = TW_MAX_UNITS; in tw_scsiop_inquiry()
1425 param_value = tw_dev->alignment_physical_address[request_id]; in tw_scsiop_inquiry()
1427 printk(KERN_WARNING "3w-xxxx: tw_scsiop_inquiry(): Bad alignment physical address.\n"); in tw_scsiop_inquiry()
1431 command_packet->byte8.param.sgl[0].address = param_value; in tw_scsiop_inquiry()
1432 command_packet->byte8.param.sgl[0].length = sizeof(TW_Sector); in tw_scsiop_inquiry()
1433 command_que_value = tw_dev->command_packet_physical_address[request_id]; in tw_scsiop_inquiry()
1435 printk(KERN_WARNING "3w-xxxx: tw_scsiop_inquiry(): Bad command packet physical address.\n"); in tw_scsiop_inquiry()
1439 /* Now try to post the command packet */ in tw_scsiop_inquiry()
1448 scsi_sg_copy_from_buffer(tw_dev->srb[request_id], data, len); in tw_transfer_internal()
1451 /* This function is called by the isr to complete an inquiry command */
1458 dprintk(KERN_NOTICE "3w-xxxx: tw_scsiop_inquiry_complete()\n"); in tw_scsiop_inquiry_complete()
1466 sprintf(&request_buffer[16], "Logical Disk %-2d ", tw_dev->srb[request_id]->device->id); in tw_scsiop_inquiry_complete()
1471 param = (TW_Param *)tw_dev->alignment_virtual_address[request_id]; in tw_scsiop_inquiry_complete()
1473 printk(KERN_WARNING "3w-xxxx: tw_scsiop_inquiry_complete(): Bad alignment virtual address.\n"); in tw_scsiop_inquiry_complete()
1476 is_unit_present = &(param->data[0]); in tw_scsiop_inquiry_complete()
1478 if (is_unit_present[tw_dev->srb[request_id]->device->id] & TW_UNIT_ONLINE) { in tw_scsiop_inquiry_complete()
1479 tw_dev->is_unit_present[tw_dev->srb[request_id]->device->id] = 1; in tw_scsiop_inquiry_complete()
1481 tw_dev->is_unit_present[tw_dev->srb[request_id]->device->id] = 0; in tw_scsiop_inquiry_complete()
1482 tw_dev->srb[request_id]->result = (DID_BAD_TARGET << 16); in tw_scsiop_inquiry_complete()
1497 dprintk(KERN_NOTICE "3w-xxxx: tw_scsiop_mode_sense()\n"); in tw_scsiop_mode_sense()
1500 if (tw_dev->srb[request_id]->cmnd[2] != 0x8) { in tw_scsiop_mode_sense()
1501 tw_dev->state[request_id] = TW_S_COMPLETED; in tw_scsiop_mode_sense()
1503 tw_dev->srb[request_id]->result = (DID_OK << 16); in tw_scsiop_mode_sense()
1504 tw_dev->srb[request_id]->scsi_done(tw_dev->srb[request_id]); in tw_scsiop_mode_sense()
1509 command_packet = (TW_Command *)tw_dev->command_packet_virtual_address[request_id]; in tw_scsiop_mode_sense()
1511 printk(KERN_WARNING "3w-xxxx: tw_scsiop_mode_sense(): Bad command packet virtual address.\n"); in tw_scsiop_mode_sense()
1515 /* Setup the command packet */ in tw_scsiop_mode_sense()
1517 command_packet->opcode__sgloffset = TW_OPSGL_IN(2, TW_OP_GET_PARAM); in tw_scsiop_mode_sense()
1518 command_packet->size = 4; in tw_scsiop_mode_sense()
1519 command_packet->request_id = request_id; in tw_scsiop_mode_sense()
1520 command_packet->status = 0; in tw_scsiop_mode_sense()
1521 command_packet->flags = 0; in tw_scsiop_mode_sense()
1522 command_packet->byte6.parameter_count = 1; in tw_scsiop_mode_sense()
1525 if (tw_dev->alignment_virtual_address[request_id] == NULL) { in tw_scsiop_mode_sense()
1526 printk(KERN_WARNING "3w-xxxx: tw_scsiop_mode_sense(): Bad alignment virtual address.\n"); in tw_scsiop_mode_sense()
1530 param = (TW_Param *)tw_dev->alignment_virtual_address[request_id]; in tw_scsiop_mode_sense()
1532 param->table_id = TW_UNIT_INFORMATION_TABLE_BASE + tw_dev->srb[request_id]->device->id; in tw_scsiop_mode_sense()
1533 param->parameter_id = 7; /* unit flags */ in tw_scsiop_mode_sense()
1534 param->parameter_size_bytes = 1; in tw_scsiop_mode_sense()
1535 param_value = tw_dev->alignment_physical_address[request_id]; in tw_scsiop_mode_sense()
1537 printk(KERN_WARNING "3w-xxxx: tw_scsiop_mode_sense(): Bad alignment physical address.\n"); in tw_scsiop_mode_sense()
1541 command_packet->byte8.param.sgl[0].address = param_value; in tw_scsiop_mode_sense()
1542 command_packet->byte8.param.sgl[0].length = sizeof(TW_Sector); in tw_scsiop_mode_sense()
1543 command_que_value = tw_dev->command_packet_physical_address[request_id]; in tw_scsiop_mode_sense()
1545 printk(KERN_WARNING "3w-xxxx: tw_scsiop_mode_sense(): Bad command packet physical address.\n"); in tw_scsiop_mode_sense()
1549 /* Now try to post the command packet */ in tw_scsiop_mode_sense()
1555 /* This function is called by the isr to complete a mode sense command */
1562 dprintk(KERN_NOTICE "3w-xxxx: tw_scsiop_mode_sense_complete()\n"); in tw_scsiop_mode_sense_complete()
1564 param = (TW_Param *)tw_dev->alignment_virtual_address[request_id]; in tw_scsiop_mode_sense_complete()
1566 printk(KERN_WARNING "3w-xxxx: tw_scsiop_mode_sense_complete(): Bad alignment virtual address.\n"); in tw_scsiop_mode_sense_complete()
1569 flags = (char *)&(param->data[0]); in tw_scsiop_mode_sense_complete()
1596 dprintk(KERN_NOTICE "3w-xxxx: tw_scsiop_read_capacity()\n"); in tw_scsiop_read_capacity()
1598 /* Initialize command packet */ in tw_scsiop_read_capacity()
1599 command_packet = (TW_Command *)tw_dev->command_packet_virtual_address[request_id]; in tw_scsiop_read_capacity()
1602 dprintk(KERN_NOTICE "3w-xxxx: tw_scsiop_read_capacity(): Bad command packet virtual address.\n"); in tw_scsiop_read_capacity()
1606 command_packet->opcode__sgloffset = TW_OPSGL_IN(2, TW_OP_GET_PARAM); in tw_scsiop_read_capacity()
1607 command_packet->size = 4; in tw_scsiop_read_capacity()
1608 command_packet->request_id = request_id; in tw_scsiop_read_capacity()
1609 command_packet->unit__hostid = TW_UNITHOST_IN(0, tw_dev->srb[request_id]->device->id); in tw_scsiop_read_capacity()
1610 command_packet->status = 0; in tw_scsiop_read_capacity()
1611 command_packet->flags = 0; in tw_scsiop_read_capacity()
1612 command_packet->byte6.block_count = 1; in tw_scsiop_read_capacity()
1615 if (tw_dev->alignment_virtual_address[request_id] == NULL) { in tw_scsiop_read_capacity()
1616 dprintk(KERN_NOTICE "3w-xxxx: tw_scsiop_read_capacity(): Bad alignment virtual address.\n"); in tw_scsiop_read_capacity()
1619 param = (TW_Param *)tw_dev->alignment_virtual_address[request_id]; in tw_scsiop_read_capacity()
1621 param->table_id = TW_UNIT_INFORMATION_TABLE_BASE + in tw_scsiop_read_capacity()
1622 tw_dev->srb[request_id]->device->id; in tw_scsiop_read_capacity()
1623 param->parameter_id = 4; /* unitcapacity parameter */ in tw_scsiop_read_capacity()
1624 param->parameter_size_bytes = 4; in tw_scsiop_read_capacity()
1625 param_value = tw_dev->alignment_physical_address[request_id]; in tw_scsiop_read_capacity()
1627 dprintk(KERN_NOTICE "3w-xxxx: tw_scsiop_read_capacity(): Bad alignment physical address.\n"); in tw_scsiop_read_capacity()
1631 command_packet->byte8.param.sgl[0].address = param_value; in tw_scsiop_read_capacity()
1632 command_packet->byte8.param.sgl[0].length = sizeof(TW_Sector); in tw_scsiop_read_capacity()
1633 command_que_value = tw_dev->command_packet_physical_address[request_id]; in tw_scsiop_read_capacity()
1635 dprintk(KERN_NOTICE "3w-xxxx: tw_scsiop_read_capacity(): Bad command packet physical address.\n"); in tw_scsiop_read_capacity()
1639 /* Now try to post the command to the board */ in tw_scsiop_read_capacity()
1645 /* This function is called by the isr to complete a readcapacity command */
1653 dprintk(KERN_NOTICE "3w-xxxx: tw_scsiop_read_capacity_complete()\n"); in tw_scsiop_read_capacity_complete()
1656 param = (TW_Param *)tw_dev->alignment_virtual_address[request_id]; in tw_scsiop_read_capacity_complete()
1658 …printk(KERN_WARNING "3w-xxxx: tw_scsiop_read_capacity_complete(): Bad alignment virtual address.\n… in tw_scsiop_read_capacity_complete()
1661 param_data = &(param->data[0]); in tw_scsiop_read_capacity_complete()
1667 capacity -= 1; in tw_scsiop_read_capacity_complete()
1669 dprintk(KERN_NOTICE "3w-xxxx: tw_scsiop_read_capacity_complete(): Capacity = 0x%x.\n", capacity); in tw_scsiop_read_capacity_complete()
1698 dprintk(KERN_NOTICE "3w-xxxx: tw_scsiop_read_write()\n"); in tw_scsiop_read_write()
1700 srb = tw_dev->srb[request_id]; in tw_scsiop_read_write()
1704 printk(KERN_WARNING "3w-xxxx: tw_scsiop_read_write(): Request buffer NULL.\n"); in tw_scsiop_read_write()
1708 /* Initialize command packet */ in tw_scsiop_read_write()
1709 command_packet = (TW_Command *)tw_dev->command_packet_virtual_address[request_id]; in tw_scsiop_read_write()
1711 dprintk(KERN_NOTICE "3w-xxxx: tw_scsiop_read_write(): Bad command packet virtual address.\n"); in tw_scsiop_read_write()
1715 if (srb->cmnd[0] == READ_6 || srb->cmnd[0] == READ_10) { in tw_scsiop_read_write()
1716 command_packet->opcode__sgloffset = TW_OPSGL_IN(3, TW_OP_READ); in tw_scsiop_read_write()
1718 command_packet->opcode__sgloffset = TW_OPSGL_IN(3, TW_OP_WRITE); in tw_scsiop_read_write()
1721 command_packet->size = 3; in tw_scsiop_read_write()
1722 command_packet->request_id = request_id; in tw_scsiop_read_write()
1723 command_packet->unit__hostid = TW_UNITHOST_IN(0, srb->device->id); in tw_scsiop_read_write()
1724 command_packet->status = 0; in tw_scsiop_read_write()
1725 command_packet->flags = 0; in tw_scsiop_read_write()
1727 if (srb->cmnd[0] == WRITE_10) { in tw_scsiop_read_write()
1728 if ((srb->cmnd[1] & 0x8) || (srb->cmnd[1] & 0x10)) in tw_scsiop_read_write()
1729 command_packet->flags = 1; in tw_scsiop_read_write()
1732 if (srb->cmnd[0] == READ_6 || srb->cmnd[0] == WRITE_6) { in tw_scsiop_read_write()
1733 lba = ((u32)srb->cmnd[1] << 16) | ((u32)srb->cmnd[2] << 8) | (u32)srb->cmnd[3]; in tw_scsiop_read_write()
1734 num_sectors = (u32)srb->cmnd[4]; in tw_scsiop_read_write()
1736 …lba = ((u32)srb->cmnd[2] << 24) | ((u32)srb->cmnd[3] << 16) | ((u32)srb->cmnd[4] << 8) | (u32)srb- in tw_scsiop_read_write()
1737 num_sectors = (u32)srb->cmnd[8] | ((u32)srb->cmnd[7] << 8); in tw_scsiop_read_write()
1741 tw_dev->sector_count = num_sectors; in tw_scsiop_read_write()
1742 if (tw_dev->sector_count > tw_dev->max_sector_count) in tw_scsiop_read_write()
1743 tw_dev->max_sector_count = tw_dev->sector_count; in tw_scsiop_read_write()
1745 …dprintk(KERN_NOTICE "3w-xxxx: tw_scsiop_read_write(): lba = 0x%x num_sectors = 0x%x\n", lba, num_s… in tw_scsiop_read_write()
1746 command_packet->byte8.io.lba = lba; in tw_scsiop_read_write()
1747 command_packet->byte6.block_count = num_sectors; in tw_scsiop_read_write()
1753 scsi_for_each_sg(tw_dev->srb[request_id], sg, use_sg, i) { in tw_scsiop_read_write()
1754 command_packet->byte8.io.sgl[i].address = sg_dma_address(sg); in tw_scsiop_read_write()
1755 command_packet->byte8.io.sgl[i].length = sg_dma_len(sg); in tw_scsiop_read_write()
1756 command_packet->size+=2; in tw_scsiop_read_write()
1760 tw_dev->sgl_entries = scsi_sg_count(tw_dev->srb[request_id]); in tw_scsiop_read_write()
1761 if (tw_dev->sgl_entries > tw_dev->max_sgl_entries) in tw_scsiop_read_write()
1762 tw_dev->max_sgl_entries = tw_dev->sgl_entries; in tw_scsiop_read_write()
1764 command_que_value = tw_dev->command_packet_physical_address[request_id]; in tw_scsiop_read_write()
1766 dprintk(KERN_WARNING "3w-xxxx: tw_scsiop_read_write(): Bad command packet physical address.\n"); in tw_scsiop_read_write()
1770 /* Now try to post the command to the board */ in tw_scsiop_read_write()
1776 /* This function will handle the request sense scsi command */
1781 dprintk(KERN_NOTICE "3w-xxxx: tw_scsiop_request_sense()\n"); in tw_scsiop_request_sense()
1790 tw_dev->state[request_id] = TW_S_COMPLETED; in tw_scsiop_request_sense()
1794 tw_dev->srb[request_id]->result = (DID_ERROR << 16); in tw_scsiop_request_sense()
1795 tw_dev->srb[request_id]->scsi_done(tw_dev->srb[request_id]); in tw_scsiop_request_sense()
1800 /* This function will handle synchronize cache scsi command */
1806 dprintk(KERN_NOTICE "3w-xxxx: tw_scsiop_synchronize_cache()\n"); in tw_scsiop_synchronize_cache()
1808 /* Send firmware flush command for this unit */ in tw_scsiop_synchronize_cache()
1809 command_packet = (TW_Command *)tw_dev->command_packet_virtual_address[request_id]; in tw_scsiop_synchronize_cache()
1811 …printk(KERN_WARNING "3w-xxxx: tw_scsiop_synchronize_cache(): Bad command packet virtual address.\n… in tw_scsiop_synchronize_cache()
1815 /* Setup the command packet */ in tw_scsiop_synchronize_cache()
1817 command_packet->opcode__sgloffset = TW_OPSGL_IN(0, TW_OP_FLUSH_CACHE); in tw_scsiop_synchronize_cache()
1818 command_packet->size = 2; in tw_scsiop_synchronize_cache()
1819 command_packet->request_id = request_id; in tw_scsiop_synchronize_cache()
1820 command_packet->unit__hostid = TW_UNITHOST_IN(0, tw_dev->srb[request_id]->device->id); in tw_scsiop_synchronize_cache()
1821 command_packet->status = 0; in tw_scsiop_synchronize_cache()
1822 command_packet->flags = 0; in tw_scsiop_synchronize_cache()
1823 command_packet->byte6.parameter_count = 1; in tw_scsiop_synchronize_cache()
1824 command_que_value = tw_dev->command_packet_physical_address[request_id]; in tw_scsiop_synchronize_cache()
1826 …printk(KERN_WARNING "3w-xxxx: tw_scsiop_synchronize_cache(): Bad command packet physical address.\… in tw_scsiop_synchronize_cache()
1830 /* Now try to post the command packet */ in tw_scsiop_synchronize_cache()
1836 /* This function will handle test unit ready scsi command */
1844 dprintk(KERN_NOTICE "3w-xxxx: tw_scsiop_test_unit_ready()\n"); in tw_scsiop_test_unit_ready()
1846 /* Initialize command packet */ in tw_scsiop_test_unit_ready()
1847 command_packet = (TW_Command *)tw_dev->command_packet_virtual_address[request_id]; in tw_scsiop_test_unit_ready()
1849 …printk(KERN_WARNING "3w-xxxx: tw_scsiop_test_unit_ready(): Bad command packet virtual address.\n"); in tw_scsiop_test_unit_ready()
1853 command_packet->opcode__sgloffset = TW_OPSGL_IN(2, TW_OP_GET_PARAM); in tw_scsiop_test_unit_ready()
1854 command_packet->size = 4; in tw_scsiop_test_unit_ready()
1855 command_packet->request_id = request_id; in tw_scsiop_test_unit_ready()
1856 command_packet->status = 0; in tw_scsiop_test_unit_ready()
1857 command_packet->flags = 0; in tw_scsiop_test_unit_ready()
1858 command_packet->byte6.parameter_count = 1; in tw_scsiop_test_unit_ready()
1861 if (tw_dev->alignment_virtual_address[request_id] == NULL) { in tw_scsiop_test_unit_ready()
1862 printk(KERN_WARNING "3w-xxxx: tw_scsiop_test_unit_ready(): Bad alignment virtual address.\n"); in tw_scsiop_test_unit_ready()
1865 param = (TW_Param *)tw_dev->alignment_virtual_address[request_id]; in tw_scsiop_test_unit_ready()
1867 param->table_id = 3; /* unit summary table */ in tw_scsiop_test_unit_ready()
1868 param->parameter_id = 3; /* unitsstatus parameter */ in tw_scsiop_test_unit_ready()
1869 param->parameter_size_bytes = TW_MAX_UNITS; in tw_scsiop_test_unit_ready()
1870 param_value = tw_dev->alignment_physical_address[request_id]; in tw_scsiop_test_unit_ready()
1872 printk(KERN_WARNING "3w-xxxx: tw_scsiop_test_unit_ready(): Bad alignment physical address.\n"); in tw_scsiop_test_unit_ready()
1876 command_packet->byte8.param.sgl[0].address = param_value; in tw_scsiop_test_unit_ready()
1877 command_packet->byte8.param.sgl[0].length = sizeof(TW_Sector); in tw_scsiop_test_unit_ready()
1878 command_que_value = tw_dev->command_packet_physical_address[request_id]; in tw_scsiop_test_unit_ready()
1880 …printk(KERN_WARNING "3w-xxxx: tw_scsiop_test_unit_ready(): Bad command packet physical address.\n"… in tw_scsiop_test_unit_ready()
1884 /* Now try to post the command packet */ in tw_scsiop_test_unit_ready()
1890 /* This function is called by the isr to complete a testunitready command */
1896 dprintk(KERN_WARNING "3w-xxxx: tw_scsiop_test_unit_ready_complete()\n"); in tw_scsiop_test_unit_ready_complete()
1898 param = (TW_Param *)tw_dev->alignment_virtual_address[request_id]; in tw_scsiop_test_unit_ready_complete()
1900 …printk(KERN_WARNING "3w-xxxx: tw_scsiop_test_unit_ready_complete(): Bad alignment virtual address.… in tw_scsiop_test_unit_ready_complete()
1903 is_unit_present = &(param->data[0]); in tw_scsiop_test_unit_ready_complete()
1905 if (is_unit_present[tw_dev->srb[request_id]->device->id] & TW_UNIT_ONLINE) { in tw_scsiop_test_unit_ready_complete()
1906 tw_dev->is_unit_present[tw_dev->srb[request_id]->device->id] = 1; in tw_scsiop_test_unit_ready_complete()
1908 tw_dev->is_unit_present[tw_dev->srb[request_id]->device->id] = 0; in tw_scsiop_test_unit_ready_complete()
1909 tw_dev->srb[request_id]->result = (DID_BAD_TARGET << 16); in tw_scsiop_test_unit_ready_complete()
1919 unsigned char *command = SCpnt->cmnd; in tw_scsi_queue_lck() local
1922 TW_Device_Extension *tw_dev = (TW_Device_Extension *)SCpnt->device->host->hostdata; in tw_scsi_queue_lck()
1925 if (test_bit(TW_IN_RESET, &tw_dev->flags)) in tw_scsi_queue_lck()
1929 SCpnt->scsi_done = done; in tw_scsi_queue_lck()
1931 /* Queue the command and get a request id */ in tw_scsi_queue_lck()
1934 /* Save the scsi command for use by the ISR */ in tw_scsi_queue_lck()
1935 tw_dev->srb[request_id] = SCpnt; in tw_scsi_queue_lck()
1937 switch (*command) { in tw_scsi_queue_lck()
1942 dprintk(KERN_NOTICE "3w-xxxx: tw_scsi_queue(): caught READ/WRITE.\n"); in tw_scsi_queue_lck()
1946 dprintk(KERN_NOTICE "3w-xxxx: tw_scsi_queue(): caught TEST_UNIT_READY.\n"); in tw_scsi_queue_lck()
1950 dprintk(KERN_NOTICE "3w-xxxx: tw_scsi_queue(): caught INQUIRY.\n"); in tw_scsi_queue_lck()
1954 dprintk(KERN_NOTICE "3w-xxxx: tw_scsi_queue(): caught READ_CAPACITY.\n"); in tw_scsi_queue_lck()
1958 dprintk(KERN_NOTICE "3w-xxxx: tw_scsi_queue(): caught REQUEST_SENSE.\n"); in tw_scsi_queue_lck()
1962 dprintk(KERN_NOTICE "3w-xxxx: tw_scsi_queue(): caught MODE_SENSE.\n"); in tw_scsi_queue_lck()
1966 dprintk(KERN_NOTICE "3w-xxxx: tw_scsi_queue(): caught SYNCHRONIZE_CACHE.\n"); in tw_scsi_queue_lck()
1970 …printk(KERN_WARNING "3w-xxxx: SCSI_IOCTL_SEND_COMMAND deprecated, please update your 3ware tools.\… in tw_scsi_queue_lck()
1973 …printk(KERN_NOTICE "3w-xxxx: scsi%d: Unknown scsi opcode: 0x%x\n", tw_dev->host->host_no, *command in tw_scsi_queue_lck()
1974 tw_dev->state[request_id] = TW_S_COMPLETED; in tw_scsi_queue_lck()
1976 SCpnt->result = (DRIVER_SENSE << 24) | SAM_STAT_CHECK_CONDITION; in tw_scsi_queue_lck()
1977 scsi_build_sense_buffer(1, SCpnt->sense_buffer, ILLEGAL_REQUEST, 0x20, 0); in tw_scsi_queue_lck()
1982 tw_dev->state[request_id] = TW_S_COMPLETED; in tw_scsi_queue_lck()
1984 SCpnt->result = (DID_ERROR << 16); in tw_scsi_queue_lck()
2004 /* Get the host lock for io completions */ in DEF_SCSI_QCMD()
2005 spin_lock(tw_dev->host->host_lock); in DEF_SCSI_QCMD()
2017 if (test_bit(TW_IN_RESET, &tw_dev->flags)) in DEF_SCSI_QCMD()
2022 dprintk(KERN_WARNING "3w-xxxx: tw_interrupt(): Unexpected bits.\n"); in DEF_SCSI_QCMD()
2029 /* Handle host interrupt */ in DEF_SCSI_QCMD()
2031 dprintk(KERN_NOTICE "3w-xxxx: tw_interrupt(): Received host interrupt.\n"); in DEF_SCSI_QCMD()
2037 dprintk(KERN_NOTICE "3w-xxxx: tw_interrupt(): Received attention interrupt.\n"); in DEF_SCSI_QCMD()
2042 printk(KERN_WARNING "3w-xxxx: scsi%d: Error reading aen queue.\n", tw_dev->host->host_no); in DEF_SCSI_QCMD()
2043 tw_dev->state[request_id] = TW_S_COMPLETED; in DEF_SCSI_QCMD()
2048 /* Handle command interrupt */ in DEF_SCSI_QCMD()
2051 while (tw_dev->pending_request_count > 0) { in DEF_SCSI_QCMD()
2052 request_id = tw_dev->pending_queue[tw_dev->pending_head]; in DEF_SCSI_QCMD()
2053 if (tw_dev->state[request_id] != TW_S_PENDING) { in DEF_SCSI_QCMD()
2054 …printk(KERN_WARNING "3w-xxxx: scsi%d: Found request id that wasn't pending.\n", tw_dev->host->host… in DEF_SCSI_QCMD()
2058 if (tw_dev->pending_head == TW_Q_LENGTH-1) { in DEF_SCSI_QCMD()
2059 tw_dev->pending_head = TW_Q_START; in DEF_SCSI_QCMD()
2061 tw_dev->pending_head = tw_dev->pending_head + 1; in DEF_SCSI_QCMD()
2063 tw_dev->pending_request_count--; in DEF_SCSI_QCMD()
2065 /* If we get here, we will continue re-posting on the next command interrupt */ in DEF_SCSI_QCMD()
2069 /* If there are no more pending requests, we mask command interrupt */ in DEF_SCSI_QCMD()
2070 if (tw_dev->pending_request_count == 0) in DEF_SCSI_QCMD()
2081 command_packet = (TW_Command *)tw_dev->command_packet_virtual_address[request_id]; in DEF_SCSI_QCMD()
2085 if (command_packet->status != 0) { in DEF_SCSI_QCMD()
2086 /* If internal command, don't error, don't fill sense */ in DEF_SCSI_QCMD()
2087 if (tw_dev->srb[request_id] == NULL) { in DEF_SCSI_QCMD()
2095 if (tw_dev->state[request_id] != TW_S_POSTED) { in DEF_SCSI_QCMD()
2096 if (tw_dev->srb[request_id] != NULL) { in DEF_SCSI_QCMD()
2097 …printk(KERN_WARNING "3w-xxxx: scsi%d: Received a request id that wasn't posted.\n", tw_dev->host->… in DEF_SCSI_QCMD()
2102 dprintk(KERN_NOTICE "3w-xxxx: tw_interrupt(): Response queue request id: %d.\n", request_id); in DEF_SCSI_QCMD()
2104 /* Check for internal command completion */ in DEF_SCSI_QCMD()
2105 if (tw_dev->srb[request_id] == NULL) { in DEF_SCSI_QCMD()
2106 dprintk(KERN_WARNING "3w-xxxx: tw_interrupt(): Found internally posted command.\n"); in DEF_SCSI_QCMD()
2108 if (request_id != tw_dev->chrdev_request_id) { in DEF_SCSI_QCMD()
2111 printk(KERN_WARNING "3w-xxxx: scsi%d: Error completing aen.\n", tw_dev->host->host_no); in DEF_SCSI_QCMD()
2114 tw_dev->chrdev_request_id = TW_IOCTL_CHRDEV_FREE; in DEF_SCSI_QCMD()
2115 wake_up(&tw_dev->ioctl_wqueue); in DEF_SCSI_QCMD()
2118 switch (tw_dev->srb[request_id]->cmnd[0]) { in DEF_SCSI_QCMD()
2121 dprintk(KERN_NOTICE "3w-xxxx: tw_interrupt(): caught READ_10/READ_6\n"); in DEF_SCSI_QCMD()
2125 dprintk(KERN_NOTICE "3w-xxxx: tw_interrupt(): caught WRITE_10/WRITE_6\n"); in DEF_SCSI_QCMD()
2128 dprintk(KERN_NOTICE "3w-xxxx: tw_interrupt(): caught TEST_UNIT_READY\n"); in DEF_SCSI_QCMD()
2132 dprintk(KERN_NOTICE "3w-xxxx: tw_interrupt(): caught INQUIRY\n"); in DEF_SCSI_QCMD()
2136 dprintk(KERN_NOTICE "3w-xxxx: tw_interrupt(): caught READ_CAPACITY\n"); in DEF_SCSI_QCMD()
2140 dprintk(KERN_NOTICE "3w-xxxx: tw_interrupt(): caught MODE_SENSE\n"); in DEF_SCSI_QCMD()
2144 dprintk(KERN_NOTICE "3w-xxxx: tw_interrupt(): caught SYNCHRONIZE_CACHE\n"); in DEF_SCSI_QCMD()
2147 printk(KERN_WARNING "3w-xxxx: case slip in tw_interrupt()\n"); in DEF_SCSI_QCMD()
2151 /* If no error command was a success */ in DEF_SCSI_QCMD()
2153 tw_dev->srb[request_id]->result = (DID_OK << 16); in DEF_SCSI_QCMD()
2156 /* If error, command failed */ in DEF_SCSI_QCMD()
2158 /* Ask for a host reset */ in DEF_SCSI_QCMD()
2159 tw_dev->srb[request_id]->result = (DID_OK << 16) | (CHECK_CONDITION << 1); in DEF_SCSI_QCMD()
2164 scsi_dma_unmap(tw_dev->srb[request_id]); in DEF_SCSI_QCMD()
2165 tw_dev->srb[request_id]->scsi_done(tw_dev->srb[request_id]); in DEF_SCSI_QCMD()
2166 tw_dev->state[request_id] = TW_S_COMPLETED; in DEF_SCSI_QCMD()
2168 tw_dev->posted_request_count--; in DEF_SCSI_QCMD()
2175 dprintk(KERN_WARNING "3w-xxxx: tw_interrupt(): Unexpected bits.\n"); in DEF_SCSI_QCMD()
2185 spin_unlock(tw_dev->host->host_lock); in DEF_SCSI_QCMD()
2196 free_irq(tw_dev->tw_pci_dev->irq, tw_dev); in __tw_shutdown()
2198 printk(KERN_WARNING "3w-xxxx: Shutting down host %d.\n", tw_dev->host->host_no); in __tw_shutdown()
2202 printk(KERN_WARNING "3w-xxxx: Connection shutdown failed.\n"); in __tw_shutdown()
2204 printk(KERN_WARNING "3w-xxxx: Shutdown complete.\n"); in __tw_shutdown()
2214 struct Scsi_Host *host = pci_get_drvdata(pdev); in tw_shutdown() local
2215 TW_Device_Extension *tw_dev = (TW_Device_Extension *)host->hostdata; in tw_shutdown()
2224 blk_queue_rq_timeout(sdev->request_queue, 60 * HZ); in tw_slave_configure()
2236 .can_queue = TW_Q_LENGTH-2,
2238 .this_id = -1,
2251 struct Scsi_Host *host = NULL; in tw_probe() local
2253 int retval = -ENODEV; in tw_probe()
2257 printk(KERN_WARNING "3w-xxxx: Failed to enable pci device."); in tw_probe()
2265 printk(KERN_WARNING "3w-xxxx: Failed to set dma mask."); in tw_probe()
2269 host = scsi_host_alloc(&driver_template, sizeof(TW_Device_Extension)); in tw_probe()
2270 if (!host) { in tw_probe()
2271 printk(KERN_WARNING "3w-xxxx: Failed to allocate memory for device extension."); in tw_probe()
2272 retval = -ENOMEM; in tw_probe()
2275 tw_dev = (TW_Device_Extension *)host->hostdata; in tw_probe()
2278 tw_dev->host = host; in tw_probe()
2279 tw_dev->tw_pci_dev = pdev; in tw_probe()
2282 printk(KERN_WARNING "3w-xxxx: Failed to initialize device extension."); in tw_probe()
2283 retval = -ENOMEM; in tw_probe()
2288 retval = pci_request_regions(pdev, "3w-xxxx"); in tw_probe()
2290 printk(KERN_WARNING "3w-xxxx: Failed to get mem region."); in tw_probe()
2295 tw_dev->base_addr = pci_resource_start(pdev, 0); in tw_probe()
2296 if (!tw_dev->base_addr) { in tw_probe()
2297 printk(KERN_WARNING "3w-xxxx: Failed to get io address."); in tw_probe()
2298 retval = -ENOMEM; in tw_probe()
2309 /* Set host specific parameters */ in tw_probe()
2310 host->max_id = TW_MAX_UNITS; in tw_probe()
2311 host->max_cmd_len = TW_MAX_CDB_LEN; in tw_probe()
2314 host->max_lun = 0; in tw_probe()
2315 host->max_channel = 0; in tw_probe()
2318 retval = scsi_add_host(host, &pdev->dev); in tw_probe()
2320 printk(KERN_WARNING "3w-xxxx: scsi add host failed"); in tw_probe()
2324 pci_set_drvdata(pdev, host); in tw_probe()
2326 …rintk(KERN_WARNING "3w-xxxx: scsi%d: Found a 3ware Storage Controller at 0x%x, IRQ: %d.\n", host->… in tw_probe()
2329 retval = request_irq(pdev->irq, tw_interrupt, IRQF_SHARED, "3w-xxxx", tw_dev); in tw_probe()
2331 printk(KERN_WARNING "3w-xxxx: Error requesting IRQ."); in tw_probe()
2338 /* Re-enable interrupts on the card */ in tw_probe()
2341 /* Finally, scan the host */ in tw_probe()
2342 scsi_scan_host(host); in tw_probe()
2344 if (twe_major == -1) { in tw_probe()
2346 printk(KERN_WARNING "3w-xxxx: Failed to register character device."); in tw_probe()
2351 scsi_remove_host(host); in tw_probe()
2356 scsi_host_put(host); in tw_probe()
2366 struct Scsi_Host *host = pci_get_drvdata(pdev); in tw_remove() local
2367 TW_Device_Extension *tw_dev = (TW_Device_Extension *)host->hostdata; in tw_remove()
2369 scsi_remove_host(tw_dev->host); in tw_remove()
2374 twe_major = -1; in tw_remove()
2386 scsi_host_put(tw_dev->host); in tw_remove()
2388 tw_device_extension_count--; in tw_remove()
2403 .name = "3w-xxxx",