コード例 #1
0
ファイル: hd6457x.c プロジェクト: wxlong/Test
static inline void sca_rx(card_t *card, port_t *port, pkt_desc *desc, u16 rxin)
{
	struct net_device *dev = port_to_dev(port);
	struct net_device_stats *stats = hdlc_stats(dev);
	struct sk_buff *skb;
	u16 len;
	u32 buff;
#ifndef ALL_PAGES_ALWAYS_MAPPED
	u32 maxlen;
	u8 page;
#endif

	len = readw(&desc->len);
	skb = dev_alloc_skb(len);
	if (!skb) {
		stats->rx_dropped++;
		return;
	}

	buff = buffer_offset(port, rxin, 0);
#ifndef ALL_PAGES_ALWAYS_MAPPED
	page = buff / winsize(card);
	buff = buff % winsize(card);
	maxlen = winsize(card) - buff;

	openwin(card, page);

	if (len > maxlen) {
		memcpy_fromio(skb->data, winbase(card) + buff, maxlen);
		openwin(card, page + 1);
		memcpy_fromio(skb->data + maxlen, winbase(card), len - maxlen);
	} else
#endif
	memcpy_fromio(skb->data, winbase(card) + buff, len);

#if !defined(PAGE0_ALWAYS_MAPPED) && !defined(ALL_PAGES_ALWAYS_MAPPED)
	/* select pkt_desc table page back */
	openwin(card, 0);
#endif
	skb_put(skb, len);
#ifdef DEBUG_PKT
	printk(KERN_DEBUG "%s RX(%i):", dev->name, skb->len);
	debug_frame(skb);
#endif
	stats->rx_packets++;
	stats->rx_bytes += skb->len;
	skb->mac.raw = skb->data;
	skb->dev = dev;
	skb->dev->last_rx = jiffies;
	skb->protocol = hdlc_type_trans(skb, dev);
	netif_rx(skb);
}
コード例 #2
0
static inline void sca_rx(card_t *card, port_t *port, pkt_desc __iomem *desc,
                          u16 rxin)
{
    struct net_device *dev = port_to_dev(port);
    struct sk_buff *skb;
    u16 len;
    u32 buff;
    u32 maxlen;
    u8 page;

    len = readw(&desc->len);
    skb = dev_alloc_skb(len);
    if (!skb) {
        dev->stats.rx_dropped++;
        return;
    }

    buff = buffer_offset(port, rxin, 0);
    page = buff / winsize(card);
    buff = buff % winsize(card);
    maxlen = winsize(card) - buff;

    openwin(card, page);

    if (len > maxlen) {
        memcpy_fromio(skb->data, winbase(card) + buff, maxlen);
        openwin(card, page + 1);
        memcpy_fromio(skb->data + maxlen, winbase(card), len - maxlen);
    } else
        memcpy_fromio(skb->data, winbase(card) + buff, len);

#ifndef PAGE0_ALWAYS_MAPPED
    openwin(card, 0);
#endif
    skb_put(skb, len);
#ifdef DEBUG_PKT
    printk(KERN_DEBUG "%s RX(%i):", dev->name, skb->len);
    debug_frame(skb);
#endif
    dev->stats.rx_packets++;
    dev->stats.rx_bytes += skb->len;
    skb->protocol = hdlc_type_trans(skb, dev);
    netif_rx(skb);
}
コード例 #3
0
ファイル: hd6457x.c プロジェクト: Antonio-Zhou/Linux-2.6.11
static inline pkt_desc __iomem *desc_address(port_t *port, u16 desc, int transmit)
{
#ifdef PAGE0_ALWAYS_MAPPED
	return (pkt_desc __iomem *)(win0base(port_to_card(port))
			   + desc_offset(port, desc, transmit));
#else
	return (pkt_desc __iomem *)(winbase(port_to_card(port))
			   + desc_offset(port, desc, transmit));
#endif
}