1709 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/*3 * IPv4 over IEEE 1394, per RFC 27344 * IPv6 over IEEE 1394, per RFC 31465 *6 * Copyright (C) 2009 Jay Fenlason <fenlason@redhat.com>7 *8 * based on eth1394 by Ben Collins et al9 */10 11#include <linux/bug.h>12#include <linux/compiler.h>13#include <linux/delay.h>14#include <linux/device.h>15#include <linux/ethtool.h>16#include <linux/firewire.h>17#include <linux/firewire-constants.h>18#include <linux/highmem.h>19#include <linux/in.h>20#include <linux/ip.h>21#include <linux/jiffies.h>22#include <linux/mod_devicetable.h>23#include <linux/module.h>24#include <linux/moduleparam.h>25#include <linux/mutex.h>26#include <linux/netdevice.h>27#include <linux/skbuff.h>28#include <linux/slab.h>29#include <linux/spinlock.h>30 31#include <linux/unaligned.h>32#include <net/arp.h>33#include <net/firewire.h>34 35/* rx limits */36#define FWNET_MAX_FRAGMENTS 30 /* arbitrary, > TX queue depth */37#define FWNET_ISO_PAGE_COUNT (PAGE_SIZE < 16*1024 ? 4 : 2)38 39/* tx limits */40#define FWNET_MAX_QUEUED_DATAGRAMS 20 /* < 64 = number of tlabels */41#define FWNET_MIN_QUEUED_DATAGRAMS 10 /* should keep AT DMA busy enough */42#define FWNET_TX_QUEUE_LEN FWNET_MAX_QUEUED_DATAGRAMS /* ? */43 44#define IEEE1394_BROADCAST_CHANNEL 3145#define IEEE1394_ALL_NODES (0xffc0 | 0x003f)46#define IEEE1394_MAX_PAYLOAD_S100 51247#define FWNET_NO_FIFO_ADDR (~0ULL)48 49#define IANA_SPECIFIER_ID 0x00005eU50#define RFC2734_SW_VERSION 0x000001U51#define RFC3146_SW_VERSION 0x000002U52 53#define IEEE1394_GASP_HDR_SIZE 854 55#define RFC2374_UNFRAG_HDR_SIZE 456#define RFC2374_FRAG_HDR_SIZE 857#define RFC2374_FRAG_OVERHEAD 458 59#define RFC2374_HDR_UNFRAG 0 /* unfragmented */60#define RFC2374_HDR_FIRSTFRAG 1 /* first fragment */61#define RFC2374_HDR_LASTFRAG 2 /* last fragment */62#define RFC2374_HDR_INTFRAG 3 /* interior fragment */63 64static bool fwnet_hwaddr_is_multicast(u8 *ha)65{66 return !!(*ha & 1);67}68 69/* IPv4 and IPv6 encapsulation header */70struct rfc2734_header {71 u32 w0;72 u32 w1;73};74 75#define fwnet_get_hdr_lf(h) (((h)->w0 & 0xc0000000) >> 30)76#define fwnet_get_hdr_ether_type(h) (((h)->w0 & 0x0000ffff))77#define fwnet_get_hdr_dg_size(h) ((((h)->w0 & 0x0fff0000) >> 16) + 1)78#define fwnet_get_hdr_fg_off(h) (((h)->w0 & 0x00000fff))79#define fwnet_get_hdr_dgl(h) (((h)->w1 & 0xffff0000) >> 16)80 81#define fwnet_set_hdr_lf(lf) ((lf) << 30)82#define fwnet_set_hdr_ether_type(et) (et)83#define fwnet_set_hdr_dg_size(dgs) (((dgs) - 1) << 16)84#define fwnet_set_hdr_fg_off(fgo) (fgo)85 86#define fwnet_set_hdr_dgl(dgl) ((dgl) << 16)87 88static inline void fwnet_make_uf_hdr(struct rfc2734_header *hdr,89 unsigned ether_type)90{91 hdr->w0 = fwnet_set_hdr_lf(RFC2374_HDR_UNFRAG)92 | fwnet_set_hdr_ether_type(ether_type);93}94 95static inline void fwnet_make_ff_hdr(struct rfc2734_header *hdr,96 unsigned ether_type, unsigned dg_size, unsigned dgl)97{98 hdr->w0 = fwnet_set_hdr_lf(RFC2374_HDR_FIRSTFRAG)99 | fwnet_set_hdr_dg_size(dg_size)100 | fwnet_set_hdr_ether_type(ether_type);101 hdr->w1 = fwnet_set_hdr_dgl(dgl);102}103 104static inline void fwnet_make_sf_hdr(struct rfc2734_header *hdr,105 unsigned lf, unsigned dg_size, unsigned fg_off, unsigned dgl)106{107 hdr->w0 = fwnet_set_hdr_lf(lf)108 | fwnet_set_hdr_dg_size(dg_size)109 | fwnet_set_hdr_fg_off(fg_off);110 hdr->w1 = fwnet_set_hdr_dgl(dgl);111}112 113/* This list keeps track of what parts of the datagram have been filled in */114struct fwnet_fragment_info {115 struct list_head fi_link;116 u16 offset;117 u16 len;118};119 120struct fwnet_partial_datagram {121 struct list_head pd_link;122 struct list_head fi_list;123 struct sk_buff *skb;124 /* FIXME Why not use skb->data? */125 char *pbuf;126 u16 datagram_label;127 u16 ether_type;128 u16 datagram_size;129};130 131static DEFINE_MUTEX(fwnet_device_mutex);132static LIST_HEAD(fwnet_device_list);133 134struct fwnet_device {135 struct list_head dev_link;136 spinlock_t lock;137 enum {138 FWNET_BROADCAST_ERROR,139 FWNET_BROADCAST_RUNNING,140 FWNET_BROADCAST_STOPPED,141 } broadcast_state;142 struct fw_iso_context *broadcast_rcv_context;143 struct fw_iso_buffer broadcast_rcv_buffer;144 void **broadcast_rcv_buffer_ptrs;145 unsigned broadcast_rcv_next_ptr;146 unsigned num_broadcast_rcv_ptrs;147 unsigned rcv_buffer_size;148 /*149 * This value is the maximum unfragmented datagram size that can be150 * sent by the hardware. It already has the GASP overhead and the151 * unfragmented datagram header overhead calculated into it.152 */153 unsigned broadcast_xmt_max_payload;154 u16 broadcast_xmt_datagramlabel;155 156 /*157 * The CSR address that remote nodes must send datagrams to for us to158 * receive them.159 */160 struct fw_address_handler handler;161 u64 local_fifo;162 163 /* Number of tx datagrams that have been queued but not yet acked */164 int queued_datagrams;165 166 int peer_count;167 struct list_head peer_list;168 struct fw_card *card;169 struct net_device *netdev;170};171 172struct fwnet_peer {173 struct list_head peer_link;174 struct fwnet_device *dev;175 u64 guid;176 177 /* guarded by dev->lock */178 struct list_head pd_list; /* received partial datagrams */179 unsigned pdg_size; /* pd_list size */180 181 u16 datagram_label; /* outgoing datagram label */182 u16 max_payload; /* includes RFC2374_FRAG_HDR_SIZE overhead */183 int node_id;184 int generation;185 unsigned speed;186};187 188/* This is our task struct. It's used for the packet complete callback. */189struct fwnet_packet_task {190 struct fw_transaction transaction;191 struct rfc2734_header hdr;192 struct sk_buff *skb;193 struct fwnet_device *dev;194 195 int outstanding_pkts;196 u64 fifo_addr;197 u16 dest_node;198 u16 max_payload;199 u8 generation;200 u8 speed;201 u8 enqueued;202};203 204/*205 * saddr == NULL means use device source address.206 * daddr == NULL means leave destination address (eg unresolved arp).207 */208static int fwnet_header_create(struct sk_buff *skb, struct net_device *net,209 unsigned short type, const void *daddr,210 const void *saddr, unsigned len)211{212 struct fwnet_header *h;213 214 h = skb_push(skb, sizeof(*h));215 put_unaligned_be16(type, &h->h_proto);216 217 if (net->flags & (IFF_LOOPBACK | IFF_NOARP)) {218 memset(h->h_dest, 0, net->addr_len);219 220 return net->hard_header_len;221 }222 223 if (daddr) {224 memcpy(h->h_dest, daddr, net->addr_len);225 226 return net->hard_header_len;227 }228 229 return -net->hard_header_len;230}231 232static int fwnet_header_cache(const struct neighbour *neigh,233 struct hh_cache *hh, __be16 type)234{235 struct net_device *net;236 struct fwnet_header *h;237 238 if (type == cpu_to_be16(ETH_P_802_3))239 return -1;240 net = neigh->dev;241 h = (struct fwnet_header *)((u8 *)hh->hh_data + HH_DATA_OFF(sizeof(*h)));242 h->h_proto = type;243 memcpy(h->h_dest, neigh->ha, net->addr_len);244 245 /* Pairs with the READ_ONCE() in neigh_resolve_output(),246 * neigh_hh_output() and neigh_update_hhs().247 */248 smp_store_release(&hh->hh_len, FWNET_HLEN);249 250 return 0;251}252 253/* Called by Address Resolution module to notify changes in address. */254static void fwnet_header_cache_update(struct hh_cache *hh,255 const struct net_device *net, const unsigned char *haddr)256{257 memcpy((u8 *)hh->hh_data + HH_DATA_OFF(FWNET_HLEN), haddr, net->addr_len);258}259 260static int fwnet_header_parse(const struct sk_buff *skb, unsigned char *haddr)261{262 memcpy(haddr, skb->dev->dev_addr, FWNET_ALEN);263 264 return FWNET_ALEN;265}266 267static const struct header_ops fwnet_header_ops = {268 .create = fwnet_header_create,269 .cache = fwnet_header_cache,270 .cache_update = fwnet_header_cache_update,271 .parse = fwnet_header_parse,272};273 274/* FIXME: is this correct for all cases? */275static bool fwnet_frag_overlap(struct fwnet_partial_datagram *pd,276 unsigned offset, unsigned len)277{278 struct fwnet_fragment_info *fi;279 unsigned end = offset + len;280 281 list_for_each_entry(fi, &pd->fi_list, fi_link)282 if (offset < fi->offset + fi->len && end > fi->offset)283 return true;284 285 return false;286}287 288/* Assumes that new fragment does not overlap any existing fragments */289static struct fwnet_fragment_info *fwnet_frag_new(290 struct fwnet_partial_datagram *pd, unsigned offset, unsigned len)291{292 struct fwnet_fragment_info *fi, *fi2, *new;293 struct list_head *list;294 295 list = &pd->fi_list;296 list_for_each_entry(fi, &pd->fi_list, fi_link) {297 if (fi->offset + fi->len == offset) {298 /* The new fragment can be tacked on to the end */299 /* Did the new fragment plug a hole? */300 fi2 = list_entry(fi->fi_link.next,301 struct fwnet_fragment_info, fi_link);302 if (fi->offset + fi->len == fi2->offset) {303 /* glue fragments together */304 fi->len += len + fi2->len;305 list_del(&fi2->fi_link);306 kfree(fi2);307 } else {308 fi->len += len;309 }310 311 return fi;312 }313 if (offset + len == fi->offset) {314 /* The new fragment can be tacked on to the beginning */315 /* Did the new fragment plug a hole? */316 fi2 = list_entry(fi->fi_link.prev,317 struct fwnet_fragment_info, fi_link);318 if (fi2->offset + fi2->len == fi->offset) {319 /* glue fragments together */320 fi2->len += fi->len + len;321 list_del(&fi->fi_link);322 kfree(fi);323 324 return fi2;325 }326 fi->offset = offset;327 fi->len += len;328 329 return fi;330 }331 if (offset > fi->offset + fi->len) {332 list = &fi->fi_link;333 break;334 }335 if (offset + len < fi->offset) {336 list = fi->fi_link.prev;337 break;338 }339 }340 341 new = kmalloc(sizeof(*new), GFP_ATOMIC);342 if (!new)343 return NULL;344 345 new->offset = offset;346 new->len = len;347 list_add(&new->fi_link, list);348 349 return new;350}351 352static struct fwnet_partial_datagram *fwnet_pd_new(struct net_device *net,353 struct fwnet_peer *peer, u16 datagram_label, unsigned dg_size,354 void *frag_buf, unsigned frag_off, unsigned frag_len)355{356 struct fwnet_partial_datagram *new;357 struct fwnet_fragment_info *fi;358 359 new = kmalloc(sizeof(*new), GFP_ATOMIC);360 if (!new)361 goto fail;362 363 INIT_LIST_HEAD(&new->fi_list);364 fi = fwnet_frag_new(new, frag_off, frag_len);365 if (fi == NULL)366 goto fail_w_new;367 368 new->datagram_label = datagram_label;369 new->datagram_size = dg_size;370 new->skb = dev_alloc_skb(dg_size + LL_RESERVED_SPACE(net));371 if (new->skb == NULL)372 goto fail_w_fi;373 374 skb_reserve(new->skb, LL_RESERVED_SPACE(net));375 new->pbuf = skb_put(new->skb, dg_size);376 memcpy(new->pbuf + frag_off, frag_buf, frag_len);377 list_add_tail(&new->pd_link, &peer->pd_list);378 379 return new;380 381fail_w_fi:382 kfree(fi);383fail_w_new:384 kfree(new);385fail:386 return NULL;387}388 389static struct fwnet_partial_datagram *fwnet_pd_find(struct fwnet_peer *peer,390 u16 datagram_label)391{392 struct fwnet_partial_datagram *pd;393 394 list_for_each_entry(pd, &peer->pd_list, pd_link)395 if (pd->datagram_label == datagram_label)396 return pd;397 398 return NULL;399}400 401 402static void fwnet_pd_delete(struct fwnet_partial_datagram *old)403{404 struct fwnet_fragment_info *fi, *n;405 406 list_for_each_entry_safe(fi, n, &old->fi_list, fi_link)407 kfree(fi);408 409 list_del(&old->pd_link);410 dev_kfree_skb_any(old->skb);411 kfree(old);412}413 414static bool fwnet_pd_update(struct fwnet_peer *peer,415 struct fwnet_partial_datagram *pd, void *frag_buf,416 unsigned frag_off, unsigned frag_len)417{418 if (fwnet_frag_new(pd, frag_off, frag_len) == NULL)419 return false;420 421 memcpy(pd->pbuf + frag_off, frag_buf, frag_len);422 423 /*424 * Move list entry to beginning of list so that oldest partial425 * datagrams percolate to the end of the list426 */427 list_move_tail(&pd->pd_link, &peer->pd_list);428 429 return true;430}431 432static bool fwnet_pd_is_complete(struct fwnet_partial_datagram *pd)433{434 struct fwnet_fragment_info *fi;435 436 fi = list_entry(pd->fi_list.next, struct fwnet_fragment_info, fi_link);437 438 return fi->len == pd->datagram_size;439}440 441/* caller must hold dev->lock */442static struct fwnet_peer *fwnet_peer_find_by_guid(struct fwnet_device *dev,443 u64 guid)444{445 struct fwnet_peer *peer;446 447 list_for_each_entry(peer, &dev->peer_list, peer_link)448 if (peer->guid == guid)449 return peer;450 451 return NULL;452}453 454/* caller must hold dev->lock */455static struct fwnet_peer *fwnet_peer_find_by_node_id(struct fwnet_device *dev,456 int node_id, int generation)457{458 struct fwnet_peer *peer;459 460 list_for_each_entry(peer, &dev->peer_list, peer_link)461 if (peer->node_id == node_id &&462 peer->generation == generation)463 return peer;464 465 return NULL;466}467 468/* See IEEE 1394-2008 table 6-4, table 8-8, table 16-18. */469static unsigned fwnet_max_payload(unsigned max_rec, unsigned speed)470{471 max_rec = min(max_rec, speed + 8);472 max_rec = clamp(max_rec, 8U, 11U); /* 512...4096 */473 474 return (1 << (max_rec + 1)) - RFC2374_FRAG_HDR_SIZE;475}476 477 478static int fwnet_finish_incoming_packet(struct net_device *net,479 struct sk_buff *skb, u16 source_node_id,480 bool is_broadcast, u16 ether_type)481{482 int status, len;483 484 switch (ether_type) {485 case ETH_P_ARP:486 case ETH_P_IP:487#if IS_ENABLED(CONFIG_IPV6)488 case ETH_P_IPV6:489#endif490 break;491 default:492 goto err;493 }494 495 /* Write metadata, and then pass to the receive level */496 skb->dev = net;497 skb->ip_summed = CHECKSUM_NONE;498 499 /*500 * Parse the encapsulation header. This actually does the job of501 * converting to an ethernet-like pseudo frame header.502 */503 if (dev_hard_header(skb, net, ether_type,504 is_broadcast ? net->broadcast : net->dev_addr,505 NULL, skb->len) >= 0) {506 struct fwnet_header *eth;507 u16 *rawp;508 __be16 protocol;509 510 skb_reset_mac_header(skb);511 skb_pull(skb, sizeof(*eth));512 eth = (struct fwnet_header *)skb_mac_header(skb);513 if (fwnet_hwaddr_is_multicast(eth->h_dest)) {514 if (memcmp(eth->h_dest, net->broadcast,515 net->addr_len) == 0)516 skb->pkt_type = PACKET_BROADCAST;517#if 0518 else519 skb->pkt_type = PACKET_MULTICAST;520#endif521 } else {522 if (memcmp(eth->h_dest, net->dev_addr, net->addr_len))523 skb->pkt_type = PACKET_OTHERHOST;524 }525 if (ntohs(eth->h_proto) >= ETH_P_802_3_MIN) {526 protocol = eth->h_proto;527 } else {528 rawp = (u16 *)skb->data;529 if (*rawp == 0xffff)530 protocol = htons(ETH_P_802_3);531 else532 protocol = htons(ETH_P_802_2);533 }534 skb->protocol = protocol;535 }536 537 len = skb->len;538 status = netif_rx(skb);539 if (status == NET_RX_DROP) {540 net->stats.rx_errors++;541 net->stats.rx_dropped++;542 } else {543 net->stats.rx_packets++;544 net->stats.rx_bytes += len;545 }546 547 return 0;548 549 err:550 net->stats.rx_errors++;551 net->stats.rx_dropped++;552 553 dev_kfree_skb_any(skb);554 555 return -ENOENT;556}557 558static int fwnet_incoming_packet(struct fwnet_device *dev, __be32 *buf, int len,559 int source_node_id, int generation,560 bool is_broadcast)561{562 struct sk_buff *skb;563 struct net_device *net = dev->netdev;564 struct rfc2734_header hdr;565 unsigned lf;566 unsigned long flags;567 struct fwnet_peer *peer;568 struct fwnet_partial_datagram *pd;569 int fg_off;570 int dg_size;571 u16 datagram_label;572 int retval;573 u16 ether_type;574 575 if (len <= RFC2374_UNFRAG_HDR_SIZE)576 return 0;577 578 hdr.w0 = be32_to_cpu(buf[0]);579 lf = fwnet_get_hdr_lf(&hdr);580 if (lf == RFC2374_HDR_UNFRAG) {581 /*582 * An unfragmented datagram has been received by the ieee1394583 * bus. Build an skbuff around it so we can pass it to the584 * high level network layer.585 */586 ether_type = fwnet_get_hdr_ether_type(&hdr);587 buf++;588 len -= RFC2374_UNFRAG_HDR_SIZE;589 590 skb = dev_alloc_skb(len + LL_RESERVED_SPACE(net));591 if (unlikely(!skb)) {592 net->stats.rx_dropped++;593 594 return -ENOMEM;595 }596 skb_reserve(skb, LL_RESERVED_SPACE(net));597 skb_put_data(skb, buf, len);598 599 return fwnet_finish_incoming_packet(net, skb, source_node_id,600 is_broadcast, ether_type);601 }602 603 /* A datagram fragment has been received, now the fun begins. */604 605 if (len <= RFC2374_FRAG_HDR_SIZE)606 return 0;607 608 hdr.w1 = ntohl(buf[1]);609 buf += 2;610 len -= RFC2374_FRAG_HDR_SIZE;611 if (lf == RFC2374_HDR_FIRSTFRAG) {612 ether_type = fwnet_get_hdr_ether_type(&hdr);613 fg_off = 0;614 } else {615 ether_type = 0;616 fg_off = fwnet_get_hdr_fg_off(&hdr);617 }618 datagram_label = fwnet_get_hdr_dgl(&hdr);619 dg_size = fwnet_get_hdr_dg_size(&hdr);620 621 if (fg_off + len > dg_size)622 return 0;623 624 spin_lock_irqsave(&dev->lock, flags);625 626 peer = fwnet_peer_find_by_node_id(dev, source_node_id, generation);627 if (!peer) {628 retval = -ENOENT;629 goto fail;630 }631 632 pd = fwnet_pd_find(peer, datagram_label);633 if (pd == NULL) {634 while (peer->pdg_size >= FWNET_MAX_FRAGMENTS) {635 /* remove the oldest */636 fwnet_pd_delete(list_first_entry(&peer->pd_list,637 struct fwnet_partial_datagram, pd_link));638 peer->pdg_size--;639 }640 pd = fwnet_pd_new(net, peer, datagram_label,641 dg_size, buf, fg_off, len);642 if (pd == NULL) {643 retval = -ENOMEM;644 goto fail;645 }646 peer->pdg_size++;647 } else {648 if (fwnet_frag_overlap(pd, fg_off, len) ||649 pd->datagram_size != dg_size) {650 /*651 * Differing datagram sizes or overlapping fragments,652 * discard old datagram and start a new one.653 */654 fwnet_pd_delete(pd);655 pd = fwnet_pd_new(net, peer, datagram_label,656 dg_size, buf, fg_off, len);657 if (pd == NULL) {658 peer->pdg_size--;659 retval = -ENOMEM;660 goto fail;661 }662 } else {663 if (!fwnet_pd_update(peer, pd, buf, fg_off, len)) {664 /*665 * Couldn't save off fragment anyway666 * so might as well obliterate the667 * datagram now.668 */669 fwnet_pd_delete(pd);670 peer->pdg_size--;671 retval = -ENOMEM;672 goto fail;673 }674 }675 } /* new datagram or add to existing one */676 677 if (lf == RFC2374_HDR_FIRSTFRAG)678 pd->ether_type = ether_type;679 680 if (fwnet_pd_is_complete(pd)) {681 ether_type = pd->ether_type;682 peer->pdg_size--;683 skb = skb_get(pd->skb);684 fwnet_pd_delete(pd);685 686 spin_unlock_irqrestore(&dev->lock, flags);687 688 return fwnet_finish_incoming_packet(net, skb, source_node_id,689 false, ether_type);690 }691 /*692 * Datagram is not complete, we're done for the693 * moment.694 */695 retval = 0;696 fail:697 spin_unlock_irqrestore(&dev->lock, flags);698 699 return retval;700}701 702static void fwnet_receive_packet(struct fw_card *card, struct fw_request *r,703 int tcode, int destination, int source, int generation,704 unsigned long long offset, void *payload, size_t length,705 void *callback_data)706{707 struct fwnet_device *dev = callback_data;708 int rcode;709 710 if (destination == IEEE1394_ALL_NODES) {711 // Although the response to the broadcast packet is not necessarily required, the712 // fw_send_response() function should still be called to maintain the reference713 // counting of the object. In the case, the call of function just releases the714 // object as a result to decrease the reference counting.715 rcode = RCODE_COMPLETE;716 } else if (offset != dev->handler.offset) {717 rcode = RCODE_ADDRESS_ERROR;718 } else if (tcode != TCODE_WRITE_BLOCK_REQUEST) {719 rcode = RCODE_TYPE_ERROR;720 } else if (fwnet_incoming_packet(dev, payload, length,721 source, generation, false) != 0) {722 dev_err(&dev->netdev->dev, "incoming packet failure\n");723 rcode = RCODE_CONFLICT_ERROR;724 } else {725 rcode = RCODE_COMPLETE;726 }727 728 fw_send_response(card, r, rcode);729}730 731static int gasp_source_id(__be32 *p)732{733 return be32_to_cpu(p[0]) >> 16;734}735 736static u32 gasp_specifier_id(__be32 *p)737{738 return (be32_to_cpu(p[0]) & 0xffff) << 8 |739 (be32_to_cpu(p[1]) & 0xff000000) >> 24;740}741 742static u32 gasp_version(__be32 *p)743{744 return be32_to_cpu(p[1]) & 0xffffff;745}746 747static void fwnet_receive_broadcast(struct fw_iso_context *context,748 u32 cycle, size_t header_length, void *header, void *data)749{750 struct fwnet_device *dev;751 struct fw_iso_packet packet;752 __be16 *hdr_ptr;753 __be32 *buf_ptr;754 int retval;755 u32 length;756 unsigned long offset;757 unsigned long flags;758 759 dev = data;760 hdr_ptr = header;761 length = be16_to_cpup(hdr_ptr);762 763 spin_lock_irqsave(&dev->lock, flags);764 765 offset = dev->rcv_buffer_size * dev->broadcast_rcv_next_ptr;766 buf_ptr = dev->broadcast_rcv_buffer_ptrs[dev->broadcast_rcv_next_ptr++];767 if (dev->broadcast_rcv_next_ptr == dev->num_broadcast_rcv_ptrs)768 dev->broadcast_rcv_next_ptr = 0;769 770 spin_unlock_irqrestore(&dev->lock, flags);771 772 if (length > IEEE1394_GASP_HDR_SIZE &&773 gasp_specifier_id(buf_ptr) == IANA_SPECIFIER_ID &&774 (gasp_version(buf_ptr) == RFC2734_SW_VERSION775#if IS_ENABLED(CONFIG_IPV6)776 || gasp_version(buf_ptr) == RFC3146_SW_VERSION777#endif778 ))779 fwnet_incoming_packet(dev, buf_ptr + 2,780 length - IEEE1394_GASP_HDR_SIZE,781 gasp_source_id(buf_ptr),782 context->card->generation, true);783 784 packet.payload_length = dev->rcv_buffer_size;785 packet.interrupt = 1;786 packet.skip = 0;787 packet.tag = 3;788 packet.sy = 0;789 packet.header_length = IEEE1394_GASP_HDR_SIZE;790 791 spin_lock_irqsave(&dev->lock, flags);792 793 retval = fw_iso_context_queue(dev->broadcast_rcv_context, &packet,794 &dev->broadcast_rcv_buffer, offset);795 796 spin_unlock_irqrestore(&dev->lock, flags);797 798 if (retval >= 0)799 fw_iso_context_queue_flush(dev->broadcast_rcv_context);800 else801 dev_err(&dev->netdev->dev, "requeue failed\n");802}803 804static struct kmem_cache *fwnet_packet_task_cache;805 806static void fwnet_free_ptask(struct fwnet_packet_task *ptask)807{808 dev_kfree_skb_any(ptask->skb);809 kmem_cache_free(fwnet_packet_task_cache, ptask);810}811 812/* Caller must hold dev->lock. */813static void dec_queued_datagrams(struct fwnet_device *dev)814{815 if (--dev->queued_datagrams == FWNET_MIN_QUEUED_DATAGRAMS)816 netif_wake_queue(dev->netdev);817}818 819static int fwnet_send_packet(struct fwnet_packet_task *ptask);820 821static void fwnet_transmit_packet_done(struct fwnet_packet_task *ptask)822{823 struct fwnet_device *dev = ptask->dev;824 struct sk_buff *skb = ptask->skb;825 unsigned long flags;826 bool free;827 828 spin_lock_irqsave(&dev->lock, flags);829 830 ptask->outstanding_pkts--;831 832 /* Check whether we or the networking TX soft-IRQ is last user. */833 free = (ptask->outstanding_pkts == 0 && ptask->enqueued);834 if (free)835 dec_queued_datagrams(dev);836 837 if (ptask->outstanding_pkts == 0) {838 dev->netdev->stats.tx_packets++;839 dev->netdev->stats.tx_bytes += skb->len;840 }841 842 spin_unlock_irqrestore(&dev->lock, flags);843 844 if (ptask->outstanding_pkts > 0) {845 u16 dg_size;846 u16 fg_off;847 u16 datagram_label;848 u16 lf;849 850 /* Update the ptask to point to the next fragment and send it */851 lf = fwnet_get_hdr_lf(&ptask->hdr);852 switch (lf) {853 case RFC2374_HDR_LASTFRAG:854 case RFC2374_HDR_UNFRAG:855 default:856 dev_err(&dev->netdev->dev,857 "outstanding packet %x lf %x, header %x,%x\n",858 ptask->outstanding_pkts, lf, ptask->hdr.w0,859 ptask->hdr.w1);860 BUG();861 862 case RFC2374_HDR_FIRSTFRAG:863 /* Set frag type here for future interior fragments */864 dg_size = fwnet_get_hdr_dg_size(&ptask->hdr);865 fg_off = ptask->max_payload - RFC2374_FRAG_HDR_SIZE;866 datagram_label = fwnet_get_hdr_dgl(&ptask->hdr);867 break;868 869 case RFC2374_HDR_INTFRAG:870 dg_size = fwnet_get_hdr_dg_size(&ptask->hdr);871 fg_off = fwnet_get_hdr_fg_off(&ptask->hdr)872 + ptask->max_payload - RFC2374_FRAG_HDR_SIZE;873 datagram_label = fwnet_get_hdr_dgl(&ptask->hdr);874 break;875 }876 877 if (ptask->dest_node == IEEE1394_ALL_NODES) {878 skb_pull(skb,879 ptask->max_payload + IEEE1394_GASP_HDR_SIZE);880 } else {881 skb_pull(skb, ptask->max_payload);882 }883 if (ptask->outstanding_pkts > 1) {884 fwnet_make_sf_hdr(&ptask->hdr, RFC2374_HDR_INTFRAG,885 dg_size, fg_off, datagram_label);886 } else {887 fwnet_make_sf_hdr(&ptask->hdr, RFC2374_HDR_LASTFRAG,888 dg_size, fg_off, datagram_label);889 ptask->max_payload = skb->len + RFC2374_FRAG_HDR_SIZE;890 }891 fwnet_send_packet(ptask);892 }893 894 if (free)895 fwnet_free_ptask(ptask);896}897 898static void fwnet_transmit_packet_failed(struct fwnet_packet_task *ptask)899{900 struct fwnet_device *dev = ptask->dev;901 unsigned long flags;902 bool free;903 904 spin_lock_irqsave(&dev->lock, flags);905 906 /* One fragment failed; don't try to send remaining fragments. */907 ptask->outstanding_pkts = 0;908 909 /* Check whether we or the networking TX soft-IRQ is last user. */910 free = ptask->enqueued;911 if (free)912 dec_queued_datagrams(dev);913 914 dev->netdev->stats.tx_dropped++;915 dev->netdev->stats.tx_errors++;916 917 spin_unlock_irqrestore(&dev->lock, flags);918 919 if (free)920 fwnet_free_ptask(ptask);921}922 923static void fwnet_write_complete(struct fw_card *card, int rcode,924 void *payload, size_t length, void *data)925{926 struct fwnet_packet_task *ptask = data;927 static unsigned long j;928 static int last_rcode, errors_skipped;929 930 if (rcode == RCODE_COMPLETE) {931 fwnet_transmit_packet_done(ptask);932 } else {933 if (printk_timed_ratelimit(&j, 1000) || rcode != last_rcode) {934 dev_err(&ptask->dev->netdev->dev,935 "fwnet_write_complete failed: %x (skipped %d)\n",936 rcode, errors_skipped);937 938 errors_skipped = 0;939 last_rcode = rcode;940 } else {941 errors_skipped++;942 }943 fwnet_transmit_packet_failed(ptask);944 }945}946 947static int fwnet_send_packet(struct fwnet_packet_task *ptask)948{949 struct fwnet_device *dev;950 unsigned tx_len;951 struct rfc2734_header *bufhdr;952 unsigned long flags;953 bool free;954 955 dev = ptask->dev;956 tx_len = ptask->max_payload;957 switch (fwnet_get_hdr_lf(&ptask->hdr)) {958 case RFC2374_HDR_UNFRAG:959 bufhdr = skb_push(ptask->skb, RFC2374_UNFRAG_HDR_SIZE);960 put_unaligned_be32(ptask->hdr.w0, &bufhdr->w0);961 break;962 963 case RFC2374_HDR_FIRSTFRAG:964 case RFC2374_HDR_INTFRAG:965 case RFC2374_HDR_LASTFRAG:966 bufhdr = skb_push(ptask->skb, RFC2374_FRAG_HDR_SIZE);967 put_unaligned_be32(ptask->hdr.w0, &bufhdr->w0);968 put_unaligned_be32(ptask->hdr.w1, &bufhdr->w1);969 break;970 971 default:972 BUG();973 }974 if (ptask->dest_node == IEEE1394_ALL_NODES) {975 u8 *p;976 int generation;977 int node_id;978 unsigned int sw_version;979 980 /* ptask->generation may not have been set yet */981 generation = dev->card->generation;982 smp_rmb();983 node_id = dev->card->node_id;984 985 switch (ptask->skb->protocol) {986 default:987 sw_version = RFC2734_SW_VERSION;988 break;989#if IS_ENABLED(CONFIG_IPV6)990 case htons(ETH_P_IPV6):991 sw_version = RFC3146_SW_VERSION;992#endif993 }994 995 p = skb_push(ptask->skb, IEEE1394_GASP_HDR_SIZE);996 put_unaligned_be32(node_id << 16 | IANA_SPECIFIER_ID >> 8, p);997 put_unaligned_be32((IANA_SPECIFIER_ID & 0xff) << 24998 | sw_version, &p[4]);999 1000 /* We should not transmit if broadcast_channel.valid == 0. */1001 fw_send_request(dev->card, &ptask->transaction,1002 TCODE_STREAM_DATA,1003 fw_stream_packet_destination_id(3,1004 IEEE1394_BROADCAST_CHANNEL, 0),1005 generation, SCODE_100, 0ULL, ptask->skb->data,1006 tx_len + 8, fwnet_write_complete, ptask);1007 1008 spin_lock_irqsave(&dev->lock, flags);1009 1010 /* If the AT tasklet already ran, we may be last user. */1011 free = (ptask->outstanding_pkts == 0 && !ptask->enqueued);1012 if (!free)1013 ptask->enqueued = true;1014 else1015 dec_queued_datagrams(dev);1016 1017 spin_unlock_irqrestore(&dev->lock, flags);1018 1019 goto out;1020 }1021 1022 fw_send_request(dev->card, &ptask->transaction,1023 TCODE_WRITE_BLOCK_REQUEST, ptask->dest_node,1024 ptask->generation, ptask->speed, ptask->fifo_addr,1025 ptask->skb->data, tx_len, fwnet_write_complete, ptask);1026 1027 spin_lock_irqsave(&dev->lock, flags);1028 1029 /* If the AT tasklet already ran, we may be last user. */1030 free = (ptask->outstanding_pkts == 0 && !ptask->enqueued);1031 if (!free)1032 ptask->enqueued = true;1033 else1034 dec_queued_datagrams(dev);1035 1036 spin_unlock_irqrestore(&dev->lock, flags);1037 1038 netif_trans_update(dev->netdev);1039 out:1040 if (free)1041 fwnet_free_ptask(ptask);1042 1043 return 0;1044}1045 1046static void fwnet_fifo_stop(struct fwnet_device *dev)1047{1048 if (dev->local_fifo == FWNET_NO_FIFO_ADDR)1049 return;1050 1051 fw_core_remove_address_handler(&dev->handler);1052 dev->local_fifo = FWNET_NO_FIFO_ADDR;1053}1054 1055static int fwnet_fifo_start(struct fwnet_device *dev)1056{1057 int retval;1058 1059 if (dev->local_fifo != FWNET_NO_FIFO_ADDR)1060 return 0;1061 1062 dev->handler.length = 4096;1063 dev->handler.address_callback = fwnet_receive_packet;1064 dev->handler.callback_data = dev;1065 1066 retval = fw_core_add_address_handler(&dev->handler,1067 &fw_high_memory_region);1068 if (retval < 0)1069 return retval;1070 1071 dev->local_fifo = dev->handler.offset;1072 1073 return 0;1074}1075 1076static void __fwnet_broadcast_stop(struct fwnet_device *dev)1077{1078 unsigned u;1079 1080 if (dev->broadcast_state != FWNET_BROADCAST_ERROR) {1081 for (u = 0; u < FWNET_ISO_PAGE_COUNT; u++)1082 kunmap(dev->broadcast_rcv_buffer.pages[u]);1083 fw_iso_buffer_destroy(&dev->broadcast_rcv_buffer, dev->card);1084 }1085 if (dev->broadcast_rcv_context) {1086 fw_iso_context_destroy(dev->broadcast_rcv_context);1087 dev->broadcast_rcv_context = NULL;1088 }1089 kfree(dev->broadcast_rcv_buffer_ptrs);1090 dev->broadcast_rcv_buffer_ptrs = NULL;1091 dev->broadcast_state = FWNET_BROADCAST_ERROR;1092}1093 1094static void fwnet_broadcast_stop(struct fwnet_device *dev)1095{1096 if (dev->broadcast_state == FWNET_BROADCAST_ERROR)1097 return;1098 fw_iso_context_stop(dev->broadcast_rcv_context);1099 __fwnet_broadcast_stop(dev);1100}1101 1102static int fwnet_broadcast_start(struct fwnet_device *dev)1103{1104 struct fw_iso_context *context;1105 int retval;1106 unsigned num_packets;1107 unsigned max_receive;1108 struct fw_iso_packet packet;1109 unsigned long offset;1110 void **ptrptr;1111 unsigned u;1112 1113 if (dev->broadcast_state != FWNET_BROADCAST_ERROR)1114 return 0;1115 1116 max_receive = 1U << (dev->card->max_receive + 1);1117 num_packets = (FWNET_ISO_PAGE_COUNT * PAGE_SIZE) / max_receive;1118 1119 ptrptr = kmalloc_array(num_packets, sizeof(void *), GFP_KERNEL);1120 if (!ptrptr) {1121 retval = -ENOMEM;1122 goto failed;1123 }1124 dev->broadcast_rcv_buffer_ptrs = ptrptr;1125 1126 context = fw_iso_context_create(dev->card, FW_ISO_CONTEXT_RECEIVE,1127 IEEE1394_BROADCAST_CHANNEL,1128 dev->card->link_speed, 8,1129 fwnet_receive_broadcast, dev);1130 if (IS_ERR(context)) {1131 retval = PTR_ERR(context);1132 goto failed;1133 }1134 1135 retval = fw_iso_buffer_init(&dev->broadcast_rcv_buffer, dev->card,1136 FWNET_ISO_PAGE_COUNT, DMA_FROM_DEVICE);1137 if (retval < 0)1138 goto failed;1139 1140 dev->broadcast_state = FWNET_BROADCAST_STOPPED;1141 1142 for (u = 0; u < FWNET_ISO_PAGE_COUNT; u++) {1143 void *ptr;1144 unsigned v;1145 1146 ptr = kmap(dev->broadcast_rcv_buffer.pages[u]);1147 for (v = 0; v < num_packets / FWNET_ISO_PAGE_COUNT; v++)1148 *ptrptr++ = (void *) ((char *)ptr + v * max_receive);1149 }1150 dev->broadcast_rcv_context = context;1151 1152 packet.payload_length = max_receive;1153 packet.interrupt = 1;1154 packet.skip = 0;1155 packet.tag = 3;1156 packet.sy = 0;1157 packet.header_length = IEEE1394_GASP_HDR_SIZE;1158 offset = 0;1159 1160 for (u = 0; u < num_packets; u++) {1161 retval = fw_iso_context_queue(context, &packet,1162 &dev->broadcast_rcv_buffer, offset);1163 if (retval < 0)1164 goto failed;1165 1166 offset += max_receive;1167 }1168 dev->num_broadcast_rcv_ptrs = num_packets;1169 dev->rcv_buffer_size = max_receive;1170 dev->broadcast_rcv_next_ptr = 0U;1171 retval = fw_iso_context_start(context, -1, 0,1172 FW_ISO_CONTEXT_MATCH_ALL_TAGS); /* ??? sync */1173 if (retval < 0)1174 goto failed;1175 1176 /* FIXME: adjust it according to the min. speed of all known peers? */1177 dev->broadcast_xmt_max_payload = IEEE1394_MAX_PAYLOAD_S1001178 - IEEE1394_GASP_HDR_SIZE - RFC2374_UNFRAG_HDR_SIZE;1179 dev->broadcast_state = FWNET_BROADCAST_RUNNING;1180 1181 return 0;1182 1183 failed:1184 __fwnet_broadcast_stop(dev);1185 return retval;1186}1187 1188static void set_carrier_state(struct fwnet_device *dev)1189{1190 if (dev->peer_count > 1)1191 netif_carrier_on(dev->netdev);1192 else1193 netif_carrier_off(dev->netdev);1194}1195 1196/* ifup */1197static int fwnet_open(struct net_device *net)1198{1199 struct fwnet_device *dev = netdev_priv(net);1200 int ret;1201 1202 ret = fwnet_broadcast_start(dev);1203 if (ret)1204 return ret;1205 1206 netif_start_queue(net);1207 1208 spin_lock_irq(&dev->lock);1209 set_carrier_state(dev);1210 spin_unlock_irq(&dev->lock);1211 1212 return 0;1213}1214 1215/* ifdown */1216static int fwnet_stop(struct net_device *net)1217{1218 struct fwnet_device *dev = netdev_priv(net);1219 1220 netif_stop_queue(net);1221 fwnet_broadcast_stop(dev);1222 1223 return 0;1224}1225 1226static netdev_tx_t fwnet_tx(struct sk_buff *skb, struct net_device *net)1227{1228 struct fwnet_header hdr_buf;1229 struct fwnet_device *dev = netdev_priv(net);1230 __be16 proto;1231 u16 dest_node;1232 unsigned max_payload;1233 u16 dg_size;1234 u16 *datagram_label_ptr;1235 struct fwnet_packet_task *ptask;1236 struct fwnet_peer *peer;1237 unsigned long flags;1238 1239 spin_lock_irqsave(&dev->lock, flags);1240 1241 /* Can this happen? */1242 if (netif_queue_stopped(dev->netdev)) {1243 spin_unlock_irqrestore(&dev->lock, flags);1244 1245 return NETDEV_TX_BUSY;1246 }1247 1248 ptask = kmem_cache_alloc(fwnet_packet_task_cache, GFP_ATOMIC);1249 if (ptask == NULL)1250 goto fail;1251 1252 skb = skb_share_check(skb, GFP_ATOMIC);1253 if (!skb)1254 goto fail;1255 1256 /*1257 * Make a copy of the driver-specific header.1258 * We might need to rebuild the header on tx failure.1259 */1260 memcpy(&hdr_buf, skb->data, sizeof(hdr_buf));1261 proto = hdr_buf.h_proto;1262 1263 switch (proto) {1264 case htons(ETH_P_ARP):1265 case htons(ETH_P_IP):1266#if IS_ENABLED(CONFIG_IPV6)1267 case htons(ETH_P_IPV6):1268#endif1269 break;1270 default:1271 goto fail;1272 }1273 1274 skb_pull(skb, sizeof(hdr_buf));1275 dg_size = skb->len;1276 1277 /*1278 * Set the transmission type for the packet. ARP packets and IP1279 * broadcast packets are sent via GASP.1280 */1281 if (fwnet_hwaddr_is_multicast(hdr_buf.h_dest)) {1282 max_payload = dev->broadcast_xmt_max_payload;1283 datagram_label_ptr = &dev->broadcast_xmt_datagramlabel;1284 1285 ptask->fifo_addr = FWNET_NO_FIFO_ADDR;1286 ptask->generation = 0;1287 ptask->dest_node = IEEE1394_ALL_NODES;1288 ptask->speed = SCODE_100;1289 } else {1290 union fwnet_hwaddr *ha = (union fwnet_hwaddr *)hdr_buf.h_dest;1291 __be64 guid = get_unaligned(&ha->uc.uniq_id);1292 u8 generation;1293 1294 peer = fwnet_peer_find_by_guid(dev, be64_to_cpu(guid));1295 if (!peer)1296 goto fail;1297 1298 generation = peer->generation;1299 dest_node = peer->node_id;1300 max_payload = peer->max_payload;1301 datagram_label_ptr = &peer->datagram_label;1302 1303 ptask->fifo_addr = get_unaligned_be48(ha->uc.fifo);1304 ptask->generation = generation;1305 ptask->dest_node = dest_node;1306 ptask->speed = peer->speed;1307 }1308 1309 ptask->hdr.w0 = 0;1310 ptask->hdr.w1 = 0;1311 ptask->skb = skb;1312 ptask->dev = dev;1313 1314 /* Does it all fit in one packet? */1315 if (dg_size <= max_payload) {1316 fwnet_make_uf_hdr(&ptask->hdr, ntohs(proto));1317 ptask->outstanding_pkts = 1;1318 max_payload = dg_size + RFC2374_UNFRAG_HDR_SIZE;1319 } else {1320 u16 datagram_label;1321 1322 max_payload -= RFC2374_FRAG_OVERHEAD;1323 datagram_label = (*datagram_label_ptr)++;1324 fwnet_make_ff_hdr(&ptask->hdr, ntohs(proto), dg_size,1325 datagram_label);1326 ptask->outstanding_pkts = DIV_ROUND_UP(dg_size, max_payload);1327 max_payload += RFC2374_FRAG_HDR_SIZE;1328 }1329 1330 if (++dev->queued_datagrams == FWNET_MAX_QUEUED_DATAGRAMS)1331 netif_stop_queue(dev->netdev);1332 1333 spin_unlock_irqrestore(&dev->lock, flags);1334 1335 ptask->max_payload = max_payload;1336 ptask->enqueued = 0;1337 1338 fwnet_send_packet(ptask);1339 1340 return NETDEV_TX_OK;1341 1342 fail:1343 spin_unlock_irqrestore(&dev->lock, flags);1344 1345 if (ptask)1346 kmem_cache_free(fwnet_packet_task_cache, ptask);1347 1348 if (skb != NULL)1349 dev_kfree_skb(skb);1350 1351 net->stats.tx_dropped++;1352 net->stats.tx_errors++;1353 1354 /*1355 * FIXME: According to a patch from 2003-02-26, "returning non-zero1356 * causes serious problems" here, allegedly. Before that patch,1357 * -ERRNO was returned which is not appropriate under Linux 2.6.1358 * Perhaps more needs to be done? Stop the queue in serious1359 * conditions and restart it elsewhere?1360 */1361 return NETDEV_TX_OK;1362}1363 1364static const struct ethtool_ops fwnet_ethtool_ops = {1365 .get_link = ethtool_op_get_link,1366};1367 1368static const struct net_device_ops fwnet_netdev_ops = {1369 .ndo_open = fwnet_open,1370 .ndo_stop = fwnet_stop,1371 .ndo_start_xmit = fwnet_tx,1372};1373 1374static void fwnet_init_dev(struct net_device *net)1375{1376 net->header_ops = &fwnet_header_ops;1377 net->netdev_ops = &fwnet_netdev_ops;1378 net->watchdog_timeo = 2 * HZ;1379 net->flags = IFF_BROADCAST | IFF_MULTICAST;1380 net->features = NETIF_F_HIGHDMA;1381 net->addr_len = FWNET_ALEN;1382 net->hard_header_len = FWNET_HLEN;1383 net->type = ARPHRD_IEEE1394;1384 net->tx_queue_len = FWNET_TX_QUEUE_LEN;1385 net->ethtool_ops = &fwnet_ethtool_ops;1386}1387 1388/* caller must hold fwnet_device_mutex */1389static struct fwnet_device *fwnet_dev_find(struct fw_card *card)1390{1391 struct fwnet_device *dev;1392 1393 list_for_each_entry(dev, &fwnet_device_list, dev_link)1394 if (dev->card == card)1395 return dev;1396 1397 return NULL;1398}1399 1400static int fwnet_add_peer(struct fwnet_device *dev,1401 struct fw_unit *unit, struct fw_device *device)1402{1403 struct fwnet_peer *peer;1404 1405 peer = kmalloc(sizeof(*peer), GFP_KERNEL);1406 if (!peer)1407 return -ENOMEM;1408 1409 dev_set_drvdata(&unit->device, peer);1410 1411 peer->dev = dev;1412 peer->guid = (u64)device->config_rom[3] << 32 | device->config_rom[4];1413 INIT_LIST_HEAD(&peer->pd_list);1414 peer->pdg_size = 0;1415 peer->datagram_label = 0;1416 peer->speed = device->max_speed;1417 peer->max_payload = fwnet_max_payload(device->max_rec, peer->speed);1418 1419 peer->generation = device->generation;1420 smp_rmb();1421 peer->node_id = device->node_id;1422 1423 spin_lock_irq(&dev->lock);1424 list_add_tail(&peer->peer_link, &dev->peer_list);1425 dev->peer_count++;1426 set_carrier_state(dev);1427 spin_unlock_irq(&dev->lock);1428 1429 return 0;1430}1431 1432static int fwnet_probe(struct fw_unit *unit,1433 const struct ieee1394_device_id *id)1434{1435 struct fw_device *device = fw_parent_device(unit);1436 struct fw_card *card = device->card;1437 struct net_device *net;1438 bool allocated_netdev = false;1439 struct fwnet_device *dev;1440 union fwnet_hwaddr ha;1441 int ret;1442 1443 mutex_lock(&fwnet_device_mutex);1444 1445 dev = fwnet_dev_find(card);1446 if (dev) {1447 net = dev->netdev;1448 goto have_dev;1449 }1450 1451 net = alloc_netdev(sizeof(*dev), "firewire%d", NET_NAME_UNKNOWN,1452 fwnet_init_dev);1453 if (net == NULL) {1454 mutex_unlock(&fwnet_device_mutex);1455 return -ENOMEM;1456 }1457 1458 allocated_netdev = true;1459 SET_NETDEV_DEV(net, card->device);1460 dev = netdev_priv(net);1461 1462 spin_lock_init(&dev->lock);1463 dev->broadcast_state = FWNET_BROADCAST_ERROR;1464 dev->broadcast_rcv_context = NULL;1465 dev->broadcast_xmt_max_payload = 0;1466 dev->broadcast_xmt_datagramlabel = 0;1467 dev->local_fifo = FWNET_NO_FIFO_ADDR;1468 dev->queued_datagrams = 0;1469 INIT_LIST_HEAD(&dev->peer_list);1470 dev->card = card;1471 dev->netdev = net;1472 1473 ret = fwnet_fifo_start(dev);1474 if (ret < 0)1475 goto out;1476 dev->local_fifo = dev->handler.offset;1477 1478 /*1479 * default MTU: RFC 2734 cl. 4, RFC 3146 cl. 41480 * maximum MTU: RFC 2734 cl. 4.2, fragment encapsulation header's1481 * maximum possible datagram_size + 1 = 0xfff + 11482 */1483 net->mtu = 1500U;1484 net->min_mtu = ETH_MIN_MTU;1485 net->max_mtu = 4096U;1486 1487 /* Set our hardware address while we're at it */1488 ha.uc.uniq_id = cpu_to_be64(card->guid);1489 ha.uc.max_rec = dev->card->max_receive;1490 ha.uc.sspd = dev->card->link_speed;1491 put_unaligned_be48(dev->local_fifo, ha.uc.fifo);1492 dev_addr_set(net, ha.u);1493 1494 memset(net->broadcast, -1, net->addr_len);1495 1496 ret = register_netdev(net);1497 if (ret)1498 goto out;1499 1500 list_add_tail(&dev->dev_link, &fwnet_device_list);1501 dev_notice(&net->dev, "IP over IEEE 1394 on card %s\n",1502 dev_name(card->device));1503 have_dev:1504 ret = fwnet_add_peer(dev, unit, device);1505 if (ret && allocated_netdev) {1506 unregister_netdev(net);1507 list_del(&dev->dev_link);1508 out:1509 fwnet_fifo_stop(dev);1510 free_netdev(net);1511 }1512 1513 mutex_unlock(&fwnet_device_mutex);1514 1515 return ret;1516}1517 1518/*1519 * FIXME abort partially sent fragmented datagrams,1520 * discard partially received fragmented datagrams1521 */1522static void fwnet_update(struct fw_unit *unit)1523{1524 struct fw_device *device = fw_parent_device(unit);1525 struct fwnet_peer *peer = dev_get_drvdata(&unit->device);1526 int generation;1527 1528 generation = device->generation;1529 1530 spin_lock_irq(&peer->dev->lock);1531 peer->node_id = device->node_id;1532 peer->generation = generation;1533 spin_unlock_irq(&peer->dev->lock);1534}1535 1536static void fwnet_remove_peer(struct fwnet_peer *peer, struct fwnet_device *dev)1537{1538 struct fwnet_partial_datagram *pd, *pd_next;1539 1540 spin_lock_irq(&dev->lock);1541 list_del(&peer->peer_link);1542 dev->peer_count--;1543 set_carrier_state(dev);1544 spin_unlock_irq(&dev->lock);1545 1546 list_for_each_entry_safe(pd, pd_next, &peer->pd_list, pd_link)1547 fwnet_pd_delete(pd);1548 1549 kfree(peer);1550}1551 1552static void fwnet_remove(struct fw_unit *unit)1553{1554 struct fwnet_peer *peer = dev_get_drvdata(&unit->device);1555 struct fwnet_device *dev = peer->dev;1556 struct net_device *net;1557 int i;1558 1559 mutex_lock(&fwnet_device_mutex);1560 1561 net = dev->netdev;1562 1563 fwnet_remove_peer(peer, dev);1564 1565 if (list_empty(&dev->peer_list)) {1566 unregister_netdev(net);1567 1568 fwnet_fifo_stop(dev);1569 1570 for (i = 0; dev->queued_datagrams && i < 5; i++)1571 ssleep(1);1572 WARN_ON(dev->queued_datagrams);1573 list_del(&dev->dev_link);1574 1575 free_netdev(net);1576 }1577 1578 mutex_unlock(&fwnet_device_mutex);1579}1580 1581static const struct ieee1394_device_id fwnet_id_table[] = {1582 {1583 .match_flags = IEEE1394_MATCH_SPECIFIER_ID |1584 IEEE1394_MATCH_VERSION,1585 .specifier_id = IANA_SPECIFIER_ID,1586 .version = RFC2734_SW_VERSION,1587 },1588#if IS_ENABLED(CONFIG_IPV6)1589 {1590 .match_flags = IEEE1394_MATCH_SPECIFIER_ID |1591 IEEE1394_MATCH_VERSION,1592 .specifier_id = IANA_SPECIFIER_ID,1593 .version = RFC3146_SW_VERSION,1594 },1595#endif1596 { }1597};1598 1599static struct fw_driver fwnet_driver = {1600 .driver = {1601 .owner = THIS_MODULE,1602 .name = KBUILD_MODNAME,1603 .bus = &fw_bus_type,1604 },1605 .probe = fwnet_probe,1606 .update = fwnet_update,1607 .remove = fwnet_remove,1608 .id_table = fwnet_id_table,1609};1610 1611static const u32 rfc2374_unit_directory_data[] = {1612 0x00040000, /* directory_length */1613 0x1200005e, /* unit_specifier_id: IANA */1614 0x81000003, /* textual descriptor offset */1615 0x13000001, /* unit_sw_version: RFC 2734 */1616 0x81000005, /* textual descriptor offset */1617 0x00030000, /* descriptor_length */1618 0x00000000, /* text */1619 0x00000000, /* minimal ASCII, en */1620 0x49414e41, /* I A N A */1621 0x00030000, /* descriptor_length */1622 0x00000000, /* text */1623 0x00000000, /* minimal ASCII, en */1624 0x49507634, /* I P v 4 */1625};1626 1627static struct fw_descriptor rfc2374_unit_directory = {1628 .length = ARRAY_SIZE(rfc2374_unit_directory_data),1629 .key = (CSR_DIRECTORY | CSR_UNIT) << 24,1630 .data = rfc2374_unit_directory_data1631};1632 1633#if IS_ENABLED(CONFIG_IPV6)1634static const u32 rfc3146_unit_directory_data[] = {1635 0x00040000, /* directory_length */1636 0x1200005e, /* unit_specifier_id: IANA */1637 0x81000003, /* textual descriptor offset */1638 0x13000002, /* unit_sw_version: RFC 3146 */1639 0x81000005, /* textual descriptor offset */1640 0x00030000, /* descriptor_length */1641 0x00000000, /* text */1642 0x00000000, /* minimal ASCII, en */1643 0x49414e41, /* I A N A */1644 0x00030000, /* descriptor_length */1645 0x00000000, /* text */1646 0x00000000, /* minimal ASCII, en */1647 0x49507636, /* I P v 6 */1648};1649 1650static struct fw_descriptor rfc3146_unit_directory = {1651 .length = ARRAY_SIZE(rfc3146_unit_directory_data),1652 .key = (CSR_DIRECTORY | CSR_UNIT) << 24,1653 .data = rfc3146_unit_directory_data1654};1655#endif1656 1657static int __init fwnet_init(void)1658{1659 int err;1660 1661 err = fw_core_add_descriptor(&rfc2374_unit_directory);1662 if (err)1663 return err;1664 1665#if IS_ENABLED(CONFIG_IPV6)1666 err = fw_core_add_descriptor(&rfc3146_unit_directory);1667 if (err)1668 goto out;1669#endif1670 1671 fwnet_packet_task_cache = kmem_cache_create("packet_task",1672 sizeof(struct fwnet_packet_task), 0, 0, NULL);1673 if (!fwnet_packet_task_cache) {1674 err = -ENOMEM;1675 goto out2;1676 }1677 1678 err = driver_register(&fwnet_driver.driver);1679 if (!err)1680 return 0;1681 1682 kmem_cache_destroy(fwnet_packet_task_cache);1683out2:1684#if IS_ENABLED(CONFIG_IPV6)1685 fw_core_remove_descriptor(&rfc3146_unit_directory);1686out:1687#endif1688 fw_core_remove_descriptor(&rfc2374_unit_directory);1689 1690 return err;1691}1692module_init(fwnet_init);1693 1694static void __exit fwnet_cleanup(void)1695{1696 driver_unregister(&fwnet_driver.driver);1697 kmem_cache_destroy(fwnet_packet_task_cache);1698#if IS_ENABLED(CONFIG_IPV6)1699 fw_core_remove_descriptor(&rfc3146_unit_directory);1700#endif1701 fw_core_remove_descriptor(&rfc2374_unit_directory);1702}1703module_exit(fwnet_cleanup);1704 1705MODULE_AUTHOR("Jay Fenlason <fenlason@redhat.com>");1706MODULE_DESCRIPTION("IP over IEEE1394 as per RFC 2734/3146");1707MODULE_LICENSE("GPL");1708MODULE_DEVICE_TABLE(ieee1394, fwnet_id_table);1709