Lines Matching full:sfp
178 static int sg_build_indirect(Sg_scatter_hold * schp, Sg_fd * sfp, int buff_size);
179 static ssize_t sg_new_read(Sg_fd * sfp, char __user *buf, size_t count,
181 static ssize_t sg_new_write(Sg_fd *sfp, struct file *file,
184 static int sg_common_write(Sg_fd * sfp, Sg_request * srp,
187 static void sg_remove_scat(Sg_fd * sfp, Sg_scatter_hold * schp);
188 static void sg_build_reserve(Sg_fd * sfp, int req_size);
189 static void sg_link_reserve(Sg_fd * sfp, Sg_request * srp, int size);
190 static void sg_unlink_reserve(Sg_fd * sfp, Sg_request * srp);
193 static Sg_request *sg_get_rq_mark(Sg_fd * sfp, int pack_id, bool *busy);
194 static Sg_request *sg_add_request(Sg_fd * sfp);
195 static int sg_remove_request(Sg_fd * sfp, Sg_request * srp);
237 struct sg_fd *sfp = filp->private_data; in sg_allow_access() local
239 if (sfp->parentdp->device->type == TYPE_SCANNER) in sg_allow_access()
289 Sg_fd *sfp; in sg_open() local
350 sfp = sg_add_sfp(sdp); in sg_open()
351 if (IS_ERR(sfp)) { in sg_open()
352 retval = PTR_ERR(sfp); in sg_open()
356 filp->private_data = sfp; in sg_open()
385 Sg_fd *sfp; in sg_release() local
387 if ((!(sfp = (Sg_fd *) filp->private_data)) || (!(sdp = sfp->parentdp))) in sg_release()
393 kref_put(&sfp->f_ref, sg_remove_sfp); in sg_release()
444 Sg_fd *sfp; in sg_read() local
460 if ((!(sfp = (Sg_fd *) filp->private_data)) || (!(sdp = sfp->parentdp))) in sg_read()
465 if (sfp->force_packid) in sg_read()
470 srp = sg_get_rq_mark(sfp, req_pack_id, &busy); in sg_read()
474 retval = wait_event_interruptible(sfp->read_wait, in sg_read()
475 ((srp = sg_get_rq_mark(sfp, req_pack_id, &busy)) || in sg_read()
482 return sg_new_read(sfp, buf, count, srp); in sg_read()
548 sg_remove_request(sfp, srp); in sg_read()
556 sg_new_read(Sg_fd * sfp, char __user *buf, size_t count, Sg_request * srp) in sg_new_read() argument
591 sg_remove_request(sfp, srp); in sg_new_read()
602 Sg_fd *sfp; in sg_write() local
613 if ((!(sfp = (Sg_fd *) filp->private_data)) || (!(sdp = sfp->parentdp))) in sg_write()
629 return sg_new_write(sfp, filp, buf, count, in sg_write()
638 if (!(srp = sg_add_request(sfp))) { in sg_write()
643 mutex_lock(&sfp->f_mutex); in sg_write()
644 if (sfp->next_cmd_len > 0) { in sg_write()
645 cmd_size = sfp->next_cmd_len; in sg_write()
646 sfp->next_cmd_len = 0; /* reset so only this write() effected */ in sg_write()
652 mutex_unlock(&sfp->f_mutex); in sg_write()
661 sg_remove_request(sfp, srp); in sg_write()
686 sg_remove_request(sfp, srp); in sg_write()
704 k = sg_common_write(sfp, srp, cmnd, sfp->timeout, blocking); in sg_write()
709 sg_new_write(Sg_fd *sfp, struct file *file, const char __user *buf, in sg_new_write() argument
723 sfp->cmd_q = 1; /* when sg_io_hdr seen, set command queuing on */ in sg_new_write()
724 if (!(srp = sg_add_request(sfp))) { in sg_new_write()
725 SCSI_LOG_TIMEOUT(1, sg_printk(KERN_INFO, sfp->parentdp, in sg_new_write()
732 sg_remove_request(sfp, srp); in sg_new_write()
736 sg_remove_request(sfp, srp); in sg_new_write()
740 if (hp->dxfer_len > sfp->reserve.bufflen) { in sg_new_write()
741 sg_remove_request(sfp, srp); in sg_new_write()
745 sg_remove_request(sfp, srp); in sg_new_write()
748 if (sfp->res_in_use) { in sg_new_write()
749 sg_remove_request(sfp, srp); in sg_new_write()
756 sg_remove_request(sfp, srp); in sg_new_write()
760 sg_remove_request(sfp, srp); in sg_new_write()
764 sg_remove_request(sfp, srp); in sg_new_write()
767 k = sg_common_write(sfp, srp, cmnd, timeout, blocking); in sg_new_write()
776 sg_common_write(Sg_fd * sfp, Sg_request * srp, in sg_common_write() argument
780 Sg_device *sdp = sfp->parentdp; in sg_common_write()
791 SCSI_LOG_TIMEOUT(4, sg_printk(KERN_INFO, sfp->parentdp, in sg_common_write()
796 sg_remove_request(sfp, srp); in sg_common_write()
802 SCSI_LOG_TIMEOUT(1, sg_printk(KERN_INFO, sfp->parentdp, in sg_common_write()
805 sg_remove_request(sfp, srp); in sg_common_write()
816 sg_remove_request(sfp, srp); in sg_common_write()
828 kref_get(&sfp->f_ref); /* sg_rq_end_io() does kref_put(). */ in sg_common_write()
834 static int srp_done(Sg_fd *sfp, Sg_request *srp) in srp_done() argument
839 read_lock_irqsave(&sfp->rq_list_lock, flags); in srp_done()
841 read_unlock_irqrestore(&sfp->rq_list_lock, flags); in srp_done()
855 sg_fill_request_table(Sg_fd *sfp, sg_req_info_t *rinfo) in sg_fill_request_table() argument
862 list_for_each_entry(srp, &sfp->rq_list, entry) { in sg_fill_request_table()
915 sg_ioctl_common(struct file *filp, Sg_device *sdp, Sg_fd *sfp, in sg_ioctl_common() argument
933 result = sg_new_write(sfp, filp, p, SZ_SG_IO_HDR, in sg_ioctl_common()
937 result = wait_event_interruptible(sfp->read_wait, in sg_ioctl_common()
938 srp_done(sfp, srp)); in sg_ioctl_common()
939 write_lock_irq(&sfp->rq_list_lock); in sg_ioctl_common()
942 write_unlock_irq(&sfp->rq_list_lock); in sg_ioctl_common()
943 result = sg_new_read(sfp, p, SZ_SG_IO_HDR, srp); in sg_ioctl_common()
947 write_unlock_irq(&sfp->rq_list_lock); in sg_ioctl_common()
958 sfp->timeout_user = val; in sg_ioctl_common()
959 sfp->timeout = mult_frac(val, HZ, USER_HZ); in sg_ioctl_common()
964 return sfp->timeout_user; in sg_ioctl_common()
996 sfp->force_packid = val ? 1 : 0; in sg_ioctl_common()
999 read_lock_irqsave(&sfp->rq_list_lock, iflags); in sg_ioctl_common()
1000 list_for_each_entry(srp, &sfp->rq_list, entry) { in sg_ioctl_common()
1002 read_unlock_irqrestore(&sfp->rq_list_lock, in sg_ioctl_common()
1007 read_unlock_irqrestore(&sfp->rq_list_lock, iflags); in sg_ioctl_common()
1010 read_lock_irqsave(&sfp->rq_list_lock, iflags); in sg_ioctl_common()
1012 list_for_each_entry(srp, &sfp->rq_list, entry) { in sg_ioctl_common()
1016 read_unlock_irqrestore(&sfp->rq_list_lock, iflags); in sg_ioctl_common()
1028 mutex_lock(&sfp->f_mutex); in sg_ioctl_common()
1029 if (val != sfp->reserve.bufflen) { in sg_ioctl_common()
1030 if (sfp->mmap_called || in sg_ioctl_common()
1031 sfp->res_in_use) { in sg_ioctl_common()
1032 mutex_unlock(&sfp->f_mutex); in sg_ioctl_common()
1036 sg_remove_scat(sfp, &sfp->reserve); in sg_ioctl_common()
1037 sg_build_reserve(sfp, val); in sg_ioctl_common()
1039 mutex_unlock(&sfp->f_mutex); in sg_ioctl_common()
1042 val = min_t(int, sfp->reserve.bufflen, in sg_ioctl_common()
1049 sfp->cmd_q = val ? 1 : 0; in sg_ioctl_common()
1052 return put_user((int) sfp->cmd_q, ip); in sg_ioctl_common()
1057 sfp->keep_orphan = val; in sg_ioctl_common()
1060 return put_user((int) sfp->keep_orphan, ip); in sg_ioctl_common()
1067 sfp->next_cmd_len = (val > 0) ? val : 0; in sg_ioctl_common()
1083 read_lock_irqsave(&sfp->rq_list_lock, iflags); in sg_ioctl_common()
1084 sg_fill_request_table(sfp, rinfo); in sg_ioctl_common()
1085 read_unlock_irqrestore(&sfp->rq_list_lock, iflags); in sg_ioctl_common()
1152 Sg_fd *sfp; in sg_ioctl() local
1155 if ((!(sfp = (Sg_fd *) filp->private_data)) || (!(sdp = sfp->parentdp))) in sg_ioctl()
1158 ret = sg_ioctl_common(filp, sdp, sfp, cmd_in, p); in sg_ioctl()
1170 Sg_fd *sfp; in sg_compat_ioctl() local
1173 if ((!(sfp = (Sg_fd *) filp->private_data)) || (!(sdp = sfp->parentdp))) in sg_compat_ioctl()
1176 ret = sg_ioctl_common(filp, sdp, sfp, cmd_in, p); in sg_compat_ioctl()
1189 Sg_fd *sfp; in sg_poll() local
1194 sfp = filp->private_data; in sg_poll()
1195 if (!sfp) in sg_poll()
1197 sdp = sfp->parentdp; in sg_poll()
1200 poll_wait(filp, &sfp->read_wait, wait); in sg_poll()
1201 read_lock_irqsave(&sfp->rq_list_lock, iflags); in sg_poll()
1202 list_for_each_entry(srp, &sfp->rq_list, entry) { in sg_poll()
1208 read_unlock_irqrestore(&sfp->rq_list_lock, iflags); in sg_poll()
1212 else if (!sfp->cmd_q) { in sg_poll()
1226 Sg_fd *sfp; in sg_fasync() local
1228 if ((!(sfp = (Sg_fd *) filp->private_data)) || (!(sdp = sfp->parentdp))) in sg_fasync()
1233 return fasync_helper(fd, filp, mode, &sfp->async_qp); in sg_fasync()
1240 Sg_fd *sfp; in sg_vma_fault() local
1245 if ((NULL == vma) || (!(sfp = (Sg_fd *) vma->vm_private_data))) in sg_vma_fault()
1247 rsv_schp = &sfp->reserve; in sg_vma_fault()
1251 SCSI_LOG_TIMEOUT(3, sg_printk(KERN_INFO, sfp->parentdp, in sg_vma_fault()
1280 Sg_fd *sfp; in sg_mmap() local
1286 if ((!filp) || (!vma) || (!(sfp = (Sg_fd *) filp->private_data))) in sg_mmap()
1289 SCSI_LOG_TIMEOUT(3, sg_printk(KERN_INFO, sfp->parentdp, in sg_mmap()
1294 rsv_schp = &sfp->reserve; in sg_mmap()
1295 mutex_lock(&sfp->f_mutex); in sg_mmap()
1309 sfp->mmap_called = 1; in sg_mmap()
1311 vma->vm_private_data = sfp; in sg_mmap()
1314 mutex_unlock(&sfp->f_mutex); in sg_mmap()
1322 struct sg_fd *sfp = srp->parentfp; in sg_rq_end_io_usercontext() local
1325 sg_remove_request(sfp, srp); in sg_rq_end_io_usercontext()
1326 kref_put(&sfp->f_ref, sg_remove_sfp); in sg_rq_end_io_usercontext()
1339 Sg_fd *sfp; in sg_rq_end_io() local
1348 sfp = srp->parentfp; in sg_rq_end_io()
1349 if (WARN_ON(sfp == NULL)) in sg_rq_end_io()
1352 sdp = sfp->parentdp; in sg_rq_end_io()
1408 write_lock_irqsave(&sfp->rq_list_lock, iflags); in sg_rq_end_io()
1410 if (sfp->keep_orphan) in sg_rq_end_io()
1416 write_unlock_irqrestore(&sfp->rq_list_lock, iflags); in sg_rq_end_io()
1422 wake_up_interruptible(&sfp->read_wait); in sg_rq_end_io()
1423 kill_fasync(&sfp->async_qp, SIGPOLL, POLL_IN); in sg_rq_end_io()
1424 kref_put(&sfp->f_ref, sg_remove_sfp); in sg_rq_end_io()
1619 Sg_fd *sfp; in sg_remove_device() local
1633 list_for_each_entry(sfp, &sdp->sfds, sfd_siblings) { in sg_remove_device()
1634 wake_up_interruptible_all(&sfp->read_wait); in sg_remove_device()
1635 kill_fasync(&sfp->async_qp, SIGPOLL, POLL_HUP); in sg_remove_device()
1721 Sg_fd *sfp = srp->parentfp; in sg_start_req() local
1727 Sg_scatter_hold *rsv_schp = &sfp->reserve; in sg_start_req()
1728 struct request_queue *q = sfp->parentdp->device->request_queue; in sg_start_req()
1733 SCSI_LOG_TIMEOUT(4, sg_printk(KERN_INFO, sfp->parentdp, in sg_start_req()
1776 !sfp->parentdp->device->host->unchecked_isa_dma && in sg_start_req()
1783 mutex_lock(&sfp->f_mutex); in sg_start_req()
1785 !sfp->res_in_use) { in sg_start_req()
1786 sfp->res_in_use = 1; in sg_start_req()
1787 sg_link_reserve(sfp, srp, dxfer_len); in sg_start_req()
1789 res = -EBUSY; /* sfp->res_in_use == 1 */ in sg_start_req()
1792 mutex_unlock(&sfp->f_mutex); in sg_start_req()
1795 res = sg_build_indirect(req_schp, sfp, dxfer_len); in sg_start_req()
1797 mutex_unlock(&sfp->f_mutex); in sg_start_req()
1801 mutex_unlock(&sfp->f_mutex); in sg_start_req()
1850 Sg_fd *sfp = srp->parentfp; in sg_finish_rem_req() local
1853 SCSI_LOG_TIMEOUT(4, sg_printk(KERN_INFO, sfp->parentdp, in sg_finish_rem_req()
1865 sg_unlink_reserve(sfp, srp); in sg_finish_rem_req()
1867 sg_remove_scat(sfp, req_schp); in sg_finish_rem_req()
1873 sg_build_sgat(Sg_scatter_hold * schp, const Sg_fd * sfp, int tablesize) in sg_build_sgat() argument
1886 sg_build_indirect(Sg_scatter_hold * schp, Sg_fd * sfp, int buff_size) in sg_build_indirect() argument
1889 int sg_tablesize = sfp->parentdp->sg_tablesize; in sg_build_indirect()
1892 struct sg_device *sdp = sfp->parentdp; in sg_build_indirect()
1900 SCSI_LOG_TIMEOUT(4, sg_printk(KERN_INFO, sfp->parentdp, in sg_build_indirect()
1905 mx_sc_elems = sg_build_sgat(schp, sfp, sg_tablesize); in sg_build_indirect()
1942 SCSI_LOG_TIMEOUT(5, sg_printk(KERN_INFO, sfp->parentdp, in sg_build_indirect()
1949 SCSI_LOG_TIMEOUT(5, sg_printk(KERN_INFO, sfp->parentdp, in sg_build_indirect()
1968 sg_remove_scat(Sg_fd * sfp, Sg_scatter_hold * schp) in sg_remove_scat() argument
1970 SCSI_LOG_TIMEOUT(4, sg_printk(KERN_INFO, sfp->parentdp, in sg_remove_scat()
1978 sg_printk(KERN_INFO, sfp->parentdp, in sg_remove_scat()
2024 sg_build_reserve(Sg_fd * sfp, int req_size) in sg_build_reserve() argument
2026 Sg_scatter_hold *schp = &sfp->reserve; in sg_build_reserve()
2028 SCSI_LOG_TIMEOUT(4, sg_printk(KERN_INFO, sfp->parentdp, in sg_build_reserve()
2033 if (0 == sg_build_indirect(schp, sfp, req_size)) in sg_build_reserve()
2036 sg_remove_scat(sfp, schp); in sg_build_reserve()
2042 sg_link_reserve(Sg_fd * sfp, Sg_request * srp, int size) in sg_link_reserve() argument
2045 Sg_scatter_hold *rsv_schp = &sfp->reserve; in sg_link_reserve()
2049 SCSI_LOG_TIMEOUT(4, sg_printk(KERN_INFO, sfp->parentdp, in sg_link_reserve()
2068 SCSI_LOG_TIMEOUT(1, sg_printk(KERN_INFO, sfp->parentdp, in sg_link_reserve()
2073 sg_unlink_reserve(Sg_fd * sfp, Sg_request * srp) in sg_unlink_reserve() argument
2087 sfp->res_in_use = 0; in sg_unlink_reserve()
2091 sg_get_rq_mark(Sg_fd * sfp, int pack_id, bool *busy) in sg_get_rq_mark() argument
2097 write_lock_irqsave(&sfp->rq_list_lock, iflags); in sg_get_rq_mark()
2098 list_for_each_entry(resp, &sfp->rq_list, entry) { in sg_get_rq_mark()
2108 write_unlock_irqrestore(&sfp->rq_list_lock, iflags); in sg_get_rq_mark()
2115 write_unlock_irqrestore(&sfp->rq_list_lock, iflags); in sg_get_rq_mark()
2121 sg_add_request(Sg_fd * sfp) in sg_add_request() argument
2125 Sg_request *rp = sfp->req_arr; in sg_add_request()
2127 write_lock_irqsave(&sfp->rq_list_lock, iflags); in sg_add_request()
2128 if (!list_empty(&sfp->rq_list)) { in sg_add_request()
2129 if (!sfp->cmd_q) in sg_add_request()
2140 rp->parentfp = sfp; in sg_add_request()
2142 list_add_tail(&rp->entry, &sfp->rq_list); in sg_add_request()
2143 write_unlock_irqrestore(&sfp->rq_list_lock, iflags); in sg_add_request()
2146 write_unlock_irqrestore(&sfp->rq_list_lock, iflags); in sg_add_request()
2152 sg_remove_request(Sg_fd * sfp, Sg_request * srp) in sg_remove_request() argument
2157 if (!sfp || !srp || list_empty(&sfp->rq_list)) in sg_remove_request()
2159 write_lock_irqsave(&sfp->rq_list_lock, iflags); in sg_remove_request()
2165 write_unlock_irqrestore(&sfp->rq_list_lock, iflags); in sg_remove_request()
2172 if (unlikely(atomic_read(&sfp->parentdp->detaching))) in sg_remove_request()
2173 wake_up_interruptible_all(&sfp->read_wait); in sg_remove_request()
2181 Sg_fd *sfp; in sg_add_sfp() local
2185 sfp = kzalloc(sizeof(*sfp), GFP_ATOMIC | __GFP_NOWARN); in sg_add_sfp()
2186 if (!sfp) in sg_add_sfp()
2189 init_waitqueue_head(&sfp->read_wait); in sg_add_sfp()
2190 rwlock_init(&sfp->rq_list_lock); in sg_add_sfp()
2191 INIT_LIST_HEAD(&sfp->rq_list); in sg_add_sfp()
2192 kref_init(&sfp->f_ref); in sg_add_sfp()
2193 mutex_init(&sfp->f_mutex); in sg_add_sfp()
2194 sfp->timeout = SG_DEFAULT_TIMEOUT; in sg_add_sfp()
2195 sfp->timeout_user = SG_DEFAULT_TIMEOUT_USER; in sg_add_sfp()
2196 sfp->force_packid = SG_DEF_FORCE_PACK_ID; in sg_add_sfp()
2197 sfp->cmd_q = SG_DEF_COMMAND_Q; in sg_add_sfp()
2198 sfp->keep_orphan = SG_DEF_KEEP_ORPHAN; in sg_add_sfp()
2199 sfp->parentdp = sdp; in sg_add_sfp()
2203 kfree(sfp); in sg_add_sfp()
2206 list_add_tail(&sfp->sfd_siblings, &sdp->sfds); in sg_add_sfp()
2209 "sg_add_sfp: sfp=0x%p\n", sfp)); in sg_add_sfp()
2215 sg_build_reserve(sfp, bufflen); in sg_add_sfp()
2218 sfp->reserve.bufflen, in sg_add_sfp()
2219 sfp->reserve.k_use_sg)); in sg_add_sfp()
2223 return sfp; in sg_add_sfp()
2229 struct sg_fd *sfp = container_of(work, struct sg_fd, ew.work); in sg_remove_sfp_usercontext() local
2230 struct sg_device *sdp = sfp->parentdp; in sg_remove_sfp_usercontext()
2235 write_lock_irqsave(&sfp->rq_list_lock, iflags); in sg_remove_sfp_usercontext()
2236 while (!list_empty(&sfp->rq_list)) { in sg_remove_sfp_usercontext()
2237 srp = list_first_entry(&sfp->rq_list, Sg_request, entry); in sg_remove_sfp_usercontext()
2242 write_unlock_irqrestore(&sfp->rq_list_lock, iflags); in sg_remove_sfp_usercontext()
2244 if (sfp->reserve.bufflen > 0) { in sg_remove_sfp_usercontext()
2247 (int) sfp->reserve.bufflen, in sg_remove_sfp_usercontext()
2248 (int) sfp->reserve.k_use_sg)); in sg_remove_sfp_usercontext()
2249 sg_remove_scat(sfp, &sfp->reserve); in sg_remove_sfp_usercontext()
2253 "sg_remove_sfp: sfp=0x%p\n", sfp)); in sg_remove_sfp_usercontext()
2254 kfree(sfp); in sg_remove_sfp_usercontext()
2264 struct sg_fd *sfp = container_of(kref, struct sg_fd, f_ref); in sg_remove_sfp() local
2265 struct sg_device *sdp = sfp->parentdp; in sg_remove_sfp()
2269 list_del(&sfp->sfd_siblings); in sg_remove_sfp()
2272 INIT_WORK(&sfp->ew.work, sg_remove_sfp_usercontext); in sg_remove_sfp()
2273 schedule_work(&sfp->ew.work); in sg_remove_sfp()