Lines Matching refs:caifd
94 struct caif_device_entry *caifd; in caif_device_alloc() local
96 caifd = kzalloc(sizeof(*caifd), GFP_KERNEL); in caif_device_alloc()
97 if (!caifd) in caif_device_alloc()
99 caifd->pcpu_refcnt = alloc_percpu(int); in caif_device_alloc()
100 if (!caifd->pcpu_refcnt) { in caif_device_alloc()
101 kfree(caifd); in caif_device_alloc()
104 caifd->netdev = dev; in caif_device_alloc()
106 return caifd; in caif_device_alloc()
113 struct caif_device_entry *caifd; in caif_get() local
115 list_for_each_entry_rcu(caifd, &caifdevs->list, list) { in caif_get()
116 if (caifd->netdev == dev) in caif_get()
117 return caifd; in caif_get()
124 struct caif_device_entry *caifd; in caif_flow_cb() local
131 caifd = caif_get(skb->dev); in caif_flow_cb()
133 WARN_ON(caifd == NULL); in caif_flow_cb()
134 if (!caifd) { in caif_flow_cb()
139 caifd_hold(caifd); in caif_flow_cb()
142 spin_lock_bh(&caifd->flow_lock); in caif_flow_cb()
143 send_xoff = caifd->xoff; in caif_flow_cb()
144 caifd->xoff = 0; in caif_flow_cb()
145 dtor = caifd->xoff_skb_dtor; in caif_flow_cb()
147 if (WARN_ON(caifd->xoff_skb != skb)) in caif_flow_cb()
150 caifd->xoff_skb = NULL; in caif_flow_cb()
151 caifd->xoff_skb_dtor = NULL; in caif_flow_cb()
153 spin_unlock_bh(&caifd->flow_lock); in caif_flow_cb()
159 caifd->layer.up-> in caif_flow_cb()
160 ctrlcmd(caifd->layer.up, in caif_flow_cb()
162 caifd->layer.id); in caif_flow_cb()
163 caifd_put(caifd); in caif_flow_cb()
169 struct caif_device_entry *caifd = in transmit() local
177 skb->dev = caifd->netdev; in transmit()
182 if (likely(caifd->netdev->priv_flags & IFF_NO_QUEUE)) in transmit()
185 if (unlikely(caifd->xoff)) in transmit()
188 if (likely(!netif_queue_stopped(caifd->netdev))) { in transmit()
196 high = (caifd->netdev->tx_queue_len * q_high) / 100; in transmit()
202 spin_lock_bh(&caifd->flow_lock); in transmit()
203 if (caifd->xoff) { in transmit()
204 spin_unlock_bh(&caifd->flow_lock); in transmit()
216 netif_queue_stopped(caifd->netdev), in transmit()
218 caifd->xoff = 1; in transmit()
219 caifd->xoff_skb = skb; in transmit()
220 caifd->xoff_skb_dtor = skb->destructor; in transmit()
222 spin_unlock_bh(&caifd->flow_lock); in transmit()
224 caifd->layer.up->ctrlcmd(caifd->layer.up, in transmit()
226 caifd->layer.id); in transmit()
245 struct caif_device_entry *caifd; in receive() local
251 caifd = caif_get(dev); in receive()
253 if (!caifd || !caifd->layer.up || !caifd->layer.up->receive || in receive()
254 !netif_oper_up(caifd->netdev)) { in receive()
261 caifd_hold(caifd); in receive()
264 err = caifd->layer.up->receive(caifd->layer.up, pkt); in receive()
271 caifd_put(caifd); in receive()
285 struct caif_device_entry *caifd; in dev_flowctrl() local
289 caifd = caif_get(dev); in dev_flowctrl()
290 if (!caifd || !caifd->layer.up || !caifd->layer.up->ctrlcmd) { in dev_flowctrl()
295 caifd_hold(caifd); in dev_flowctrl()
298 caifd->layer.up->ctrlcmd(caifd->layer.up, in dev_flowctrl()
302 caifd->layer.id); in dev_flowctrl()
303 caifd_put(caifd); in dev_flowctrl()
313 struct caif_device_entry *caifd; in caif_enroll_dev() local
319 caifd = caif_device_alloc(dev); in caif_enroll_dev()
320 if (!caifd) in caif_enroll_dev()
322 *layer = &caifd->layer; in caif_enroll_dev()
323 spin_lock_init(&caifd->flow_lock); in caif_enroll_dev()
337 list_add_rcu(&caifd->list, &caifdevs->list); in caif_enroll_dev()
339 strlcpy(caifd->layer.name, dev->name, in caif_enroll_dev()
340 sizeof(caifd->layer.name)); in caif_enroll_dev()
341 caifd->layer.transmit = transmit; in caif_enroll_dev()
344 &caifd->layer, in caif_enroll_dev()
360 struct caif_device_entry *caifd = NULL; in caif_device_notify() local
370 caifd = caif_get(dev); in caif_device_notify()
371 if (caifd == NULL && dev->type != ARPHRD_CAIF) in caif_device_notify()
376 if (caifd != NULL) in caif_device_notify()
399 caifd = caif_get(dev); in caif_device_notify()
400 if (caifd == NULL) { in caif_device_notify()
405 caifd->xoff = 0; in caif_device_notify()
406 cfcnfg_set_phy_state(cfg, &caifd->layer, true); in caif_device_notify()
414 caifd = caif_get(dev); in caif_device_notify()
415 if (!caifd || !caifd->layer.up || !caifd->layer.up->ctrlcmd) { in caif_device_notify()
420 cfcnfg_set_phy_state(cfg, &caifd->layer, false); in caif_device_notify()
421 caifd_hold(caifd); in caif_device_notify()
424 caifd->layer.up->ctrlcmd(caifd->layer.up, in caif_device_notify()
426 caifd->layer.id); in caif_device_notify()
428 spin_lock_bh(&caifd->flow_lock); in caif_device_notify()
437 if (caifd->xoff_skb_dtor != NULL && caifd->xoff_skb != NULL) in caif_device_notify()
438 caifd->xoff_skb->destructor = caifd->xoff_skb_dtor; in caif_device_notify()
440 caifd->xoff = 0; in caif_device_notify()
441 caifd->xoff_skb_dtor = NULL; in caif_device_notify()
442 caifd->xoff_skb = NULL; in caif_device_notify()
444 spin_unlock_bh(&caifd->flow_lock); in caif_device_notify()
445 caifd_put(caifd); in caif_device_notify()
451 caifd = caif_get(dev); in caif_device_notify()
452 if (caifd == NULL) { in caif_device_notify()
456 list_del_rcu(&caifd->list); in caif_device_notify()
470 if (caifd_refcnt_read(caifd) != 0 || in caif_device_notify()
471 cfcnfg_del_phy_layer(cfg, &caifd->layer) != 0) { in caif_device_notify()
475 list_add_rcu(&caifd->list, &caifdevs->list); in caif_device_notify()
481 dev_put(caifd->netdev); in caif_device_notify()
482 free_percpu(caifd->pcpu_refcnt); in caif_device_notify()
483 kfree(caifd); in caif_device_notify()
512 struct caif_device_entry *caifd, *tmp; in caif_exit_net() local
520 list_for_each_entry_safe(caifd, tmp, &caifdevs->list, list) { in caif_exit_net()
522 list_del_rcu(&caifd->list); in caif_exit_net()
523 cfcnfg_set_phy_state(cfg, &caifd->layer, false); in caif_exit_net()
526 (caifd_refcnt_read(caifd) != 0 || in caif_exit_net()
527 cfcnfg_del_phy_layer(cfg, &caifd->layer) != 0)) { in caif_exit_net()
534 dev_put(caifd->netdev); in caif_exit_net()
535 free_percpu(caifd->pcpu_refcnt); in caif_exit_net()
536 kfree(caifd); in caif_exit_net()