Lines Matching full:instance
295 static inline struct usbatm_vcc_data *usbatm_find_vcc(struct usbatm_data *instance, in usbatm_find_vcc() argument
300 list_for_each_entry(vcc_data, &instance->vcc_list, list) in usbatm_find_vcc()
306 static void usbatm_extract_one_cell(struct usbatm_data *instance, unsigned char *source) in usbatm_extract_one_cell() argument
316 if ((vci != instance->cached_vci) || (vpi != instance->cached_vpi)) { in usbatm_extract_one_cell()
317 instance->cached_vpi = vpi; in usbatm_extract_one_cell()
318 instance->cached_vci = vci; in usbatm_extract_one_cell()
320 instance->cached_vcc = usbatm_find_vcc(instance, vpi, vci); in usbatm_extract_one_cell()
322 if (!instance->cached_vcc) in usbatm_extract_one_cell()
323 atm_rldbg(instance, "%s: unknown vpi/vci (%hd/%d)!\n", __func__, vpi, vci); in usbatm_extract_one_cell()
326 if (!instance->cached_vcc) in usbatm_extract_one_cell()
329 vcc = instance->cached_vcc->vcc; in usbatm_extract_one_cell()
334 atm_warn(instance, "%s: OAM not supported (vpi %d, vci %d)!\n", in usbatm_extract_one_cell()
340 sarb = instance->cached_vcc->sarb; in usbatm_extract_one_cell()
343 atm_rldbg(instance, "%s: buffer overrun (sarb->len %u, vcc: 0x%p)!\n", in usbatm_extract_one_cell()
347 UDSL_ASSERT(instance, sarb->tail + ATM_CELL_PAYLOAD <= sarb->end); in usbatm_extract_one_cell()
362 atm_rldbg(instance, "%s: bogus length %u (vcc: 0x%p)!\n", in usbatm_extract_one_cell()
371 atm_rldbg(instance, "%s: bogus pdu_length %u (sarb->len: %u, vcc: 0x%p)!\n", in usbatm_extract_one_cell()
378 atm_rldbg(instance, "%s: packet failed crc check (vcc: 0x%p)!\n", in usbatm_extract_one_cell()
388 atm_err(instance, "%s: no memory for skb (length: %u)!\n", in usbatm_extract_one_cell()
397 atm_rldbg(instance, "%s: failed atm_charge (skb->truesize: %u)!\n", in usbatm_extract_one_cell()
421 static void usbatm_extract_cells(struct usbatm_data *instance, in usbatm_extract_cells() argument
424 unsigned int stride = instance->rx_channel.stride; in usbatm_extract_cells()
425 unsigned int buf_usage = instance->buf_usage; in usbatm_extract_cells()
432 unsigned char *cell_buf = instance->cell_buf; in usbatm_extract_cells()
435 UDSL_ASSERT(instance, buf_usage <= stride); in usbatm_extract_cells()
442 usbatm_extract_one_cell(instance, cell_buf); in usbatm_extract_cells()
443 instance->buf_usage = 0; in usbatm_extract_cells()
447 instance->buf_usage = buf_usage + avail_data; in usbatm_extract_cells()
453 usbatm_extract_one_cell(instance, source); in usbatm_extract_cells()
458 memcpy(instance->cell_buf, source, avail_data); in usbatm_extract_cells()
459 instance->buf_usage = avail_data; in usbatm_extract_cells()
468 static unsigned int usbatm_write_cells(struct usbatm_data *instance, in usbatm_write_cells() argument
475 unsigned int stride = instance->tx_channel.stride; in usbatm_write_cells()
478 UDSL_ASSERT(instance, !(avail_space % stride)); in usbatm_write_cells()
533 struct usbatm_data *instance = (struct usbatm_data *)data; in usbatm_rx_process() local
536 while ((urb = usbatm_pop_urb(&instance->rx_channel))) { in usbatm_rx_process()
542 const unsigned int packet_size = instance->rx_channel.packet_size; in usbatm_rx_process()
549 UDSL_ASSERT(instance, actual_length <= packet_size); in usbatm_rx_process()
555 usbatm_extract_cells(instance, merge_start, merge_length); in usbatm_rx_process()
559 atm_rldbg(instance, "%s: status %d in frame %d!\n", __func__, urb->status, i); in usbatm_rx_process()
561 usbatm_extract_cells(instance, merge_start, merge_length); in usbatm_rx_process()
563 instance->buf_usage = 0; in usbatm_rx_process()
568 usbatm_extract_cells(instance, merge_start, merge_length); in usbatm_rx_process()
571 usbatm_extract_cells(instance, urb->transfer_buffer, urb->actual_length); in usbatm_rx_process()
573 instance->buf_usage = 0; in usbatm_rx_process()
587 struct usbatm_data *instance = (struct usbatm_data *)data; in usbatm_tx_process() local
588 struct sk_buff *skb = instance->current_skb; in usbatm_tx_process()
590 const unsigned int buf_size = instance->tx_channel.buf_size; in usbatm_tx_process()
595 skb = skb_dequeue(&instance->sndqueue); in usbatm_tx_process()
599 urb = usbatm_pop_urb(&instance->tx_channel); in usbatm_tx_process()
607 bytes_written += usbatm_write_cells(instance, skb, in usbatm_tx_process()
620 skb = skb_dequeue(&instance->sndqueue); in usbatm_tx_process()
632 instance->current_skb = skb; in usbatm_tx_process()
635 static void usbatm_cancel_send(struct usbatm_data *instance, in usbatm_cancel_send() argument
640 atm_dbg(instance, "%s entered\n", __func__); in usbatm_cancel_send()
641 spin_lock_irq(&instance->sndqueue.lock); in usbatm_cancel_send()
642 skb_queue_walk_safe(&instance->sndqueue, skb, n) { in usbatm_cancel_send()
644 atm_dbg(instance, "%s: popping skb 0x%p\n", __func__, skb); in usbatm_cancel_send()
645 __skb_unlink(skb, &instance->sndqueue); in usbatm_cancel_send()
649 spin_unlock_irq(&instance->sndqueue.lock); in usbatm_cancel_send()
651 tasklet_disable(&instance->tx_channel.tasklet); in usbatm_cancel_send()
652 if ((skb = instance->current_skb) && (UDSL_SKB(skb)->atm.vcc == vcc)) { in usbatm_cancel_send()
653 atm_dbg(instance, "%s: popping current skb (0x%p)\n", __func__, skb); in usbatm_cancel_send()
654 instance->current_skb = NULL; in usbatm_cancel_send()
657 tasklet_enable(&instance->tx_channel.tasklet); in usbatm_cancel_send()
658 atm_dbg(instance, "%s done\n", __func__); in usbatm_cancel_send()
663 struct usbatm_data *instance = vcc->dev->dev_data; in usbatm_atm_send() local
670 if (!instance || instance->disconnected) { in usbatm_atm_send()
672 printk_ratelimited(KERN_DEBUG "%s: %s!\n", __func__, instance ? "disconnected" : "NULL instance"); in usbatm_atm_send()
679 atm_rldbg(instance, "%s: unsupported ATM type %d!\n", __func__, vcc->qos.aal); in usbatm_atm_send()
685 atm_rldbg(instance, "%s: packet too long (%d vs %d)!\n", in usbatm_atm_send()
698 skb_queue_tail(&instance->sndqueue, skb); in usbatm_atm_send()
699 tasklet_schedule(&instance->tx_channel.tasklet); in usbatm_atm_send()
715 struct usbatm_data *instance = container_of(kref, struct usbatm_data, refcount); in usbatm_destroy_instance() local
719 tasklet_kill(&instance->rx_channel.tasklet); in usbatm_destroy_instance()
720 tasklet_kill(&instance->tx_channel.tasklet); in usbatm_destroy_instance()
721 usb_put_dev(instance->usb_dev); in usbatm_destroy_instance()
722 kfree(instance); in usbatm_destroy_instance()
725 static void usbatm_get_instance(struct usbatm_data *instance) in usbatm_get_instance() argument
729 kref_get(&instance->refcount); in usbatm_get_instance()
732 static void usbatm_put_instance(struct usbatm_data *instance) in usbatm_put_instance() argument
736 kref_put(&instance->refcount, usbatm_destroy_instance); in usbatm_put_instance()
746 struct usbatm_data *instance = atm_dev->dev_data; in usbatm_atm_dev_close() local
750 if (!instance) in usbatm_atm_dev_close()
754 usbatm_put_instance(instance); /* taken in usbatm_atm_init */ in usbatm_atm_dev_close()
759 struct usbatm_data *instance = atm_dev->dev_data; in usbatm_atm_proc_read() local
762 if (!instance) { in usbatm_atm_proc_read()
763 dbg("%s: NULL instance!", __func__); in usbatm_atm_proc_read()
768 return sprintf(page, "%s\n", instance->description); in usbatm_atm_proc_read()
783 if (instance->disconnected) in usbatm_atm_proc_read()
801 struct usbatm_data *instance = vcc->dev->dev_data; in usbatm_atm_open() local
807 if (!instance) { in usbatm_atm_open()
812 atm_dbg(instance, "%s: vpi %hd, vci %d\n", __func__, vpi, vci); in usbatm_atm_open()
816 atm_warn(instance, "%s: unsupported ATM type %d!\n", __func__, vcc->qos.aal); in usbatm_atm_open()
822 atm_dbg(instance, "%s: max_sdu %d out of range!\n", __func__, vcc->qos.rxtp.max_sdu); in usbatm_atm_open()
826 mutex_lock(&instance->serialize); /* vs self, usbatm_atm_close, usbatm_usb_disconnect */ in usbatm_atm_open()
828 if (instance->disconnected) { in usbatm_atm_open()
829 atm_dbg(instance, "%s: disconnected!\n", __func__); in usbatm_atm_open()
834 if (usbatm_find_vcc(instance, vpi, vci)) { in usbatm_atm_open()
835 atm_dbg(instance, "%s: %hd/%d already in use!\n", __func__, vpi, vci); in usbatm_atm_open()
841 atm_err(instance, "%s: no memory for vcc_data!\n", __func__); in usbatm_atm_open()
852 atm_err(instance, "%s: no memory for SAR buffer!\n", __func__); in usbatm_atm_open()
859 tasklet_disable(&instance->rx_channel.tasklet); in usbatm_atm_open()
860 instance->cached_vcc = new; in usbatm_atm_open()
861 instance->cached_vpi = vpi; in usbatm_atm_open()
862 instance->cached_vci = vci; in usbatm_atm_open()
863 list_add(&new->list, &instance->vcc_list); in usbatm_atm_open()
864 tasklet_enable(&instance->rx_channel.tasklet); in usbatm_atm_open()
870 mutex_unlock(&instance->serialize); in usbatm_atm_open()
872 atm_dbg(instance, "%s: allocated vcc data 0x%p\n", __func__, new); in usbatm_atm_open()
878 mutex_unlock(&instance->serialize); in usbatm_atm_open()
884 struct usbatm_data *instance = vcc->dev->dev_data; in usbatm_atm_close() local
887 if (!instance || !vcc_data) { in usbatm_atm_close()
892 atm_dbg(instance, "%s entered\n", __func__); in usbatm_atm_close()
894 atm_dbg(instance, "%s: deallocating vcc 0x%p with vpi %d vci %d\n", in usbatm_atm_close()
897 usbatm_cancel_send(instance, vcc); in usbatm_atm_close()
899 mutex_lock(&instance->serialize); /* vs self, usbatm_atm_open, usbatm_usb_disconnect */ in usbatm_atm_close()
901 tasklet_disable(&instance->rx_channel.tasklet); in usbatm_atm_close()
902 if (instance->cached_vcc == vcc_data) { in usbatm_atm_close()
903 instance->cached_vcc = NULL; in usbatm_atm_close()
904 instance->cached_vpi = ATM_VPI_UNSPEC; in usbatm_atm_close()
905 instance->cached_vci = ATM_VCI_UNSPEC; in usbatm_atm_close()
908 tasklet_enable(&instance->rx_channel.tasklet); in usbatm_atm_close()
922 mutex_unlock(&instance->serialize); in usbatm_atm_close()
924 atm_dbg(instance, "%s successful\n", __func__); in usbatm_atm_close()
930 struct usbatm_data *instance = atm_dev->dev_data; in usbatm_atm_ioctl() local
932 if (!instance || instance->disconnected) { in usbatm_atm_ioctl()
933 dbg("%s: %s!", __func__, instance ? "disconnected" : "NULL instance"); in usbatm_atm_ioctl()
945 static int usbatm_atm_init(struct usbatm_data *instance) in usbatm_atm_init() argument
954 atm_dev = atm_dev_register(instance->driver_name, in usbatm_atm_init()
955 &instance->usb_intf->dev, &usbatm_atm_devops, in usbatm_atm_init()
958 usb_err(instance, "%s: failed to register ATM device!\n", __func__); in usbatm_atm_init()
962 instance->atm_dev = atm_dev; in usbatm_atm_init()
971 if (instance->driver->atm_start && ((ret = instance->driver->atm_start(instance, atm_dev)) < 0)) { in usbatm_atm_init()
972 atm_err(instance, "%s: atm_start failed: %d!\n", __func__, ret); in usbatm_atm_init()
976 usbatm_get_instance(instance); /* dropped in usbatm_atm_dev_close */ in usbatm_atm_init()
980 atm_dev->dev_data = instance; in usbatm_atm_init()
984 usbatm_submit_urb(instance->urbs[i]); in usbatm_atm_init()
989 instance->atm_dev = NULL; in usbatm_atm_init()
1001 struct usbatm_data *instance = arg; in usbatm_do_heavy_init() local
1005 complete(&instance->thread_started); in usbatm_do_heavy_init()
1007 ret = instance->driver->heavy_init(instance, instance->usb_intf); in usbatm_do_heavy_init()
1010 ret = usbatm_atm_init(instance); in usbatm_do_heavy_init()
1012 mutex_lock(&instance->serialize); in usbatm_do_heavy_init()
1013 instance->thread = NULL; in usbatm_do_heavy_init()
1014 mutex_unlock(&instance->serialize); in usbatm_do_heavy_init()
1016 complete_and_exit(&instance->thread_exited, ret); in usbatm_do_heavy_init()
1019 static int usbatm_heavy_init(struct usbatm_data *instance) in usbatm_heavy_init() argument
1023 t = kthread_create(usbatm_do_heavy_init, instance, in usbatm_heavy_init()
1024 instance->driver->driver_name); in usbatm_heavy_init()
1026 usb_err(instance, "%s: failed to create kernel_thread (%ld)!\n", in usbatm_heavy_init()
1031 instance->thread = t; in usbatm_heavy_init()
1033 wait_for_completion(&instance->thread_started); in usbatm_heavy_init()
1057 struct usbatm_data *instance; in usbatm_usb_probe() local
1069 /* instance init */ in usbatm_usb_probe()
1070 …instance = kzalloc(sizeof(*instance) + sizeof(struct urb *) * (num_rcv_urbs + num_snd_urbs), GFP_K… in usbatm_usb_probe()
1071 if (!instance) { in usbatm_usb_probe()
1072 dev_err(dev, "%s: no memory for instance data!\n", __func__); in usbatm_usb_probe()
1078 instance->driver = driver; in usbatm_usb_probe()
1079 snprintf(instance->driver_name, sizeof(instance->driver_name), driver->driver_name); in usbatm_usb_probe()
1081 instance->usb_dev = usb_dev; in usbatm_usb_probe()
1082 instance->usb_intf = intf; in usbatm_usb_probe()
1084 buf = instance->description; in usbatm_usb_probe()
1085 length = sizeof(instance->description); in usbatm_usb_probe()
1106 if (driver->bind && (error = driver->bind(instance, intf, id)) < 0) { in usbatm_usb_probe()
1113 kref_init(&instance->refcount); /* dropped in usbatm_usb_disconnect */ in usbatm_usb_probe()
1114 mutex_init(&instance->serialize); in usbatm_usb_probe()
1116 instance->thread = NULL; in usbatm_usb_probe()
1117 init_completion(&instance->thread_started); in usbatm_usb_probe()
1118 init_completion(&instance->thread_exited); in usbatm_usb_probe()
1120 INIT_LIST_HEAD(&instance->vcc_list); in usbatm_usb_probe()
1121 skb_queue_head_init(&instance->sndqueue); in usbatm_usb_probe()
1123 usbatm_init_channel(&instance->rx_channel); in usbatm_usb_probe()
1124 usbatm_init_channel(&instance->tx_channel); in usbatm_usb_probe()
1125 tasklet_init(&instance->rx_channel.tasklet, usbatm_rx_process, (unsigned long)instance); in usbatm_usb_probe()
1126 tasklet_init(&instance->tx_channel.tasklet, usbatm_tx_process, (unsigned long)instance); in usbatm_usb_probe()
1127 instance->rx_channel.stride = ATM_CELL_SIZE + driver->rx_padding; in usbatm_usb_probe()
1128 instance->tx_channel.stride = ATM_CELL_SIZE + driver->tx_padding; in usbatm_usb_probe()
1129 instance->rx_channel.usbatm = instance->tx_channel.usbatm = instance; in usbatm_usb_probe()
1131 if ((instance->flags & UDSL_USE_ISOC) && driver->isoc_in) in usbatm_usb_probe()
1132 instance->rx_channel.endpoint = usb_rcvisocpipe(usb_dev, driver->isoc_in); in usbatm_usb_probe()
1134 instance->rx_channel.endpoint = usb_rcvbulkpipe(usb_dev, driver->bulk_in); in usbatm_usb_probe()
1136 instance->tx_channel.endpoint = usb_sndbulkpipe(usb_dev, driver->bulk_out); in usbatm_usb_probe()
1139 instance->tx_channel.buf_size = max(instance->tx_channel.stride, in usbatm_usb_probe()
1140 snd_buf_bytes - (snd_buf_bytes % instance->tx_channel.stride)); in usbatm_usb_probe()
1143 maxpacket = usb_maxpacket(usb_dev, instance->rx_channel.endpoint, 0); in usbatm_usb_probe()
1147 usb_pipeendpoint(instance->rx_channel.endpoint)); in usbatm_usb_probe()
1157 instance->rx_channel.buf_size = num_packets * maxpacket; in usbatm_usb_probe()
1158 instance->rx_channel.packet_size = maxpacket; in usbatm_usb_probe()
1163 &instance->tx_channel : &instance->rx_channel; in usbatm_usb_probe()
1174 &instance->rx_channel : &instance->tx_channel; in usbatm_usb_probe()
1178 UDSL_ASSERT(instance, !usb_pipeisoc(channel->endpoint) || usb_pipein(channel->endpoint)); in usbatm_usb_probe()
1187 instance->urbs[i] = urb; in usbatm_usb_probe()
1197 usb_fill_bulk_urb(urb, instance->usb_dev, channel->endpoint, in usbatm_usb_probe()
1218 instance->cached_vpi = ATM_VPI_UNSPEC; in usbatm_usb_probe()
1219 instance->cached_vci = ATM_VCI_UNSPEC; in usbatm_usb_probe()
1220 instance->cell_buf = kmalloc(instance->rx_channel.stride, GFP_KERNEL); in usbatm_usb_probe()
1222 if (!instance->cell_buf) { in usbatm_usb_probe()
1228 if (!(instance->flags & UDSL_SKIP_HEAVY_INIT) && driver->heavy_init) { in usbatm_usb_probe()
1229 error = usbatm_heavy_init(instance); in usbatm_usb_probe()
1231 complete(&instance->thread_exited); /* pretend that heavy_init was run */ in usbatm_usb_probe()
1232 error = usbatm_atm_init(instance); in usbatm_usb_probe()
1239 usb_set_intfdata(intf, instance); in usbatm_usb_probe()
1244 if (instance->driver->unbind) in usbatm_usb_probe()
1245 instance->driver->unbind(instance, intf); in usbatm_usb_probe()
1247 kfree(instance->cell_buf); in usbatm_usb_probe()
1250 if (instance->urbs[i]) in usbatm_usb_probe()
1251 kfree(instance->urbs[i]->transfer_buffer); in usbatm_usb_probe()
1252 usb_free_urb(instance->urbs[i]); in usbatm_usb_probe()
1255 kfree(instance); in usbatm_usb_probe()
1264 struct usbatm_data *instance = usb_get_intfdata(intf); in usbatm_usb_disconnect() local
1270 if (!instance) { in usbatm_usb_disconnect()
1271 dev_dbg(dev, "%s: NULL instance!\n", __func__); in usbatm_usb_disconnect()
1277 mutex_lock(&instance->serialize); in usbatm_usb_disconnect()
1278 instance->disconnected = 1; in usbatm_usb_disconnect()
1279 if (instance->thread != NULL) in usbatm_usb_disconnect()
1280 send_sig(SIGTERM, instance->thread, 1); in usbatm_usb_disconnect()
1281 mutex_unlock(&instance->serialize); in usbatm_usb_disconnect()
1283 wait_for_completion(&instance->thread_exited); in usbatm_usb_disconnect()
1285 mutex_lock(&instance->serialize); in usbatm_usb_disconnect()
1286 list_for_each_entry(vcc_data, &instance->vcc_list, list) in usbatm_usb_disconnect()
1288 mutex_unlock(&instance->serialize); in usbatm_usb_disconnect()
1290 tasklet_disable(&instance->rx_channel.tasklet); in usbatm_usb_disconnect()
1291 tasklet_disable(&instance->tx_channel.tasklet); in usbatm_usb_disconnect()
1294 usb_kill_urb(instance->urbs[i]); in usbatm_usb_disconnect()
1296 del_timer_sync(&instance->rx_channel.delay); in usbatm_usb_disconnect()
1297 del_timer_sync(&instance->tx_channel.delay); in usbatm_usb_disconnect()
1301 INIT_LIST_HEAD(&instance->rx_channel.list); in usbatm_usb_disconnect()
1302 INIT_LIST_HEAD(&instance->tx_channel.list); in usbatm_usb_disconnect()
1304 tasklet_enable(&instance->rx_channel.tasklet); in usbatm_usb_disconnect()
1305 tasklet_enable(&instance->tx_channel.tasklet); in usbatm_usb_disconnect()
1307 if (instance->atm_dev && instance->driver->atm_stop) in usbatm_usb_disconnect()
1308 instance->driver->atm_stop(instance, instance->atm_dev); in usbatm_usb_disconnect()
1310 if (instance->driver->unbind) in usbatm_usb_disconnect()
1311 instance->driver->unbind(instance, intf); in usbatm_usb_disconnect()
1313 instance->driver_data = NULL; in usbatm_usb_disconnect()
1316 kfree(instance->urbs[i]->transfer_buffer); in usbatm_usb_disconnect()
1317 usb_free_urb(instance->urbs[i]); in usbatm_usb_disconnect()
1320 kfree(instance->cell_buf); in usbatm_usb_disconnect()
1323 if (instance->atm_dev) { in usbatm_usb_disconnect()
1324 atm_dev_deregister(instance->atm_dev); in usbatm_usb_disconnect()
1325 instance->atm_dev = NULL; in usbatm_usb_disconnect()
1328 usbatm_put_instance(instance); /* taken in usbatm_usb_probe */ in usbatm_usb_disconnect()