Lines Matching +full:slave +full:- +full:dev
1 // SPDX-License-Identifier: GPL-2.0-or-later
21 * sent back to Linux for re-transmission
65 static int dlci_header(struct sk_buff *skb, struct net_device *dev, in dlci_header() argument
101 static void dlci_receive(struct sk_buff *skb, struct net_device *dev) in dlci_receive() argument
107 netdev_notice(dev, "invalid data no header\n"); in dlci_receive()
108 dev->stats.rx_errors++; in dlci_receive()
113 hdr = (struct frhdr *) skb->data; in dlci_receive()
116 skb->dev = dev; in dlci_receive()
118 if (hdr->control != FRAD_I_UI) in dlci_receive()
120 netdev_notice(dev, "Invalid header flag 0x%02X\n", in dlci_receive()
121 hdr->control); in dlci_receive()
122 dev->stats.rx_errors++; in dlci_receive()
125 switch (hdr->IP_NLPID) in dlci_receive()
128 if (hdr->NLPID != FRAD_P_SNAP) in dlci_receive()
130 netdev_notice(dev, "Unsupported NLPID 0x%02X\n", in dlci_receive()
131 hdr->NLPID); in dlci_receive()
132 dev->stats.rx_errors++; in dlci_receive()
136 if (hdr->OUI[0] + hdr->OUI[1] + hdr->OUI[2] != 0) in dlci_receive()
138 netdev_notice(dev, "Unsupported organizationally unique identifier 0x%02X-%02X-%02X\n", in dlci_receive()
139 hdr->OUI[0], in dlci_receive()
140 hdr->OUI[1], in dlci_receive()
141 hdr->OUI[2]); in dlci_receive()
142 dev->stats.rx_errors++; in dlci_receive()
149 skb->protocol = hdr->PID; in dlci_receive()
154 header = sizeof(hdr->control) + sizeof(hdr->IP_NLPID); in dlci_receive()
155 skb->protocol = htons(ETH_P_IP); in dlci_receive()
162 netdev_notice(dev, "Unsupported NLPID 0x%02X\n", in dlci_receive()
163 hdr->pad); in dlci_receive()
164 dev->stats.rx_errors++; in dlci_receive()
168 netdev_notice(dev, "Invalid pad byte 0x%02X\n", in dlci_receive()
169 hdr->pad); in dlci_receive()
170 dev->stats.rx_errors++; in dlci_receive()
179 dev->stats.rx_bytes += skb->len; in dlci_receive()
181 dev->stats.rx_packets++; in dlci_receive()
187 static netdev_tx_t dlci_transmit(struct sk_buff *skb, struct net_device *dev) in dlci_transmit() argument
189 struct dlci_local *dlp = netdev_priv(dev); in dlci_transmit()
192 struct netdev_queue *txq = skb_get_tx_queue(dev, skb); in dlci_transmit()
193 netdev_start_xmit(skb, dlp->slave, txq, false); in dlci_transmit()
198 static int dlci_config(struct net_device *dev, struct dlci_conf __user *conf, int get) in dlci_config() argument
205 dlp = netdev_priv(dev); in dlci_config()
207 flp = netdev_priv(dlp->slave); in dlci_config()
212 return -EFAULT; in dlci_config()
214 return -EINVAL; in dlci_config()
215 memcpy(&dlp->config, &config, sizeof(struct dlci_conf)); in dlci_config()
216 dlp->configured = 1; in dlci_config()
219 err = (*flp->dlci_conf)(dlp->slave, dev, get); in dlci_config()
225 if (copy_to_user(conf, &dlp->config, sizeof(struct dlci_conf))) in dlci_config()
226 return -EFAULT; in dlci_config()
232 static int dlci_dev_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) in dlci_dev_ioctl() argument
237 return -EPERM; in dlci_dev_ioctl()
239 dlp = netdev_priv(dev); in dlci_dev_ioctl()
244 if (!*(short *)(dev->dev_addr)) in dlci_dev_ioctl()
245 return -EINVAL; in dlci_dev_ioctl()
247 strncpy(ifr->ifr_slave, dlp->slave->name, sizeof(ifr->ifr_slave)); in dlci_dev_ioctl()
252 if (!*(short *)(dev->dev_addr)) in dlci_dev_ioctl()
253 return -EINVAL; in dlci_dev_ioctl()
255 return dlci_config(dev, ifr->ifr_data, cmd == DLCI_GET_CONF); in dlci_dev_ioctl()
258 return -EOPNOTSUPP; in dlci_dev_ioctl()
263 static int dlci_change_mtu(struct net_device *dev, int new_mtu) in dlci_change_mtu() argument
265 struct dlci_local *dlp = netdev_priv(dev); in dlci_change_mtu()
267 return dev_set_mtu(dlp->slave, new_mtu); in dlci_change_mtu()
270 static int dlci_open(struct net_device *dev) in dlci_open() argument
276 dlp = netdev_priv(dev); in dlci_open()
278 if (!*(short *)(dev->dev_addr)) in dlci_open()
279 return -EINVAL; in dlci_open()
281 if (!netif_running(dlp->slave)) in dlci_open()
282 return -ENOTCONN; in dlci_open()
284 flp = netdev_priv(dlp->slave); in dlci_open()
285 err = (*flp->activate)(dlp->slave, dev); in dlci_open()
289 netif_start_queue(dev); in dlci_open()
294 static int dlci_close(struct net_device *dev) in dlci_close() argument
299 netif_stop_queue(dev); in dlci_close()
301 dlp = netdev_priv(dev); in dlci_close()
303 flp = netdev_priv(dlp->slave); in dlci_close()
304 (*flp->deactivate)(dlp->slave, dev); in dlci_close()
311 struct net_device *master, *slave; in dlci_add() local
314 int err = -EINVAL; in dlci_add()
317 /* validate slave device */ in dlci_add()
318 slave = dev_get_by_name(&init_net, dlci->devname); in dlci_add()
319 if (!slave) in dlci_add()
320 return -ENODEV; in dlci_add()
322 if (slave->type != ARPHRD_FRAD || netdev_priv(slave) == NULL) in dlci_add()
329 err = -ENOMEM; in dlci_add()
333 /* make sure same slave not already registered */ in dlci_add()
336 if (dlp->slave == slave) { in dlci_add()
337 err = -EBUSY; in dlci_add()
342 *(short *)(master->dev_addr) = dlci->dlci; in dlci_add()
345 dlp->slave = slave; in dlci_add()
346 dlp->master = master; in dlci_add()
348 flp = netdev_priv(slave); in dlci_add()
349 err = (*flp->assoc)(slave, master); in dlci_add()
357 strcpy(dlci->devname, master->name); in dlci_add()
359 list_add(&dlp->list, &dlci_devs); in dlci_add()
368 dev_put(slave); in dlci_add()
376 struct net_device *master, *slave; in dlci_del() local
382 /* validate slave device */ in dlci_del()
383 master = __dev_get_by_name(&init_net, dlci->devname); in dlci_del()
385 err = -ENODEV; in dlci_del()
390 if (dlp->master == master) { in dlci_del()
396 err = -ENODEV; in dlci_del()
401 err = -EBUSY; in dlci_del()
406 slave = dlp->slave; in dlci_del()
407 flp = netdev_priv(slave); in dlci_del()
409 err = (*flp->deassoc)(slave, master); in dlci_del()
411 list_del(&dlp->list); in dlci_del()
415 dev_put(slave); in dlci_del()
428 return -EPERM; in dlci_ioctl()
431 return -EFAULT; in dlci_ioctl()
440 return -EFAULT; in dlci_ioctl()
448 err = -EINVAL; in dlci_ioctl()
466 static void dlci_setup(struct net_device *dev) in dlci_setup() argument
468 struct dlci_local *dlp = netdev_priv(dev); in dlci_setup()
470 dev->flags = 0; in dlci_setup()
471 dev->header_ops = &dlci_header_ops; in dlci_setup()
472 dev->netdev_ops = &dlci_netdev_ops; in dlci_setup()
473 dev->needs_free_netdev = true; in dlci_setup()
475 dlp->receive = dlci_receive; in dlci_setup()
477 dev->type = ARPHRD_DLCI; in dlci_setup()
478 dev->hard_header_len = sizeof(struct frhdr); in dlci_setup()
479 dev->addr_len = sizeof(short); in dlci_setup()
483 /* if slave is unregistering, then cleanup master */
487 struct net_device *dev = netdev_notifier_info_to_dev(ptr); in dlci_dev_event() local
489 if (dev_net(dev) != &init_net) in dlci_dev_event()
496 if (dlp->slave == dev) { in dlci_dev_event()
497 list_del(&dlp->list); in dlci_dev_event()
498 unregister_netdevice(dlp->master); in dlci_dev_event()
499 dev_put(dlp->slave); in dlci_dev_event()
530 unregister_netdevice(dlp->master); in dlci_exit()
531 dev_put(dlp->slave); in dlci_exit()