• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /netgear-WNDR4500v2-V1.0.0.60_1.0.38/src/linux/linux-2.6/drivers/scsi/

Lines Matching refs:scp

430 static int gdth_sync_event(int hanum,int service,unchar index,Scsi_Cmnd *scp);
434 static void gdth_putq(int hanum,Scsi_Cmnd *scp,unchar priority);
436 static int gdth_fill_raw_cmd(int hanum,Scsi_Cmnd *scp,unchar b);
437 static int gdth_special_cmd(int hanum,Scsi_Cmnd *scp);
445 static void gdth_copy_internal_data(int hanum,Scsi_Cmnd *scp,
447 static int gdth_internal_cache_cmd(int hanum,Scsi_Cmnd *scp);
448 static int gdth_fill_cache_cmd(int hanum,Scsi_Cmnd *scp,ushort hdrive);
480 static int gdth_queuecommand(Scsi_Cmnd *scp,void (*done)(Scsi_Cmnd *));
481 static void gdth_scsi_done(struct scsi_cmnd *scp);
717 static void gdth_scsi_done(struct scsi_cmnd *scp)
721 if (scp->request)
722 complete((struct completion *)scp->request);
728 Scsi_Cmnd *scp;
732 scp = kmalloc(sizeof(*scp), GFP_KERNEL);
733 if (!scp)
735 memset(scp, 0, sizeof(*scp));
736 scp->device = sdev;
738 scp->request = (struct request *)&wait;
739 scp->timeout_per_command = timeout*HZ;
740 scp->request_buffer = gdtcmd;
741 scp->cmd_len = 12;
742 memcpy(scp->cmnd, cmnd, 12);
743 scp->SCp.this_residual = IOCTL_PRI; /* priority */
744 scp->done = gdth_scsi_done; /* some fn. test this */
745 gdth_queuecommand(scp, gdth_scsi_done);
748 rval = scp->SCp.Status;
750 *info = scp->SCp.Message;
751 kfree(scp);
755 static void gdth_scsi_done(Scsi_Cmnd *scp)
759 scp->request.rq_status = RQ_SCSI_DONE;
760 if (scp->request.waiting)
761 complete(scp->request.waiting);
767 Scsi_Cmnd *scp = scsi_allocate_device(sdev, 1, FALSE);
772 if (!scp)
774 scp->cmd_len = 12;
775 scp->use_sg = 0;
776 scp->SCp.this_residual = IOCTL_PRI; /* priority */
777 scp->request.rq_status = RQ_SCSI_BUSY;
778 scp->request.waiting = &wait;
779 scsi_do_cmd(scp, cmnd, gdtcmd, bufflen, gdth_scsi_done, timeout*HZ, 1);
782 rval = scp->SCp.Status;
784 *info = scp->SCp.Message;
786 scsi_release_command(scp);
2354 static void gdth_putq(int hanum,Scsi_Cmnd *scp,unchar priority)
2366 if (scp->done != gdth_scsi_done) {
2367 scp->SCp.this_residual = (int)priority;
2368 b = virt_ctr ? NUMDATA(scp->device->host)->busnum:scp->device->channel;
2369 t = scp->device->id;
2374 scp->SCp.buffers_residual = gdth_update_timeout(hanum, scp, 0);
2380 ha->req_first = scp; /* queue was empty */
2381 scp->SCp.ptr = NULL;
2390 pscp->SCp.ptr = (char *)scp;
2391 scp->SCp.ptr = (char *)nscp;
2657 static void gdth_copy_internal_data(int hanum,Scsi_Cmnd *scp,
2666 cpcount = count<=(ushort)scp->request_bufflen ? count:(ushort)scp->request_bufflen;
2669 if (scp->use_sg) {
2670 sl = (struct scatterlist *)scp->request_buffer;
2671 for (i=0,cpsum=0; i<scp->use_sg; ++i,++sl) {
2675 cpnow,cpsum,cpcount,(ushort)scp->bufflen));
2703 memcpy((char*)scp->request_buffer,buffer,cpcount);
2707 static int gdth_internal_cache_cmd(int hanum,Scsi_Cmnd *scp)
2717 t = scp->device->id;
2719 scp->cmnd[0],t));
2721 scp->result = DID_OK << 16;
2722 scp->sense_buffer[0] = 0;
2724 switch (scp->cmnd[0]) {
2747 gdth_copy_internal_data(hanum,scp,(char*)&inq,sizeof(gdth_inq_data));
2757 gdth_copy_internal_data(hanum,scp,(char*)&sd,sizeof(gdth_sense_data));
2769 gdth_copy_internal_data(hanum,scp,(char*)&mpd,sizeof(gdth_modep_data));
2779 gdth_copy_internal_data(hanum,scp,(char*)&rdc,sizeof(gdth_rdcap_data));
2783 if ((scp->cmnd[1] & 0x1f) == SAI_READ_CAPACITY_16 &&
2790 gdth_copy_internal_data(hanum,scp,(char*)&rdc16,sizeof(gdth_rdcap16_data));
2792 scp->result = DID_ABORT << 16;
2797 TRACE2(("Internal cache cmd 0x%x unknown\n",scp->cmnd[0]));
2801 if (!scp->SCp.have_data_in)
2802 scp->SCp.have_data_in++;
2809 static int gdth_fill_cache_cmd(int hanum,Scsi_Cmnd *scp,ushort hdrive)
2824 scp->cmnd[0],scp->cmd_len,hdrive));
2835 cmdp->RequestBuffer = scp;
2847 if (scp->SCp.sent_command != -1)
2848 cmdp->OpCode = scp->SCp.sent_command; /* special cache cmd. */
2849 else if (scp->cmnd[0] == RESERVE)
2851 else if (scp->cmnd[0] == RELEASE)
2853 else if (scp->cmnd[0] == ALLOW_MEDIUM_REMOVAL) {
2854 if (scp->cmnd[4] & 1) /* prevent ? */
2856 else if (scp->cmnd[3] & 1) /* removable drive ? */
2860 } else if (scp->cmnd[0] == WRITE_6 || scp->cmnd[0] == WRITE_10 ||
2861 scp->cmnd[0] == WRITE_12 || scp->cmnd[0] == WRITE_16
2886 if (scp->cmd_len == 16) {
2887 memcpy(&no, &scp->cmnd[2], sizeof(ulong64));
2889 memcpy(&cnt, &scp->cmnd[10], sizeof(ulong32));
2891 } else if (scp->cmd_len == 10) {
2892 memcpy(&no, &scp->cmnd[2], sizeof(ulong32));
2894 memcpy(&cnt, &scp->cmnd[7], sizeof(ushort));
2897 memcpy(&no, &scp->cmnd[0], sizeof(ulong32));
2899 blockcnt= scp->cmnd[4]==0 ? 0x100 : scp->cmnd[4];
2909 if (scp->use_sg) {
2910 sl = (struct scatterlist *)scp->request_buffer;
2911 sgcnt = scp->use_sg;
2912 scp->SCp.Status = GDTH_MAP_SG;
2913 scp->SCp.Message = (read_write == 1 ?
2915 sgcnt = pci_map_sg(ha->pdev,sl,scp->use_sg,scp->SCp.Message);
2948 } else if (scp->request_bufflen) {
2949 scp->SCp.Status = GDTH_MAP_SINGLE;
2950 scp->SCp.Message = (read_write == 1 ?
2952 page = virt_to_page(scp->request_buffer);
2953 offset = (ulong)scp->request_buffer & ~PAGE_MASK;
2955 scp->request_bufflen,scp->SCp.Message);
2956 scp->SCp.dma_handle = phys_addr;
2962 cmdp->u.cache64.sg_lst[0].sg_len = scp->request_bufflen;
2973 cmdp->u.cache.sg_lst[0].sg_len = scp->request_bufflen;
3019 static int gdth_fill_raw_cmd(int hanum,Scsi_Cmnd *scp,unchar b)
3032 t = scp->device->id;
3033 l = scp->device->lun;
3036 scp->cmnd[0],b,t,l));
3044 cmdp->RequestBuffer = scp;
3055 if (scp->SCp.sent_command != -1) {
3056 cmdp->OpCode = scp->SCp.sent_command; /* special raw cmd. */
3059 cmdp->u.raw64.direction = (scp->SCp.phase >> 8);
3065 cmdp->u.raw.direction = (scp->SCp.phase >> 8);
3073 page = virt_to_page(scp->sense_buffer);
3074 offset = (ulong)scp->sense_buffer & ~PAGE_MASK;
3077 *(ulong32 *)&scp->SCp.buffer = (ulong32)sense_paddr;
3079 *(ulong32 *)&scp->host_scribble = (ulong32)((ulong64)sense_paddr >> 32);
3086 cmdp->u.raw64.clen = scp->cmd_len;
3091 cmdp->u.raw64.sdlen = scp->request_bufflen;
3095 gdth_direction_tab[scp->cmnd[0]]==DOU ? GDTH_DATA_OUT:GDTH_DATA_IN;
3096 memcpy(cmdp->u.raw64.cmd,scp->cmnd,16);
3102 cmdp->u.raw.clen = scp->cmd_len;
3108 cmdp->u.raw.sdlen = scp->request_bufflen;
3112 gdth_direction_tab[scp->cmnd[0]]==DOU ? GDTH_DATA_OUT:GDTH_DATA_IN;
3113 memcpy(cmdp->u.raw.cmd,scp->cmnd,12);
3117 if (scp->use_sg) {
3118 sl = (struct scatterlist *)scp->request_buffer;
3119 sgcnt = scp->use_sg;
3120 scp->SCp.Status = GDTH_MAP_SG;
3121 scp->SCp.Message = PCI_DMA_BIDIRECTIONAL;
3122 sgcnt = pci_map_sg(ha->pdev,sl,scp->use_sg,scp->SCp.Message);
3155 } else if (scp->request_bufflen) {
3156 scp->SCp.Status = GDTH_MAP_SINGLE;
3157 scp->SCp.Message = PCI_DMA_BIDIRECTIONAL;
3158 page = virt_to_page(scp->request_buffer);
3159 offset = (ulong)scp->request_buffer & ~PAGE_MASK;
3161 scp->request_bufflen,scp->SCp.Message);
3162 scp->SCp.dma_handle = phys_addr;
3169 cmdp->u.raw64.sg_lst[0].sg_len = scp->request_bufflen;
3180 cmdp->u.raw.sg_lst[0].sg_len = scp->request_bufflen;
3224 static int gdth_special_cmd(int hanum,Scsi_Cmnd *scp)
3237 memcpy( cmdp, scp->request_buffer, sizeof(gdth_cmd_str));
3238 cmdp->RequestBuffer = scp;
3420 Scsi_Cmnd *scp;
3614 scp = ha->cmd_tab[IStatus-2].cmnd;
3617 if (scp == UNUSED_CMND) {
3627 if (scp == INTERNAL_CMND) {
3635 rval = gdth_sync_event(hanum,Service,IStatus,scp);
3639 gdth_putq(hanum,scp,scp->SCp.this_residual);
3641 scp->scsi_done(scp);
3673 static int gdth_sync_event(int hanum,int service,unchar index,Scsi_Cmnd *scp)
3754 b = virt_ctr ? NUMDATA(scp->device->host)->busnum : scp->device->channel;
3755 t = scp->device->id;
3756 if (scp->SCp.sent_command == -1 && b != ha->virt_bus) {
3762 if (scp->SCp.sent_command == GDT_MOUNT)
3763 scp->SCp.sent_command = GDT_CLUST_INFO;
3767 if (scp->SCp.Status == GDTH_MAP_SG)
3768 pci_unmap_sg(ha->pdev,scp->request_buffer,
3769 scp->use_sg,scp->SCp.Message);
3770 else if (scp->SCp.Status == GDTH_MAP_SINGLE)
3771 pci_unmap_page(ha->pdev,scp->SCp.dma_handle,
3772 scp->request_bufflen,scp->SCp.Message);
3773 if (scp->SCp.buffer) {
3775 addr = (dma_addr_t)*(ulong32 *)&scp->SCp.buffer;
3776 if (scp->host_scribble)
3778 ((ulong64)(*(ulong32 *)&scp->host_scribble) << 32);
3783 scp->SCp.Status = S_OK;
3784 scp->SCp.Message = ha->info;
3785 if (scp->SCp.sent_command != -1) {
3787 scp->SCp.sent_command));
3789 if (scp->SCp.sent_command == GDT_CLUST_INFO) {
3794 scp->SCp.sent_command = GDT_MOUNT;
3798 scp->SCp.phase = -2; /* reservation conflict */
3801 scp->SCp.sent_command = -1;
3804 if (scp->SCp.sent_command == GDT_MOUNT) {
3807 } else if (scp->SCp.sent_command == GDT_UNMOUNT) {
3811 scp->SCp.sent_command = -1;
3814 scp->SCp.this_residual = HIGH_PRI;
3818 if (scp->cmnd[0] == RESERVE) {
3820 } else if (scp->cmnd[0] == RELEASE) {
3823 scp->result = DID_OK << 16;
3824 scp->sense_buffer[0] = 0;
3827 scp->SCp.Status = ha->status;
3828 scp->SCp.Message = ha->info;
3830 if (scp->SCp.sent_command != -1) {
3832 scp->SCp.sent_command, ha->status));
3833 if (scp->SCp.sent_command == GDT_SCAN_START ||
3834 scp->SCp.sent_command == GDT_SCAN_END) {
3835 scp->SCp.sent_command = -1;
3837 scp->SCp.this_residual = HIGH_PRI;
3840 memset((char*)scp->sense_buffer,0,16);
3841 scp->sense_buffer[0] = 0x70;
3842 scp->sense_buffer[2] = NOT_READY;
3843 scp->result = (DID_OK << 16) | (CHECK_CONDITION << 1);
3851 memset((char*)scp->sense_buffer,0,16);
3853 scp->result = (DID_OK << 16) | (RESERVATION_CONFLICT << 1);
3855 scp->sense_buffer[0] = 0x70;
3856 scp->sense_buffer[2] = NOT_READY;
3857 scp->result = (DID_OK << 16) | (CHECK_CONDITION << 1);
3859 if (scp->done != gdth_scsi_done) {
3874 scp->result = DID_BAD_TARGET << 16;
3876 scp->result = (DID_OK << 16) | ha->info;
3880 if (!scp->SCp.have_data_in)
3881 scp->SCp.have_data_in++;
4840 static int gdth_eh_bus_reset(Scsi_Cmnd *scp)
4850 hanum = NUMDATA(scp->device->host)->hanum;
4851 b = virt_ctr ? NUMDATA(scp->device->host)->busnum : scp->device->channel;
4935 static int gdth_queuecommand(Scsi_Cmnd *scp,void (*done)(Scsi_Cmnd *))
4940 TRACE(("gdth_queuecommand() cmd 0x%x\n", scp->cmnd[0]));
4942 scp->scsi_done = (void *)done;
4943 scp->SCp.have_data_in = 1;
4944 scp->SCp.phase = -1;
4945 scp->SCp.sent_command = -1;
4946 scp->SCp.Status = GDTH_MAP_NONE;
4947 scp->SCp.buffer = (struct scatterlist *)NULL;
4949 hanum = NUMDATA(scp->device->host)->hanum;
4955 if (scp->done == gdth_scsi_done)
4956 priority = scp->SCp.this_residual;
4958 gdth_update_timeout(hanum, scp, scp->timeout_per_command * 6);
4960 gdth_putq( hanum, scp, priority );
5339 /* but we need ha->info2, not yet stored in scp->SCp */
5399 Scsi_Cmnd *scp;
5528 scp = kmalloc(sizeof(*scp), GFP_KERNEL);
5529 if (!scp)
5531 memset(scp, 0, sizeof(*scp));
5532 scp->device = ha->sdev;
5533 scp->cmd_len = 12;
5534 scp->use_sg = 0;
5535 scp->device->channel = virt_ctr ? 0 : res.number;
5536 rval = gdth_eh_bus_reset(scp);
5538 kfree(scp);
5540 scp = scsi_allocate_device(ha->sdev, 1, FALSE);
5541 if (!scp)
5543 scp->cmd_len = 12;
5544 scp->use_sg = 0;
5545 scp->channel = virt_ctr ? 0 : res.number;
5546 rval = gdth_eh_bus_reset(scp);
5548 scsi_release_command(scp);