forked from luck/tmp_suning_uos_patched
Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
* master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6: (160 commits) [ETHTOOL]: Remove some entries from non-root command list. [Bluetooth]: Fix section mismatch of bt_sysfs_cleanup() [Bluetooth]: Don't update disconnect timer for incoming connections [ETHTOOL]: let mortals use ethtool [NetLabel]: add audit support for configuration changes [TCP]: Fix and simplify microsecond rtt sampling [TCP] tcp-lp: prevent chance for oops [SUNRPC]: Remove unnecessary check in net/sunrpc/svcsock.c [IPVS] bug: endianness breakage in ip_vs_ftp [IPVS]: ipvs annotations [NETFILTER]: h323 annotations [NETFILTER]: ipt annotations [NETFILTER]: NAT annotations [NETFILTER]: conntrack annotations [NETFILTER]: netfilter misc annotations [NET]: Annotate dst_ops protocol [NET]: is it Andy or Andi ?? [IPVS]: Make sure ip_vs_ftp ports are valid: module_param_array approach [IPVS]: Reverse valid ip_vs_ftp ports fix: port check approach [IrDA] stir4200: removing undocumented bits handling ...
This commit is contained in:
commit
3dcbbcda7c
@ -100,6 +100,7 @@ Examples:
|
||||
are: IPSRC_RND #IP Source is random (between min/max),
|
||||
IPDST_RND, UDPSRC_RND,
|
||||
UDPDST_RND, MACSRC_RND, MACDST_RND
|
||||
MPLS_RND, VID_RND, SVID_RND
|
||||
|
||||
pgset "udp_src_min 9" set UDP source port min, If < udp_src_max, then
|
||||
cycle through the port range.
|
||||
@ -125,6 +126,21 @@ Examples:
|
||||
|
||||
pgset "mpls 0" turn off mpls (or any invalid argument works too!)
|
||||
|
||||
pgset "vlan_id 77" set VLAN ID 0-4095
|
||||
pgset "vlan_p 3" set priority bit 0-7 (default 0)
|
||||
pgset "vlan_cfi 0" set canonical format identifier 0-1 (default 0)
|
||||
|
||||
pgset "svlan_id 22" set SVLAN ID 0-4095
|
||||
pgset "svlan_p 3" set priority bit 0-7 (default 0)
|
||||
pgset "svlan_cfi 0" set canonical format identifier 0-1 (default 0)
|
||||
|
||||
pgset "vlan_id 9999" > 4095 remove vlan and svlan tags
|
||||
pgset "svlan 9999" > 4095 remove svlan tag
|
||||
|
||||
|
||||
pgset "tos XX" set former IPv4 TOS field (e.g. "tos 28" for AF11 no ECN, default 00)
|
||||
pgset "traffic_class XX" set former IPv6 TRAFFIC CLASS (e.g. "traffic_class B8" for EF no ECN, default 00)
|
||||
|
||||
pgset stop aborts injection. Also, ^C aborts generator.
|
||||
|
||||
|
||||
|
@ -320,7 +320,7 @@ simeth_device_event(struct notifier_block *this,unsigned long event, void *ptr)
|
||||
}
|
||||
|
||||
printk(KERN_INFO "simeth_device_event: %s ipaddr=0x%x\n",
|
||||
dev->name, htonl(ifa->ifa_local));
|
||||
dev->name, ntohl(ifa->ifa_local));
|
||||
|
||||
/*
|
||||
* XXX Fix me
|
||||
@ -331,7 +331,7 @@ simeth_device_event(struct notifier_block *this,unsigned long event, void *ptr)
|
||||
local = dev->priv;
|
||||
/* now do it for real */
|
||||
r = event == NETDEV_UP ?
|
||||
netdev_attach(local->simfd, dev->irq, htonl(ifa->ifa_local)):
|
||||
netdev_attach(local->simfd, dev->irq, ntohl(ifa->ifa_local)):
|
||||
netdev_detach(local->simfd);
|
||||
|
||||
printk(KERN_INFO "simeth: netdev_attach/detach: event=%s ->%d\n",
|
||||
|
@ -825,7 +825,7 @@ int dev_netmask(void *d, void *m)
|
||||
struct net_device *dev = d;
|
||||
struct in_device *ip = dev->ip_ptr;
|
||||
struct in_ifaddr *in;
|
||||
__u32 *mask_out = m;
|
||||
__be32 *mask_out = m;
|
||||
|
||||
if(ip == NULL)
|
||||
return(1);
|
||||
|
@ -201,7 +201,7 @@ static void dev_ip_addr(void *d, char *buf, char *bin_buf)
|
||||
struct net_device *dev = d;
|
||||
struct in_device *ip = dev->ip_ptr;
|
||||
struct in_ifaddr *in;
|
||||
u32 addr;
|
||||
__be32 addr;
|
||||
|
||||
if ((ip == NULL) || ((in = ip->ifa_list) == NULL)) {
|
||||
printk(KERN_WARNING "Device not assigned an IP address!\n");
|
||||
|
@ -2,7 +2,7 @@
|
||||
*
|
||||
* AVM BlueFRITZ! USB driver
|
||||
*
|
||||
* Copyright (C) 2003 Marcel Holtmann <marcel@holtmann.org>
|
||||
* Copyright (C) 2003-2006 Marcel Holtmann <marcel@holtmann.org>
|
||||
*
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
@ -59,7 +59,6 @@ static struct usb_device_id bfusb_table[] = {
|
||||
|
||||
MODULE_DEVICE_TABLE(usb, bfusb_table);
|
||||
|
||||
|
||||
#define BFUSB_MAX_BLOCK_SIZE 256
|
||||
|
||||
#define BFUSB_BLOCK_TIMEOUT 3000
|
||||
@ -70,7 +69,7 @@ MODULE_DEVICE_TABLE(usb, bfusb_table);
|
||||
#define BFUSB_MAX_BULK_TX 2
|
||||
#define BFUSB_MAX_BULK_RX 2
|
||||
|
||||
struct bfusb {
|
||||
struct bfusb_data {
|
||||
struct hci_dev *hdev;
|
||||
|
||||
unsigned long state;
|
||||
@ -92,137 +91,136 @@ struct bfusb {
|
||||
struct sk_buff_head completed_q;
|
||||
};
|
||||
|
||||
struct bfusb_scb {
|
||||
struct bfusb_data_scb {
|
||||
struct urb *urb;
|
||||
};
|
||||
|
||||
static void bfusb_tx_complete(struct urb *urb, struct pt_regs *regs);
|
||||
static void bfusb_rx_complete(struct urb *urb, struct pt_regs *regs);
|
||||
|
||||
static struct urb *bfusb_get_completed(struct bfusb *bfusb)
|
||||
static struct urb *bfusb_get_completed(struct bfusb_data *data)
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
struct urb *urb = NULL;
|
||||
|
||||
BT_DBG("bfusb %p", bfusb);
|
||||
BT_DBG("bfusb %p", data);
|
||||
|
||||
skb = skb_dequeue(&bfusb->completed_q);
|
||||
skb = skb_dequeue(&data->completed_q);
|
||||
if (skb) {
|
||||
urb = ((struct bfusb_scb *) skb->cb)->urb;
|
||||
urb = ((struct bfusb_data_scb *) skb->cb)->urb;
|
||||
kfree_skb(skb);
|
||||
}
|
||||
|
||||
return urb;
|
||||
}
|
||||
|
||||
static void bfusb_unlink_urbs(struct bfusb *bfusb)
|
||||
static void bfusb_unlink_urbs(struct bfusb_data *data)
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
struct urb *urb;
|
||||
|
||||
BT_DBG("bfusb %p", bfusb);
|
||||
BT_DBG("bfusb %p", data);
|
||||
|
||||
while ((skb = skb_dequeue(&bfusb->pending_q))) {
|
||||
urb = ((struct bfusb_scb *) skb->cb)->urb;
|
||||
while ((skb = skb_dequeue(&data->pending_q))) {
|
||||
urb = ((struct bfusb_data_scb *) skb->cb)->urb;
|
||||
usb_kill_urb(urb);
|
||||
skb_queue_tail(&bfusb->completed_q, skb);
|
||||
skb_queue_tail(&data->completed_q, skb);
|
||||
}
|
||||
|
||||
while ((urb = bfusb_get_completed(bfusb)))
|
||||
while ((urb = bfusb_get_completed(data)))
|
||||
usb_free_urb(urb);
|
||||
}
|
||||
|
||||
|
||||
static int bfusb_send_bulk(struct bfusb *bfusb, struct sk_buff *skb)
|
||||
static int bfusb_send_bulk(struct bfusb_data *data, struct sk_buff *skb)
|
||||
{
|
||||
struct bfusb_scb *scb = (void *) skb->cb;
|
||||
struct urb *urb = bfusb_get_completed(bfusb);
|
||||
struct bfusb_data_scb *scb = (void *) skb->cb;
|
||||
struct urb *urb = bfusb_get_completed(data);
|
||||
int err, pipe;
|
||||
|
||||
BT_DBG("bfusb %p skb %p len %d", bfusb, skb, skb->len);
|
||||
BT_DBG("bfusb %p skb %p len %d", data, skb, skb->len);
|
||||
|
||||
if (!urb && !(urb = usb_alloc_urb(0, GFP_ATOMIC)))
|
||||
return -ENOMEM;
|
||||
|
||||
pipe = usb_sndbulkpipe(bfusb->udev, bfusb->bulk_out_ep);
|
||||
pipe = usb_sndbulkpipe(data->udev, data->bulk_out_ep);
|
||||
|
||||
usb_fill_bulk_urb(urb, bfusb->udev, pipe, skb->data, skb->len,
|
||||
usb_fill_bulk_urb(urb, data->udev, pipe, skb->data, skb->len,
|
||||
bfusb_tx_complete, skb);
|
||||
|
||||
scb->urb = urb;
|
||||
|
||||
skb_queue_tail(&bfusb->pending_q, skb);
|
||||
skb_queue_tail(&data->pending_q, skb);
|
||||
|
||||
err = usb_submit_urb(urb, GFP_ATOMIC);
|
||||
if (err) {
|
||||
BT_ERR("%s bulk tx submit failed urb %p err %d",
|
||||
bfusb->hdev->name, urb, err);
|
||||
skb_unlink(skb, &bfusb->pending_q);
|
||||
data->hdev->name, urb, err);
|
||||
skb_unlink(skb, &data->pending_q);
|
||||
usb_free_urb(urb);
|
||||
} else
|
||||
atomic_inc(&bfusb->pending_tx);
|
||||
atomic_inc(&data->pending_tx);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static void bfusb_tx_wakeup(struct bfusb *bfusb)
|
||||
static void bfusb_tx_wakeup(struct bfusb_data *data)
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
|
||||
BT_DBG("bfusb %p", bfusb);
|
||||
BT_DBG("bfusb %p", data);
|
||||
|
||||
if (test_and_set_bit(BFUSB_TX_PROCESS, &bfusb->state)) {
|
||||
set_bit(BFUSB_TX_WAKEUP, &bfusb->state);
|
||||
if (test_and_set_bit(BFUSB_TX_PROCESS, &data->state)) {
|
||||
set_bit(BFUSB_TX_WAKEUP, &data->state);
|
||||
return;
|
||||
}
|
||||
|
||||
do {
|
||||
clear_bit(BFUSB_TX_WAKEUP, &bfusb->state);
|
||||
clear_bit(BFUSB_TX_WAKEUP, &data->state);
|
||||
|
||||
while ((atomic_read(&bfusb->pending_tx) < BFUSB_MAX_BULK_TX) &&
|
||||
(skb = skb_dequeue(&bfusb->transmit_q))) {
|
||||
if (bfusb_send_bulk(bfusb, skb) < 0) {
|
||||
skb_queue_head(&bfusb->transmit_q, skb);
|
||||
while ((atomic_read(&data->pending_tx) < BFUSB_MAX_BULK_TX) &&
|
||||
(skb = skb_dequeue(&data->transmit_q))) {
|
||||
if (bfusb_send_bulk(data, skb) < 0) {
|
||||
skb_queue_head(&data->transmit_q, skb);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
} while (test_bit(BFUSB_TX_WAKEUP, &bfusb->state));
|
||||
} while (test_bit(BFUSB_TX_WAKEUP, &data->state));
|
||||
|
||||
clear_bit(BFUSB_TX_PROCESS, &bfusb->state);
|
||||
clear_bit(BFUSB_TX_PROCESS, &data->state);
|
||||
}
|
||||
|
||||
static void bfusb_tx_complete(struct urb *urb, struct pt_regs *regs)
|
||||
{
|
||||
struct sk_buff *skb = (struct sk_buff *) urb->context;
|
||||
struct bfusb *bfusb = (struct bfusb *) skb->dev;
|
||||
struct bfusb_data *data = (struct bfusb_data *) skb->dev;
|
||||
|
||||
BT_DBG("bfusb %p urb %p skb %p len %d", bfusb, urb, skb, skb->len);
|
||||
BT_DBG("bfusb %p urb %p skb %p len %d", data, urb, skb, skb->len);
|
||||
|
||||
atomic_dec(&bfusb->pending_tx);
|
||||
atomic_dec(&data->pending_tx);
|
||||
|
||||
if (!test_bit(HCI_RUNNING, &bfusb->hdev->flags))
|
||||
if (!test_bit(HCI_RUNNING, &data->hdev->flags))
|
||||
return;
|
||||
|
||||
if (!urb->status)
|
||||
bfusb->hdev->stat.byte_tx += skb->len;
|
||||
data->hdev->stat.byte_tx += skb->len;
|
||||
else
|
||||
bfusb->hdev->stat.err_tx++;
|
||||
data->hdev->stat.err_tx++;
|
||||
|
||||
read_lock(&bfusb->lock);
|
||||
read_lock(&data->lock);
|
||||
|
||||
skb_unlink(skb, &bfusb->pending_q);
|
||||
skb_queue_tail(&bfusb->completed_q, skb);
|
||||
skb_unlink(skb, &data->pending_q);
|
||||
skb_queue_tail(&data->completed_q, skb);
|
||||
|
||||
bfusb_tx_wakeup(bfusb);
|
||||
bfusb_tx_wakeup(data);
|
||||
|
||||
read_unlock(&bfusb->lock);
|
||||
read_unlock(&data->lock);
|
||||
}
|
||||
|
||||
|
||||
static int bfusb_rx_submit(struct bfusb *bfusb, struct urb *urb)
|
||||
static int bfusb_rx_submit(struct bfusb_data *data, struct urb *urb)
|
||||
{
|
||||
struct bfusb_scb *scb;
|
||||
struct bfusb_data_scb *scb;
|
||||
struct sk_buff *skb;
|
||||
int err, pipe, size = HCI_MAX_FRAME_SIZE + 32;
|
||||
|
||||
@ -231,28 +229,29 @@ static int bfusb_rx_submit(struct bfusb *bfusb, struct urb *urb)
|
||||
if (!urb && !(urb = usb_alloc_urb(0, GFP_ATOMIC)))
|
||||
return -ENOMEM;
|
||||
|
||||
if (!(skb = bt_skb_alloc(size, GFP_ATOMIC))) {
|
||||
skb = bt_skb_alloc(size, GFP_ATOMIC);
|
||||
if (!skb) {
|
||||
usb_free_urb(urb);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
skb->dev = (void *) bfusb;
|
||||
skb->dev = (void *) data;
|
||||
|
||||
scb = (struct bfusb_scb *) skb->cb;
|
||||
scb = (struct bfusb_data_scb *) skb->cb;
|
||||
scb->urb = urb;
|
||||
|
||||
pipe = usb_rcvbulkpipe(bfusb->udev, bfusb->bulk_in_ep);
|
||||
pipe = usb_rcvbulkpipe(data->udev, data->bulk_in_ep);
|
||||
|
||||
usb_fill_bulk_urb(urb, bfusb->udev, pipe, skb->data, size,
|
||||
usb_fill_bulk_urb(urb, data->udev, pipe, skb->data, size,
|
||||
bfusb_rx_complete, skb);
|
||||
|
||||
skb_queue_tail(&bfusb->pending_q, skb);
|
||||
skb_queue_tail(&data->pending_q, skb);
|
||||
|
||||
err = usb_submit_urb(urb, GFP_ATOMIC);
|
||||
if (err) {
|
||||
BT_ERR("%s bulk rx submit failed urb %p err %d",
|
||||
bfusb->hdev->name, urb, err);
|
||||
skb_unlink(skb, &bfusb->pending_q);
|
||||
data->hdev->name, urb, err);
|
||||
skb_unlink(skb, &data->pending_q);
|
||||
kfree_skb(skb);
|
||||
usb_free_urb(urb);
|
||||
}
|
||||
@ -260,15 +259,15 @@ static int bfusb_rx_submit(struct bfusb *bfusb, struct urb *urb)
|
||||
return err;
|
||||
}
|
||||
|
||||
static inline int bfusb_recv_block(struct bfusb *bfusb, int hdr, unsigned char *data, int len)
|
||||
static inline int bfusb_recv_block(struct bfusb_data *data, int hdr, unsigned char *buf, int len)
|
||||
{
|
||||
BT_DBG("bfusb %p hdr 0x%02x data %p len %d", bfusb, hdr, data, len);
|
||||
BT_DBG("bfusb %p hdr 0x%02x data %p len %d", data, hdr, buf, len);
|
||||
|
||||
if (hdr & 0x10) {
|
||||
BT_ERR("%s error in block", bfusb->hdev->name);
|
||||
if (bfusb->reassembly)
|
||||
kfree_skb(bfusb->reassembly);
|
||||
bfusb->reassembly = NULL;
|
||||
BT_ERR("%s error in block", data->hdev->name);
|
||||
if (data->reassembly)
|
||||
kfree_skb(data->reassembly);
|
||||
data->reassembly = NULL;
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
@ -277,46 +276,46 @@ static inline int bfusb_recv_block(struct bfusb *bfusb, int hdr, unsigned char *
|
||||
unsigned char pkt_type;
|
||||
int pkt_len = 0;
|
||||
|
||||
if (bfusb->reassembly) {
|
||||
BT_ERR("%s unexpected start block", bfusb->hdev->name);
|
||||
kfree_skb(bfusb->reassembly);
|
||||
bfusb->reassembly = NULL;
|
||||
if (data->reassembly) {
|
||||
BT_ERR("%s unexpected start block", data->hdev->name);
|
||||
kfree_skb(data->reassembly);
|
||||
data->reassembly = NULL;
|
||||
}
|
||||
|
||||
if (len < 1) {
|
||||
BT_ERR("%s no packet type found", bfusb->hdev->name);
|
||||
BT_ERR("%s no packet type found", data->hdev->name);
|
||||
return -EPROTO;
|
||||
}
|
||||
|
||||
pkt_type = *data++; len--;
|
||||
pkt_type = *buf++; len--;
|
||||
|
||||
switch (pkt_type) {
|
||||
case HCI_EVENT_PKT:
|
||||
if (len >= HCI_EVENT_HDR_SIZE) {
|
||||
struct hci_event_hdr *hdr = (struct hci_event_hdr *) data;
|
||||
struct hci_event_hdr *hdr = (struct hci_event_hdr *) buf;
|
||||
pkt_len = HCI_EVENT_HDR_SIZE + hdr->plen;
|
||||
} else {
|
||||
BT_ERR("%s event block is too short", bfusb->hdev->name);
|
||||
BT_ERR("%s event block is too short", data->hdev->name);
|
||||
return -EILSEQ;
|
||||
}
|
||||
break;
|
||||
|
||||
case HCI_ACLDATA_PKT:
|
||||
if (len >= HCI_ACL_HDR_SIZE) {
|
||||
struct hci_acl_hdr *hdr = (struct hci_acl_hdr *) data;
|
||||
struct hci_acl_hdr *hdr = (struct hci_acl_hdr *) buf;
|
||||
pkt_len = HCI_ACL_HDR_SIZE + __le16_to_cpu(hdr->dlen);
|
||||
} else {
|
||||
BT_ERR("%s data block is too short", bfusb->hdev->name);
|
||||
BT_ERR("%s data block is too short", data->hdev->name);
|
||||
return -EILSEQ;
|
||||
}
|
||||
break;
|
||||
|
||||
case HCI_SCODATA_PKT:
|
||||
if (len >= HCI_SCO_HDR_SIZE) {
|
||||
struct hci_sco_hdr *hdr = (struct hci_sco_hdr *) data;
|
||||
struct hci_sco_hdr *hdr = (struct hci_sco_hdr *) buf;
|
||||
pkt_len = HCI_SCO_HDR_SIZE + hdr->dlen;
|
||||
} else {
|
||||
BT_ERR("%s audio block is too short", bfusb->hdev->name);
|
||||
BT_ERR("%s audio block is too short", data->hdev->name);
|
||||
return -EILSEQ;
|
||||
}
|
||||
break;
|
||||
@ -324,27 +323,27 @@ static inline int bfusb_recv_block(struct bfusb *bfusb, int hdr, unsigned char *
|
||||
|
||||
skb = bt_skb_alloc(pkt_len, GFP_ATOMIC);
|
||||
if (!skb) {
|
||||
BT_ERR("%s no memory for the packet", bfusb->hdev->name);
|
||||
BT_ERR("%s no memory for the packet", data->hdev->name);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
skb->dev = (void *) bfusb->hdev;
|
||||
skb->dev = (void *) data->hdev;
|
||||
bt_cb(skb)->pkt_type = pkt_type;
|
||||
|
||||
bfusb->reassembly = skb;
|
||||
data->reassembly = skb;
|
||||
} else {
|
||||
if (!bfusb->reassembly) {
|
||||
BT_ERR("%s unexpected continuation block", bfusb->hdev->name);
|
||||
if (!data->reassembly) {
|
||||
BT_ERR("%s unexpected continuation block", data->hdev->name);
|
||||
return -EIO;
|
||||
}
|
||||
}
|
||||
|
||||
if (len > 0)
|
||||
memcpy(skb_put(bfusb->reassembly, len), data, len);
|
||||
memcpy(skb_put(data->reassembly, len), buf, len);
|
||||
|
||||
if (hdr & 0x08) {
|
||||
hci_recv_frame(bfusb->reassembly);
|
||||
bfusb->reassembly = NULL;
|
||||
hci_recv_frame(data->reassembly);
|
||||
data->reassembly = NULL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -353,22 +352,22 @@ static inline int bfusb_recv_block(struct bfusb *bfusb, int hdr, unsigned char *
|
||||
static void bfusb_rx_complete(struct urb *urb, struct pt_regs *regs)
|
||||
{
|
||||
struct sk_buff *skb = (struct sk_buff *) urb->context;
|
||||
struct bfusb *bfusb = (struct bfusb *) skb->dev;
|
||||
struct bfusb_data *data = (struct bfusb_data *) skb->dev;
|
||||
unsigned char *buf = urb->transfer_buffer;
|
||||
int count = urb->actual_length;
|
||||
int err, hdr, len;
|
||||
|
||||
BT_DBG("bfusb %p urb %p skb %p len %d", bfusb, urb, skb, skb->len);
|
||||
|
||||
read_lock(&bfusb->lock);
|
||||
read_lock(&data->lock);
|
||||
|
||||
if (!test_bit(HCI_RUNNING, &bfusb->hdev->flags))
|
||||
if (!test_bit(HCI_RUNNING, &data->hdev->flags))
|
||||
goto unlock;
|
||||
|
||||
if (urb->status || !count)
|
||||
goto resubmit;
|
||||
|
||||
bfusb->hdev->stat.byte_rx += count;
|
||||
data->hdev->stat.byte_rx += count;
|
||||
|
||||
skb_put(skb, count);
|
||||
|
||||
@ -387,90 +386,89 @@ static void bfusb_rx_complete(struct urb *urb, struct pt_regs *regs)
|
||||
|
||||
if (count < len) {
|
||||
BT_ERR("%s block extends over URB buffer ranges",
|
||||
bfusb->hdev->name);
|
||||
data->hdev->name);
|
||||
}
|
||||
|
||||
if ((hdr & 0xe1) == 0xc1)
|
||||
bfusb_recv_block(bfusb, hdr, buf, len);
|
||||
bfusb_recv_block(data, hdr, buf, len);
|
||||
|
||||
count -= len;
|
||||
buf += len;
|
||||
}
|
||||
|
||||
skb_unlink(skb, &bfusb->pending_q);
|
||||
skb_unlink(skb, &data->pending_q);
|
||||
kfree_skb(skb);
|
||||
|
||||
bfusb_rx_submit(bfusb, urb);
|
||||
bfusb_rx_submit(data, urb);
|
||||
|
||||
read_unlock(&bfusb->lock);
|
||||
read_unlock(&data->lock);
|
||||
|
||||
return;
|
||||
|
||||
resubmit:
|
||||
urb->dev = bfusb->udev;
|
||||
urb->dev = data->udev;
|
||||
|
||||
err = usb_submit_urb(urb, GFP_ATOMIC);
|
||||
if (err) {
|
||||
BT_ERR("%s bulk resubmit failed urb %p err %d",
|
||||
bfusb->hdev->name, urb, err);
|
||||
data->hdev->name, urb, err);
|
||||
}
|
||||
|
||||
unlock:
|
||||
read_unlock(&bfusb->lock);
|
||||
read_unlock(&data->lock);
|
||||
}
|
||||
|
||||
|
||||
static int bfusb_open(struct hci_dev *hdev)
|
||||
{
|
||||
struct bfusb *bfusb = (struct bfusb *) hdev->driver_data;
|
||||
struct bfusb_data *data = hdev->driver_data;
|
||||
unsigned long flags;
|
||||
int i, err;
|
||||
|
||||
BT_DBG("hdev %p bfusb %p", hdev, bfusb);
|
||||
BT_DBG("hdev %p bfusb %p", hdev, data);
|
||||
|
||||
if (test_and_set_bit(HCI_RUNNING, &hdev->flags))
|
||||
return 0;
|
||||
|
||||
write_lock_irqsave(&bfusb->lock, flags);
|
||||
write_lock_irqsave(&data->lock, flags);
|
||||
|
||||
err = bfusb_rx_submit(bfusb, NULL);
|
||||
err = bfusb_rx_submit(data, NULL);
|
||||
if (!err) {
|
||||
for (i = 1; i < BFUSB_MAX_BULK_RX; i++)
|
||||
bfusb_rx_submit(bfusb, NULL);
|
||||
bfusb_rx_submit(data, NULL);
|
||||
} else {
|
||||
clear_bit(HCI_RUNNING, &hdev->flags);
|
||||
}
|
||||
|
||||
write_unlock_irqrestore(&bfusb->lock, flags);
|
||||
write_unlock_irqrestore(&data->lock, flags);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static int bfusb_flush(struct hci_dev *hdev)
|
||||
{
|
||||
struct bfusb *bfusb = (struct bfusb *) hdev->driver_data;
|
||||
struct bfusb_data *data = hdev->driver_data;
|
||||
|
||||
BT_DBG("hdev %p bfusb %p", hdev, bfusb);
|
||||
BT_DBG("hdev %p bfusb %p", hdev, data);
|
||||
|
||||
skb_queue_purge(&bfusb->transmit_q);
|
||||
skb_queue_purge(&data->transmit_q);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int bfusb_close(struct hci_dev *hdev)
|
||||
{
|
||||
struct bfusb *bfusb = (struct bfusb *) hdev->driver_data;
|
||||
struct bfusb_data *data = hdev->driver_data;
|
||||
unsigned long flags;
|
||||
|
||||
BT_DBG("hdev %p bfusb %p", hdev, bfusb);
|
||||
BT_DBG("hdev %p bfusb %p", hdev, data);
|
||||
|
||||
if (!test_and_clear_bit(HCI_RUNNING, &hdev->flags))
|
||||
return 0;
|
||||
|
||||
write_lock_irqsave(&bfusb->lock, flags);
|
||||
write_unlock_irqrestore(&bfusb->lock, flags);
|
||||
write_lock_irqsave(&data->lock, flags);
|
||||
write_unlock_irqrestore(&data->lock, flags);
|
||||
|
||||
bfusb_unlink_urbs(bfusb);
|
||||
bfusb_unlink_urbs(data);
|
||||
bfusb_flush(hdev);
|
||||
|
||||
return 0;
|
||||
@ -479,7 +477,7 @@ static int bfusb_close(struct hci_dev *hdev)
|
||||
static int bfusb_send_frame(struct sk_buff *skb)
|
||||
{
|
||||
struct hci_dev *hdev = (struct hci_dev *) skb->dev;
|
||||
struct bfusb *bfusb;
|
||||
struct bfusb_data *data;
|
||||
struct sk_buff *nskb;
|
||||
unsigned char buf[3];
|
||||
int sent = 0, size, count;
|
||||
@ -494,7 +492,7 @@ static int bfusb_send_frame(struct sk_buff *skb)
|
||||
if (!test_bit(HCI_RUNNING, &hdev->flags))
|
||||
return -EBUSY;
|
||||
|
||||
bfusb = (struct bfusb *) hdev->driver_data;
|
||||
data = hdev->driver_data;
|
||||
|
||||
switch (bt_cb(skb)->pkt_type) {
|
||||
case HCI_COMMAND_PKT:
|
||||
@ -514,12 +512,13 @@ static int bfusb_send_frame(struct sk_buff *skb)
|
||||
count = skb->len;
|
||||
|
||||
/* Max HCI frame size seems to be 1511 + 1 */
|
||||
if (!(nskb = bt_skb_alloc(count + 32, GFP_ATOMIC))) {
|
||||
nskb = bt_skb_alloc(count + 32, GFP_ATOMIC);
|
||||
if (!nskb) {
|
||||
BT_ERR("Can't allocate memory for new packet");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
nskb->dev = (void *) bfusb;
|
||||
nskb->dev = (void *) data;
|
||||
|
||||
while (count) {
|
||||
size = min_t(uint, count, BFUSB_MAX_BLOCK_SIZE);
|
||||
@ -536,18 +535,18 @@ static int bfusb_send_frame(struct sk_buff *skb)
|
||||
}
|
||||
|
||||
/* Don't send frame with multiple size of bulk max packet */
|
||||
if ((nskb->len % bfusb->bulk_pkt_size) == 0) {
|
||||
if ((nskb->len % data->bulk_pkt_size) == 0) {
|
||||
buf[0] = 0xdd;
|
||||
buf[1] = 0x00;
|
||||
memcpy(skb_put(nskb, 2), buf, 2);
|
||||
}
|
||||
|
||||
read_lock(&bfusb->lock);
|
||||
read_lock(&data->lock);
|
||||
|
||||
skb_queue_tail(&bfusb->transmit_q, nskb);
|
||||
bfusb_tx_wakeup(bfusb);
|
||||
skb_queue_tail(&data->transmit_q, nskb);
|
||||
bfusb_tx_wakeup(data);
|
||||
|
||||
read_unlock(&bfusb->lock);
|
||||
read_unlock(&data->lock);
|
||||
|
||||
kfree_skb(skb);
|
||||
|
||||
@ -556,11 +555,11 @@ static int bfusb_send_frame(struct sk_buff *skb)
|
||||
|
||||
static void bfusb_destruct(struct hci_dev *hdev)
|
||||
{
|
||||
struct bfusb *bfusb = (struct bfusb *) hdev->driver_data;
|
||||
struct bfusb_data *data = hdev->driver_data;
|
||||
|
||||
BT_DBG("hdev %p bfusb %p", hdev, bfusb);
|
||||
BT_DBG("hdev %p bfusb %p", hdev, data);
|
||||
|
||||
kfree(bfusb);
|
||||
kfree(data);
|
||||
}
|
||||
|
||||
static int bfusb_ioctl(struct hci_dev *hdev, unsigned int cmd, unsigned long arg)
|
||||
@ -568,25 +567,24 @@ static int bfusb_ioctl(struct hci_dev *hdev, unsigned int cmd, unsigned long arg
|
||||
return -ENOIOCTLCMD;
|
||||
}
|
||||
|
||||
|
||||
static int bfusb_load_firmware(struct bfusb *bfusb, unsigned char *firmware, int count)
|
||||
static int bfusb_load_firmware(struct bfusb_data *data, unsigned char *firmware, int count)
|
||||
{
|
||||
unsigned char *buf;
|
||||
int err, pipe, len, size, sent = 0;
|
||||
|
||||
BT_DBG("bfusb %p udev %p", bfusb, bfusb->udev);
|
||||
BT_DBG("bfusb %p udev %p", data, data->udev);
|
||||
|
||||
BT_INFO("BlueFRITZ! USB loading firmware");
|
||||
|
||||
pipe = usb_sndctrlpipe(bfusb->udev, 0);
|
||||
pipe = usb_sndctrlpipe(data->udev, 0);
|
||||
|
||||
if (usb_control_msg(bfusb->udev, pipe, USB_REQ_SET_CONFIGURATION,
|
||||
if (usb_control_msg(data->udev, pipe, USB_REQ_SET_CONFIGURATION,
|
||||
0, 1, 0, NULL, 0, USB_CTRL_SET_TIMEOUT) < 0) {
|
||||
BT_ERR("Can't change to loading configuration");
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
bfusb->udev->toggle[0] = bfusb->udev->toggle[1] = 0;
|
||||
data->udev->toggle[0] = data->udev->toggle[1] = 0;
|
||||
|
||||
buf = kmalloc(BFUSB_MAX_BLOCK_SIZE + 3, GFP_ATOMIC);
|
||||
if (!buf) {
|
||||
@ -594,14 +592,14 @@ static int bfusb_load_firmware(struct bfusb *bfusb, unsigned char *firmware, int
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
pipe = usb_sndbulkpipe(bfusb->udev, bfusb->bulk_out_ep);
|
||||
pipe = usb_sndbulkpipe(data->udev, data->bulk_out_ep);
|
||||
|
||||
while (count) {
|
||||
size = min_t(uint, count, BFUSB_MAX_BLOCK_SIZE + 3);
|
||||
|
||||
memcpy(buf, firmware + sent, size);
|
||||
|
||||
err = usb_bulk_msg(bfusb->udev, pipe, buf, size,
|
||||
err = usb_bulk_msg(data->udev, pipe, buf, size,
|
||||
&len, BFUSB_BLOCK_TIMEOUT);
|
||||
|
||||
if (err || (len != size)) {
|
||||
@ -613,21 +611,23 @@ static int bfusb_load_firmware(struct bfusb *bfusb, unsigned char *firmware, int
|
||||
count -= size;
|
||||
}
|
||||
|
||||
if ((err = usb_bulk_msg(bfusb->udev, pipe, NULL, 0,
|
||||
&len, BFUSB_BLOCK_TIMEOUT)) < 0) {
|
||||
err = usb_bulk_msg(data->udev, pipe, NULL, 0,
|
||||
&len, BFUSB_BLOCK_TIMEOUT);
|
||||
if (err < 0) {
|
||||
BT_ERR("Error in null packet request");
|
||||
goto error;
|
||||
}
|
||||
|
||||
pipe = usb_sndctrlpipe(bfusb->udev, 0);
|
||||
pipe = usb_sndctrlpipe(data->udev, 0);
|
||||
|
||||
if ((err = usb_control_msg(bfusb->udev, pipe, USB_REQ_SET_CONFIGURATION,
|
||||
0, 2, 0, NULL, 0, USB_CTRL_SET_TIMEOUT)) < 0) {
|
||||
err = usb_control_msg(data->udev, pipe, USB_REQ_SET_CONFIGURATION,
|
||||
0, 2, 0, NULL, 0, USB_CTRL_SET_TIMEOUT);
|
||||
if (err < 0) {
|
||||
BT_ERR("Can't change to running configuration");
|
||||
goto error;
|
||||
}
|
||||
|
||||
bfusb->udev->toggle[0] = bfusb->udev->toggle[1] = 0;
|
||||
data->udev->toggle[0] = data->udev->toggle[1] = 0;
|
||||
|
||||
BT_INFO("BlueFRITZ! USB device ready");
|
||||
|
||||
@ -637,9 +637,9 @@ static int bfusb_load_firmware(struct bfusb *bfusb, unsigned char *firmware, int
|
||||
error:
|
||||
kfree(buf);
|
||||
|
||||
pipe = usb_sndctrlpipe(bfusb->udev, 0);
|
||||
pipe = usb_sndctrlpipe(data->udev, 0);
|
||||
|
||||
usb_control_msg(bfusb->udev, pipe, USB_REQ_SET_CONFIGURATION,
|
||||
usb_control_msg(data->udev, pipe, USB_REQ_SET_CONFIGURATION,
|
||||
0, 0, 0, NULL, 0, USB_CTRL_SET_TIMEOUT);
|
||||
|
||||
return err;
|
||||
@ -652,7 +652,7 @@ static int bfusb_probe(struct usb_interface *intf, const struct usb_device_id *i
|
||||
struct usb_host_endpoint *bulk_out_ep;
|
||||
struct usb_host_endpoint *bulk_in_ep;
|
||||
struct hci_dev *hdev;
|
||||
struct bfusb *bfusb;
|
||||
struct bfusb_data *data;
|
||||
|
||||
BT_DBG("intf %p id %p", intf, id);
|
||||
|
||||
@ -672,23 +672,24 @@ static int bfusb_probe(struct usb_interface *intf, const struct usb_device_id *i
|
||||
}
|
||||
|
||||
/* Initialize control structure and load firmware */
|
||||
if (!(bfusb = kzalloc(sizeof(struct bfusb), GFP_KERNEL))) {
|
||||
data = kzalloc(sizeof(struct bfusb_data), GFP_KERNEL);
|
||||
if (!data) {
|
||||
BT_ERR("Can't allocate memory for control structure");
|
||||
goto done;
|
||||
}
|
||||
|
||||
bfusb->udev = udev;
|
||||
bfusb->bulk_in_ep = bulk_in_ep->desc.bEndpointAddress;
|
||||
bfusb->bulk_out_ep = bulk_out_ep->desc.bEndpointAddress;
|
||||
bfusb->bulk_pkt_size = le16_to_cpu(bulk_out_ep->desc.wMaxPacketSize);
|
||||
data->udev = udev;
|
||||
data->bulk_in_ep = bulk_in_ep->desc.bEndpointAddress;
|
||||
data->bulk_out_ep = bulk_out_ep->desc.bEndpointAddress;
|
||||
data->bulk_pkt_size = le16_to_cpu(bulk_out_ep->desc.wMaxPacketSize);
|
||||
|
||||
rwlock_init(&bfusb->lock);
|
||||
rwlock_init(&data->lock);
|
||||
|
||||
bfusb->reassembly = NULL;
|
||||
data->reassembly = NULL;
|
||||
|
||||
skb_queue_head_init(&bfusb->transmit_q);
|
||||
skb_queue_head_init(&bfusb->pending_q);
|
||||
skb_queue_head_init(&bfusb->completed_q);
|
||||
skb_queue_head_init(&data->transmit_q);
|
||||
skb_queue_head_init(&data->pending_q);
|
||||
skb_queue_head_init(&data->completed_q);
|
||||
|
||||
if (request_firmware(&firmware, "bfubase.frm", &udev->dev) < 0) {
|
||||
BT_ERR("Firmware request failed");
|
||||
@ -697,7 +698,7 @@ static int bfusb_probe(struct usb_interface *intf, const struct usb_device_id *i
|
||||
|
||||
BT_DBG("firmware data %p size %d", firmware->data, firmware->size);
|
||||
|
||||
if (bfusb_load_firmware(bfusb, firmware->data, firmware->size) < 0) {
|
||||
if (bfusb_load_firmware(data, firmware->data, firmware->size) < 0) {
|
||||
BT_ERR("Firmware loading failed");
|
||||
goto release;
|
||||
}
|
||||
@ -711,10 +712,10 @@ static int bfusb_probe(struct usb_interface *intf, const struct usb_device_id *i
|
||||
goto error;
|
||||
}
|
||||
|
||||
bfusb->hdev = hdev;
|
||||
data->hdev = hdev;
|
||||
|
||||
hdev->type = HCI_USB;
|
||||
hdev->driver_data = bfusb;
|
||||
hdev->driver_data = data;
|
||||
SET_HCIDEV_DEV(hdev, &intf->dev);
|
||||
|
||||
hdev->open = bfusb_open;
|
||||
@ -732,7 +733,7 @@ static int bfusb_probe(struct usb_interface *intf, const struct usb_device_id *i
|
||||
goto error;
|
||||
}
|
||||
|
||||
usb_set_intfdata(intf, bfusb);
|
||||
usb_set_intfdata(intf, data);
|
||||
|
||||
return 0;
|
||||
|
||||
@ -740,7 +741,7 @@ static int bfusb_probe(struct usb_interface *intf, const struct usb_device_id *i
|
||||
release_firmware(firmware);
|
||||
|
||||
error:
|
||||
kfree(bfusb);
|
||||
kfree(data);
|
||||
|
||||
done:
|
||||
return -EIO;
|
||||
@ -748,8 +749,8 @@ static int bfusb_probe(struct usb_interface *intf, const struct usb_device_id *i
|
||||
|
||||
static void bfusb_disconnect(struct usb_interface *intf)
|
||||
{
|
||||
struct bfusb *bfusb = usb_get_intfdata(intf);
|
||||
struct hci_dev *hdev = bfusb->hdev;
|
||||
struct bfusb_data *data = usb_get_intfdata(intf);
|
||||
struct hci_dev *hdev = data->hdev;
|
||||
|
||||
BT_DBG("intf %p", intf);
|
||||
|
||||
@ -779,7 +780,8 @@ static int __init bfusb_init(void)
|
||||
|
||||
BT_INFO("BlueFRITZ! USB driver ver %s", VERSION);
|
||||
|
||||
if ((err = usb_register(&bfusb_driver)) < 0)
|
||||
err = usb_register(&bfusb_driver);
|
||||
if (err < 0)
|
||||
BT_ERR("Failed to register BlueFRITZ! USB driver");
|
||||
|
||||
return err;
|
||||
|
@ -241,15 +241,11 @@ static int hci_uart_send_frame(struct sk_buff *skb)
|
||||
|
||||
static void hci_uart_destruct(struct hci_dev *hdev)
|
||||
{
|
||||
struct hci_uart *hu;
|
||||
|
||||
if (!hdev)
|
||||
return;
|
||||
|
||||
BT_DBG("%s", hdev->name);
|
||||
|
||||
hu = (struct hci_uart *) hdev->driver_data;
|
||||
kfree(hu);
|
||||
kfree(hdev->driver_data);
|
||||
}
|
||||
|
||||
/* ------ LDISC part ------ */
|
||||
@ -272,7 +268,7 @@ static int hci_uart_tty_open(struct tty_struct *tty)
|
||||
return -EEXIST;
|
||||
|
||||
if (!(hu = kzalloc(sizeof(struct hci_uart), GFP_KERNEL))) {
|
||||
BT_ERR("Can't allocate controll structure");
|
||||
BT_ERR("Can't allocate control structure");
|
||||
return -ENFILE;
|
||||
}
|
||||
|
||||
@ -360,7 +356,7 @@ static void hci_uart_tty_wakeup(struct tty_struct *tty)
|
||||
*
|
||||
* Return Value: None
|
||||
*/
|
||||
static void hci_uart_tty_receive(struct tty_struct *tty, const __u8 *data, char *flags, int count)
|
||||
static void hci_uart_tty_receive(struct tty_struct *tty, const u8 *data, char *flags, int count)
|
||||
{
|
||||
struct hci_uart *hu = (void *)tty->disc_data;
|
||||
|
||||
@ -375,7 +371,8 @@ static void hci_uart_tty_receive(struct tty_struct *tty, const __u8 *data, char
|
||||
hu->hdev->stat.byte_rx += count;
|
||||
spin_unlock(&hu->rx_lock);
|
||||
|
||||
if (test_and_clear_bit(TTY_THROTTLED,&tty->flags) && tty->driver->unthrottle)
|
||||
if (test_and_clear_bit(TTY_THROTTLED, &tty->flags) &&
|
||||
tty->driver->unthrottle)
|
||||
tty->driver->unthrottle(tty);
|
||||
}
|
||||
|
||||
|
@ -96,6 +96,9 @@ static struct usb_device_id bluetooth_ids[] = {
|
||||
/* Ericsson with non-standard id */
|
||||
{ USB_DEVICE(0x0bdb, 0x1002) },
|
||||
|
||||
/* Canyon CN-BTU1 with HID interfaces */
|
||||
{ USB_DEVICE(0x0c10, 0x0000), .driver_info = HCI_RESET },
|
||||
|
||||
{ } /* Terminating entry */
|
||||
};
|
||||
|
||||
|
@ -2,9 +2,9 @@
|
||||
*
|
||||
* Bluetooth virtual HCI driver
|
||||
*
|
||||
* Copyright (C) 2000-2001 Qualcomm Incorporated
|
||||
* Copyright (C) 2002-2003 Maxim Krasnyansky <maxk@qualcomm.com>
|
||||
* Copyright (C) 2004-2005 Marcel Holtmann <marcel@holtmann.org>
|
||||
* Copyright (C) 2000-2001 Qualcomm Incorporated
|
||||
* Copyright (C) 2002-2003 Maxim Krasnyansky <maxk@qualcomm.com>
|
||||
* Copyright (C) 2004-2006 Marcel Holtmann <marcel@holtmann.org>
|
||||
*
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
@ -72,21 +72,21 @@ static int vhci_open_dev(struct hci_dev *hdev)
|
||||
|
||||
static int vhci_close_dev(struct hci_dev *hdev)
|
||||
{
|
||||
struct vhci_data *vhci = hdev->driver_data;
|
||||
struct vhci_data *data = hdev->driver_data;
|
||||
|
||||
if (!test_and_clear_bit(HCI_RUNNING, &hdev->flags))
|
||||
return 0;
|
||||
|
||||
skb_queue_purge(&vhci->readq);
|
||||
skb_queue_purge(&data->readq);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int vhci_flush(struct hci_dev *hdev)
|
||||
{
|
||||
struct vhci_data *vhci = hdev->driver_data;
|
||||
struct vhci_data *data = hdev->driver_data;
|
||||
|
||||
skb_queue_purge(&vhci->readq);
|
||||
skb_queue_purge(&data->readq);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -94,7 +94,7 @@ static int vhci_flush(struct hci_dev *hdev)
|
||||
static int vhci_send_frame(struct sk_buff *skb)
|
||||
{
|
||||
struct hci_dev* hdev = (struct hci_dev *) skb->dev;
|
||||
struct vhci_data *vhci;
|
||||
struct vhci_data *data;
|
||||
|
||||
if (!hdev) {
|
||||
BT_ERR("Frame for unknown HCI device (hdev=NULL)");
|
||||
@ -104,15 +104,15 @@ static int vhci_send_frame(struct sk_buff *skb)
|
||||
if (!test_bit(HCI_RUNNING, &hdev->flags))
|
||||
return -EBUSY;
|
||||
|
||||
vhci = hdev->driver_data;
|
||||
data = hdev->driver_data;
|
||||
|
||||
memcpy(skb_push(skb, 1), &bt_cb(skb)->pkt_type, 1);
|
||||
skb_queue_tail(&vhci->readq, skb);
|
||||
skb_queue_tail(&data->readq, skb);
|
||||
|
||||
if (vhci->flags & VHCI_FASYNC)
|
||||
kill_fasync(&vhci->fasync, SIGIO, POLL_IN);
|
||||
if (data->flags & VHCI_FASYNC)
|
||||
kill_fasync(&data->fasync, SIGIO, POLL_IN);
|
||||
|
||||
wake_up_interruptible(&vhci->read_wait);
|
||||
wake_up_interruptible(&data->read_wait);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -122,7 +122,7 @@ static void vhci_destruct(struct hci_dev *hdev)
|
||||
kfree(hdev->driver_data);
|
||||
}
|
||||
|
||||
static inline ssize_t vhci_get_user(struct vhci_data *vhci,
|
||||
static inline ssize_t vhci_get_user(struct vhci_data *data,
|
||||
const char __user *buf, size_t count)
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
@ -139,7 +139,7 @@ static inline ssize_t vhci_get_user(struct vhci_data *vhci,
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
skb->dev = (void *) vhci->hdev;
|
||||
skb->dev = (void *) data->hdev;
|
||||
bt_cb(skb)->pkt_type = *((__u8 *) skb->data);
|
||||
skb_pull(skb, 1);
|
||||
|
||||
@ -148,7 +148,7 @@ static inline ssize_t vhci_get_user(struct vhci_data *vhci,
|
||||
return count;
|
||||
}
|
||||
|
||||
static inline ssize_t vhci_put_user(struct vhci_data *vhci,
|
||||
static inline ssize_t vhci_put_user(struct vhci_data *data,
|
||||
struct sk_buff *skb, char __user *buf, int count)
|
||||
{
|
||||
char __user *ptr = buf;
|
||||
@ -161,42 +161,43 @@ static inline ssize_t vhci_put_user(struct vhci_data *vhci,
|
||||
|
||||
total += len;
|
||||
|
||||
vhci->hdev->stat.byte_tx += len;
|
||||
data->hdev->stat.byte_tx += len;
|
||||
|
||||
switch (bt_cb(skb)->pkt_type) {
|
||||
case HCI_COMMAND_PKT:
|
||||
vhci->hdev->stat.cmd_tx++;
|
||||
data->hdev->stat.cmd_tx++;
|
||||
break;
|
||||
|
||||
case HCI_ACLDATA_PKT:
|
||||
vhci->hdev->stat.acl_tx++;
|
||||
data->hdev->stat.acl_tx++;
|
||||
break;
|
||||
|
||||
case HCI_SCODATA_PKT:
|
||||
vhci->hdev->stat.cmd_tx++;
|
||||
data->hdev->stat.cmd_tx++;
|
||||
break;
|
||||
};
|
||||
|
||||
return total;
|
||||
}
|
||||
|
||||
static loff_t vhci_llseek(struct file * file, loff_t offset, int origin)
|
||||
static loff_t vhci_llseek(struct file *file, loff_t offset, int origin)
|
||||
{
|
||||
return -ESPIPE;
|
||||
}
|
||||
|
||||
static ssize_t vhci_read(struct file * file, char __user * buf, size_t count, loff_t *pos)
|
||||
static ssize_t vhci_read(struct file *file,
|
||||
char __user *buf, size_t count, loff_t *pos)
|
||||
{
|
||||
DECLARE_WAITQUEUE(wait, current);
|
||||
struct vhci_data *vhci = file->private_data;
|
||||
struct vhci_data *data = file->private_data;
|
||||
struct sk_buff *skb;
|
||||
ssize_t ret = 0;
|
||||
|
||||
add_wait_queue(&vhci->read_wait, &wait);
|
||||
add_wait_queue(&data->read_wait, &wait);
|
||||
while (count) {
|
||||
set_current_state(TASK_INTERRUPTIBLE);
|
||||
|
||||
skb = skb_dequeue(&vhci->readq);
|
||||
skb = skb_dequeue(&data->readq);
|
||||
if (!skb) {
|
||||
if (file->f_flags & O_NONBLOCK) {
|
||||
ret = -EAGAIN;
|
||||
@ -213,7 +214,7 @@ static ssize_t vhci_read(struct file * file, char __user * buf, size_t count, lo
|
||||
}
|
||||
|
||||
if (access_ok(VERIFY_WRITE, buf, count))
|
||||
ret = vhci_put_user(vhci, skb, buf, count);
|
||||
ret = vhci_put_user(data, skb, buf, count);
|
||||
else
|
||||
ret = -EFAULT;
|
||||
|
||||
@ -221,7 +222,7 @@ static ssize_t vhci_read(struct file * file, char __user * buf, size_t count, lo
|
||||
break;
|
||||
}
|
||||
set_current_state(TASK_RUNNING);
|
||||
remove_wait_queue(&vhci->read_wait, &wait);
|
||||
remove_wait_queue(&data->read_wait, &wait);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -229,21 +230,21 @@ static ssize_t vhci_read(struct file * file, char __user * buf, size_t count, lo
|
||||
static ssize_t vhci_write(struct file *file,
|
||||
const char __user *buf, size_t count, loff_t *pos)
|
||||
{
|
||||
struct vhci_data *vhci = file->private_data;
|
||||
struct vhci_data *data = file->private_data;
|
||||
|
||||
if (!access_ok(VERIFY_READ, buf, count))
|
||||
return -EFAULT;
|
||||
|
||||
return vhci_get_user(vhci, buf, count);
|
||||
return vhci_get_user(data, buf, count);
|
||||
}
|
||||
|
||||
static unsigned int vhci_poll(struct file *file, poll_table *wait)
|
||||
{
|
||||
struct vhci_data *vhci = file->private_data;
|
||||
struct vhci_data *data = file->private_data;
|
||||
|
||||
poll_wait(file, &vhci->read_wait, wait);
|
||||
poll_wait(file, &data->read_wait, wait);
|
||||
|
||||
if (!skb_queue_empty(&vhci->readq))
|
||||
if (!skb_queue_empty(&data->readq))
|
||||
return POLLIN | POLLRDNORM;
|
||||
|
||||
return POLLOUT | POLLWRNORM;
|
||||
@ -257,26 +258,26 @@ static int vhci_ioctl(struct inode *inode, struct file *file,
|
||||
|
||||
static int vhci_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct vhci_data *vhci;
|
||||
struct vhci_data *data;
|
||||
struct hci_dev *hdev;
|
||||
|
||||
vhci = kzalloc(sizeof(struct vhci_data), GFP_KERNEL);
|
||||
if (!vhci)
|
||||
data = kzalloc(sizeof(struct vhci_data), GFP_KERNEL);
|
||||
if (!data)
|
||||
return -ENOMEM;
|
||||
|
||||
skb_queue_head_init(&vhci->readq);
|
||||
init_waitqueue_head(&vhci->read_wait);
|
||||
skb_queue_head_init(&data->readq);
|
||||
init_waitqueue_head(&data->read_wait);
|
||||
|
||||
hdev = hci_alloc_dev();
|
||||
if (!hdev) {
|
||||
kfree(vhci);
|
||||
kfree(data);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
vhci->hdev = hdev;
|
||||
data->hdev = hdev;
|
||||
|
||||
hdev->type = HCI_VHCI;
|
||||
hdev->driver_data = vhci;
|
||||
hdev->type = HCI_VIRTUAL;
|
||||
hdev->driver_data = data;
|
||||
|
||||
hdev->open = vhci_open_dev;
|
||||
hdev->close = vhci_close_dev;
|
||||
@ -288,20 +289,20 @@ static int vhci_open(struct inode *inode, struct file *file)
|
||||
|
||||
if (hci_register_dev(hdev) < 0) {
|
||||
BT_ERR("Can't register HCI device");
|
||||
kfree(vhci);
|
||||
kfree(data);
|
||||
hci_free_dev(hdev);
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
file->private_data = vhci;
|
||||
file->private_data = data;
|
||||
|
||||
return nonseekable_open(inode, file);
|
||||
}
|
||||
|
||||
static int vhci_release(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct vhci_data *vhci = file->private_data;
|
||||
struct hci_dev *hdev = vhci->hdev;
|
||||
struct vhci_data *data = file->private_data;
|
||||
struct hci_dev *hdev = data->hdev;
|
||||
|
||||
if (hci_unregister_dev(hdev) < 0) {
|
||||
BT_ERR("Can't unregister HCI device %s", hdev->name);
|
||||
@ -316,17 +317,17 @@ static int vhci_release(struct inode *inode, struct file *file)
|
||||
|
||||
static int vhci_fasync(int fd, struct file *file, int on)
|
||||
{
|
||||
struct vhci_data *vhci = file->private_data;
|
||||
struct vhci_data *data = file->private_data;
|
||||
int err;
|
||||
|
||||
err = fasync_helper(fd, file, on, &vhci->fasync);
|
||||
err = fasync_helper(fd, file, on, &data->fasync);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
if (on)
|
||||
vhci->flags |= VHCI_FASYNC;
|
||||
data->flags |= VHCI_FASYNC;
|
||||
else
|
||||
vhci->flags &= ~VHCI_FASYNC;
|
||||
data->flags &= ~VHCI_FASYNC;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -86,7 +86,7 @@ EXPORT_SYMBOL(rdma_copy_addr);
|
||||
int rdma_translate_ip(struct sockaddr *addr, struct rdma_dev_addr *dev_addr)
|
||||
{
|
||||
struct net_device *dev;
|
||||
u32 ip = ((struct sockaddr_in *) addr)->sin_addr.s_addr;
|
||||
__be32 ip = ((struct sockaddr_in *) addr)->sin_addr.s_addr;
|
||||
int ret;
|
||||
|
||||
dev = ip_dev_find(ip);
|
||||
@ -239,7 +239,7 @@ static int addr_resolve_local(struct sockaddr_in *src_in,
|
||||
{
|
||||
struct net_device *dev;
|
||||
u32 src_ip = src_in->sin_addr.s_addr;
|
||||
u32 dst_ip = dst_in->sin_addr.s_addr;
|
||||
__be32 dst_ip = dst_in->sin_addr.s_addr;
|
||||
int ret;
|
||||
|
||||
dev = ip_dev_find(dst_ip);
|
||||
|
@ -1614,8 +1614,8 @@ isdn_net_ciscohdlck_slarp_send_reply(isdn_net_local *lp)
|
||||
struct sk_buff *skb;
|
||||
unsigned char *p;
|
||||
struct in_device *in_dev = NULL;
|
||||
u32 addr = 0; /* local ipv4 address */
|
||||
u32 mask = 0; /* local netmask */
|
||||
__be32 addr = 0; /* local ipv4 address */
|
||||
__be32 mask = 0; /* local netmask */
|
||||
|
||||
if ((in_dev = lp->netdev->dev.ip_ptr) != NULL) {
|
||||
/* take primary(first) address of interface */
|
||||
|
@ -24,6 +24,9 @@ config NETDEVICES
|
||||
|
||||
If unsure, say Y.
|
||||
|
||||
# All the following symbols are dependent on NETDEVICES - do not repeat
|
||||
# that for each of the symbols.
|
||||
if NETDEVICES
|
||||
|
||||
config IFB
|
||||
tristate "Intermediate Functional Block support"
|
||||
@ -2852,6 +2855,8 @@ config NETCONSOLE
|
||||
If you want to log kernel messages over the network, enable this.
|
||||
See <file:Documentation/networking/netconsole.txt> for details.
|
||||
|
||||
endif #NETDEVICES
|
||||
|
||||
config NETPOLL
|
||||
def_bool NETCONSOLE
|
||||
|
||||
|
@ -145,9 +145,7 @@ static int ipddp_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
|
||||
/* Create the Extended DDP header */
|
||||
ddp = (struct ddpehdr *)skb->data;
|
||||
ddp->deh_len = skb->len;
|
||||
ddp->deh_hops = 1;
|
||||
ddp->deh_pad = 0;
|
||||
ddp->deh_len_hops = htons(skb->len + (1<<10));
|
||||
ddp->deh_sum = 0;
|
||||
|
||||
/*
|
||||
@ -170,7 +168,6 @@ static int ipddp_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
ddp->deh_sport = 72;
|
||||
|
||||
*((__u8 *)(ddp+1)) = 22; /* ddp type = IP */
|
||||
*((__u16 *)ddp)=ntohs(*((__u16 *)ddp)); /* fix up length field */
|
||||
|
||||
skb->protocol = htons(ETH_P_ATALK); /* Protocol has changed */
|
||||
|
||||
|
@ -2252,7 +2252,7 @@ static u32 bond_glean_dev_ip(struct net_device *dev)
|
||||
{
|
||||
struct in_device *idev;
|
||||
struct in_ifaddr *ifa;
|
||||
u32 addr = 0;
|
||||
__be32 addr = 0;
|
||||
|
||||
if (!dev)
|
||||
return 0;
|
||||
|
@ -287,6 +287,7 @@ comment "FIR device drivers"
|
||||
config USB_IRDA
|
||||
tristate "IrDA USB dongles"
|
||||
depends on IRDA && USB
|
||||
select FW_LOADER
|
||||
---help---
|
||||
Say Y here if you want to build support for the USB IrDA FIR Dongle
|
||||
device driver. To compile it as a module, choose M here: the module
|
||||
|
@ -110,7 +110,7 @@ static nsc_chip_t chips[] = {
|
||||
{ "PC87338", { 0x398, 0x15c, 0x2e }, 0x08, 0xb0, 0xf8,
|
||||
nsc_ircc_probe_338, nsc_ircc_init_338 },
|
||||
/* Contributed by Steffen Pingel - IBM X40 */
|
||||
{ "PC8738x", { 0x164e, 0x4e, 0x0 }, 0x20, 0xf4, 0xff,
|
||||
{ "PC8738x", { 0x164e, 0x4e, 0x2e }, 0x20, 0xf4, 0xff,
|
||||
nsc_ircc_probe_39x, nsc_ircc_init_39x },
|
||||
/* Contributed by Jan Frey - IBM A30/A31 */
|
||||
{ "PC8739x", { 0x2e, 0x4e, 0x0 }, 0x20, 0xea, 0xff,
|
||||
|
@ -2354,6 +2354,26 @@ static int __init smsc_superio_lpc(unsigned short cfg_base)
|
||||
#define PCIID_VENDOR_INTEL 0x8086
|
||||
#define PCIID_VENDOR_ALI 0x10b9
|
||||
static struct smsc_ircc_subsystem_configuration subsystem_configurations[] __initdata = {
|
||||
/*
|
||||
* Subsystems needing entries:
|
||||
* 0x10b9:0x1533 0x103c:0x0850 HP nx9010 family
|
||||
* 0x10b9:0x1533 0x0e11:0x005a Compaq nc4000 family
|
||||
* 0x8086:0x24cc 0x0e11:0x002a HP nx9000 family
|
||||
*/
|
||||
{
|
||||
/* Guessed entry */
|
||||
.vendor = PCIID_VENDOR_INTEL, /* Intel 82801DBM LPC bridge */
|
||||
.device = 0x24cc,
|
||||
.subvendor = 0x103c,
|
||||
.subdevice = 0x08bc,
|
||||
.sir_io = 0x02f8,
|
||||
.fir_io = 0x0130,
|
||||
.fir_irq = 0x05,
|
||||
.fir_dma = 0x03,
|
||||
.cfg_base = 0x004e,
|
||||
.preconfigure = preconfigure_through_82801,
|
||||
.name = "HP nx5000 family",
|
||||
},
|
||||
{
|
||||
.vendor = PCIID_VENDOR_INTEL, /* Intel 82801DBM LPC bridge */
|
||||
.device = 0x24cc,
|
||||
@ -2366,7 +2386,7 @@ static struct smsc_ircc_subsystem_configuration subsystem_configurations[] __ini
|
||||
.fir_dma = 0x03,
|
||||
.cfg_base = 0x004e,
|
||||
.preconfigure = preconfigure_through_82801,
|
||||
.name = "HP nc8000",
|
||||
.name = "HP nc8000 family",
|
||||
},
|
||||
{
|
||||
.vendor = PCIID_VENDOR_INTEL, /* Intel 82801DBM LPC bridge */
|
||||
@ -2379,7 +2399,21 @@ static struct smsc_ircc_subsystem_configuration subsystem_configurations[] __ini
|
||||
.fir_dma = 0x03,
|
||||
.cfg_base = 0x004e,
|
||||
.preconfigure = preconfigure_through_82801,
|
||||
.name = "HP nc6000",
|
||||
.name = "HP nc6000 family",
|
||||
},
|
||||
{
|
||||
.vendor = PCIID_VENDOR_INTEL, /* Intel 82801DBM LPC bridge */
|
||||
.device = 0x24cc,
|
||||
.subvendor = 0x0e11,
|
||||
.subdevice = 0x0860,
|
||||
/* I assume these are the same for x1000 as for the others */
|
||||
.sir_io = 0x02e8,
|
||||
.fir_io = 0x02f8,
|
||||
.fir_irq = 0x07,
|
||||
.fir_dma = 0x03,
|
||||
.cfg_base = 0x002e,
|
||||
.preconfigure = preconfigure_through_82801,
|
||||
.name = "Compaq x1000 family",
|
||||
},
|
||||
{
|
||||
/* Intel 82801DB/DBL (ICH4/ICH4-L) LPC Interface Bridge */
|
||||
|
@ -149,8 +149,6 @@ enum StirFifoCtlMask {
|
||||
FIFOCTL_DIR = 0x10,
|
||||
FIFOCTL_CLR = 0x08,
|
||||
FIFOCTL_EMPTY = 0x04,
|
||||
FIFOCTL_RXERR = 0x02,
|
||||
FIFOCTL_TXERR = 0x01,
|
||||
};
|
||||
|
||||
enum StirDiagMask {
|
||||
@ -615,19 +613,6 @@ static int fifo_txwait(struct stir_cb *stir, int space)
|
||||
|
||||
pr_debug("fifo status 0x%lx count %lu\n", status, count);
|
||||
|
||||
/* error when receive/transmit fifo gets confused */
|
||||
if (status & FIFOCTL_RXERR) {
|
||||
stir->stats.rx_fifo_errors++;
|
||||
stir->stats.rx_errors++;
|
||||
break;
|
||||
}
|
||||
|
||||
if (status & FIFOCTL_TXERR) {
|
||||
stir->stats.tx_fifo_errors++;
|
||||
stir->stats.tx_errors++;
|
||||
break;
|
||||
}
|
||||
|
||||
/* is fifo receiving already, or empty */
|
||||
if (!(status & FIFOCTL_DIR)
|
||||
|| (status & FIFOCTL_EMPTY))
|
||||
|
@ -1223,8 +1223,13 @@ static int upload_rxdata(struct via_ircc_cb *self, int iobase)
|
||||
|
||||
IRDA_DEBUG(2, "%s(): len=%x\n", __FUNCTION__, len);
|
||||
|
||||
if ((len - 4) < 2) {
|
||||
self->stats.rx_dropped++;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
skb = dev_alloc_skb(len + 1);
|
||||
if ((skb == NULL) || ((len - 4) < 2)) {
|
||||
if (skb == NULL) {
|
||||
self->stats.rx_dropped++;
|
||||
return FALSE;
|
||||
}
|
||||
|
@ -161,15 +161,13 @@ static int loopback_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
return(0);
|
||||
}
|
||||
|
||||
static struct net_device_stats loopback_stats;
|
||||
|
||||
static struct net_device_stats *get_stats(struct net_device *dev)
|
||||
{
|
||||
struct net_device_stats *stats = dev->priv;
|
||||
struct net_device_stats *stats = &loopback_stats;
|
||||
int i;
|
||||
|
||||
if (!stats) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
memset(stats, 0, sizeof(struct net_device_stats));
|
||||
|
||||
for_each_possible_cpu(i) {
|
||||
@ -185,19 +183,28 @@ static struct net_device_stats *get_stats(struct net_device *dev)
|
||||
return stats;
|
||||
}
|
||||
|
||||
static u32 loopback_get_link(struct net_device *dev)
|
||||
static u32 always_on(struct net_device *dev)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
static const struct ethtool_ops loopback_ethtool_ops = {
|
||||
.get_link = loopback_get_link,
|
||||
.get_link = always_on,
|
||||
.get_tso = ethtool_op_get_tso,
|
||||
.set_tso = ethtool_op_set_tso,
|
||||
.get_tx_csum = always_on,
|
||||
.get_sg = always_on,
|
||||
.get_rx_csum = always_on,
|
||||
};
|
||||
|
||||
/*
|
||||
* The loopback device is special. There is only one instance and
|
||||
* it is statically allocated. Don't do this for other devices.
|
||||
*/
|
||||
struct net_device loopback_dev = {
|
||||
.name = "lo",
|
||||
.get_stats = &get_stats,
|
||||
.priv = &loopback_stats,
|
||||
.mtu = (16 * 1024) + 20 + 20 + 12,
|
||||
.hard_start_xmit = loopback_xmit,
|
||||
.hard_header = eth_header,
|
||||
@ -221,16 +228,6 @@ struct net_device loopback_dev = {
|
||||
/* Setup and register the loopback device. */
|
||||
int __init loopback_init(void)
|
||||
{
|
||||
struct net_device_stats *stats;
|
||||
|
||||
/* Can survive without statistics */
|
||||
stats = kmalloc(sizeof(struct net_device_stats), GFP_KERNEL);
|
||||
if (stats) {
|
||||
memset(stats, 0, sizeof(struct net_device_stats));
|
||||
loopback_dev.priv = stats;
|
||||
loopback_dev.get_stats = &get_stats;
|
||||
}
|
||||
|
||||
return register_netdev(&loopback_dev);
|
||||
};
|
||||
|
||||
|
@ -600,6 +600,7 @@ static int pppoe_connect(struct socket *sock, struct sockaddr *uservaddr,
|
||||
po->chan.hdrlen = (sizeof(struct pppoe_hdr) +
|
||||
dev->hard_header_len);
|
||||
|
||||
po->chan.mtu = dev->mtu - sizeof(struct pppoe_hdr);
|
||||
po->chan.private = sk;
|
||||
po->chan.ops = &pppoe_chan_ops;
|
||||
|
||||
|
@ -68,8 +68,8 @@
|
||||
|
||||
#define DRV_MODULE_NAME "tg3"
|
||||
#define PFX DRV_MODULE_NAME ": "
|
||||
#define DRV_MODULE_VERSION "3.65"
|
||||
#define DRV_MODULE_RELDATE "August 07, 2006"
|
||||
#define DRV_MODULE_VERSION "3.66"
|
||||
#define DRV_MODULE_RELDATE "September 23, 2006"
|
||||
|
||||
#define TG3_DEF_MAC_MODE 0
|
||||
#define TG3_DEF_RX_MODE 0
|
||||
@ -173,6 +173,7 @@ static struct pci_device_id tg3_pci_tbl[] = {
|
||||
{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5705F)},
|
||||
{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5720)},
|
||||
{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5721)},
|
||||
{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5722)},
|
||||
{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5750)},
|
||||
{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5751)},
|
||||
{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5750M)},
|
||||
@ -187,6 +188,7 @@ static struct pci_device_id tg3_pci_tbl[] = {
|
||||
{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5754M)},
|
||||
{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5755)},
|
||||
{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5755M)},
|
||||
{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5756)},
|
||||
{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5786)},
|
||||
{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5787)},
|
||||
{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5787M)},
|
||||
@ -197,6 +199,8 @@ static struct pci_device_id tg3_pci_tbl[] = {
|
||||
{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5780)},
|
||||
{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5780S)},
|
||||
{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5781)},
|
||||
{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5906)},
|
||||
{PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5906M)},
|
||||
{PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, PCI_DEVICE_ID_SYSKONNECT_9DXX)},
|
||||
{PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, PCI_DEVICE_ID_SYSKONNECT_9MXX)},
|
||||
{PCI_DEVICE(PCI_VENDOR_ID_ALTIMA, PCI_DEVICE_ID_ALTIMA_AC1000)},
|
||||
@ -424,6 +428,16 @@ static void tg3_write32_tx_mbox(struct tg3 *tp, u32 off, u32 val)
|
||||
readl(mbox);
|
||||
}
|
||||
|
||||
static u32 tg3_read32_mbox_5906(struct tg3 *tp, u32 off)
|
||||
{
|
||||
return (readl(tp->regs + off + GRCMBOX_BASE));
|
||||
}
|
||||
|
||||
static void tg3_write32_mbox_5906(struct tg3 *tp, u32 off, u32 val)
|
||||
{
|
||||
writel(val, tp->regs + off + GRCMBOX_BASE);
|
||||
}
|
||||
|
||||
#define tw32_mailbox(reg, val) tp->write32_mbox(tp, reg, val)
|
||||
#define tw32_mailbox_f(reg, val) tw32_mailbox_flush(tp, (reg), (val))
|
||||
#define tw32_rx_mbox(reg, val) tp->write32_rx_mbox(tp, reg, val)
|
||||
@ -439,6 +453,10 @@ static void tg3_write_mem(struct tg3 *tp, u32 off, u32 val)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) &&
|
||||
(off >= NIC_SRAM_STATS_BLK) && (off < NIC_SRAM_TX_BUFFER_DESC))
|
||||
return;
|
||||
|
||||
spin_lock_irqsave(&tp->indirect_lock, flags);
|
||||
if (tp->tg3_flags & TG3_FLAG_SRAM_USE_CONFIG) {
|
||||
pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, off);
|
||||
@ -460,6 +478,12 @@ static void tg3_read_mem(struct tg3 *tp, u32 off, u32 *val)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) &&
|
||||
(off >= NIC_SRAM_STATS_BLK) && (off < NIC_SRAM_TX_BUFFER_DESC)) {
|
||||
*val = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&tp->indirect_lock, flags);
|
||||
if (tp->tg3_flags & TG3_FLAG_SRAM_USE_CONFIG) {
|
||||
pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, off);
|
||||
@ -489,6 +513,9 @@ static inline void tg3_cond_int(struct tg3 *tp)
|
||||
if (!(tp->tg3_flags & TG3_FLAG_TAGGED_STATUS) &&
|
||||
(tp->hw_status->status & SD_STATUS_UPDATED))
|
||||
tw32(GRC_LOCAL_CTRL, tp->grc_local_ctrl | GRC_LCLCTRL_SETINT);
|
||||
else
|
||||
tw32(HOSTCC_MODE, tp->coalesce_mode |
|
||||
(HOSTCC_MODE_ENABLE | HOSTCC_MODE_NOW));
|
||||
}
|
||||
|
||||
static void tg3_enable_ints(struct tg3 *tp)
|
||||
@ -654,6 +681,10 @@ static int tg3_writephy(struct tg3 *tp, int reg, u32 val)
|
||||
unsigned int loops;
|
||||
int ret;
|
||||
|
||||
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906 &&
|
||||
(reg == MII_TG3_CTRL || reg == MII_TG3_AUX_CTRL))
|
||||
return 0;
|
||||
|
||||
if ((tp->mi_mode & MAC_MI_MODE_AUTO_POLL) != 0) {
|
||||
tw32_f(MAC_MI_MODE,
|
||||
(tp->mi_mode & ~MAC_MI_MODE_AUTO_POLL));
|
||||
@ -1004,6 +1035,24 @@ static int tg3_phy_reset(struct tg3 *tp)
|
||||
phy_reg | MII_TG3_EXT_CTRL_FIFO_ELASTIC);
|
||||
}
|
||||
|
||||
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) {
|
||||
u32 phy_reg;
|
||||
|
||||
/* adjust output voltage */
|
||||
tg3_writephy(tp, MII_TG3_EPHY_PTEST, 0x12);
|
||||
|
||||
if (!tg3_readphy(tp, MII_TG3_EPHY_TEST, &phy_reg)) {
|
||||
u32 phy_reg2;
|
||||
|
||||
tg3_writephy(tp, MII_TG3_EPHY_TEST,
|
||||
phy_reg | MII_TG3_EPHY_SHADOW_EN);
|
||||
/* Enable auto-MDIX */
|
||||
if (!tg3_readphy(tp, 0x10, &phy_reg2))
|
||||
tg3_writephy(tp, 0x10, phy_reg2 | 0x4000);
|
||||
tg3_writephy(tp, MII_TG3_EPHY_TEST, phy_reg);
|
||||
}
|
||||
}
|
||||
|
||||
tg3_phy_set_wirespeed(tp);
|
||||
return 0;
|
||||
}
|
||||
@ -1117,6 +1166,15 @@ static void tg3_nvram_unlock(struct tg3 *);
|
||||
|
||||
static void tg3_power_down_phy(struct tg3 *tp)
|
||||
{
|
||||
if (tp->tg3_flags2 & TG3_FLG2_PHY_SERDES)
|
||||
return;
|
||||
|
||||
if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5906) {
|
||||
tg3_writephy(tp, MII_TG3_EXT_CTRL,
|
||||
MII_TG3_EXT_CTRL_FORCE_LED_OFF);
|
||||
tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x01b2);
|
||||
}
|
||||
|
||||
/* The PHY should not be powered down on some chips because
|
||||
* of bugs.
|
||||
*/
|
||||
@ -1199,7 +1257,12 @@ static int tg3_set_power_state(struct tg3 *tp, pci_power_t state)
|
||||
tg3_setup_phy(tp, 0);
|
||||
}
|
||||
|
||||
if (!(tp->tg3_flags & TG3_FLAG_ENABLE_ASF)) {
|
||||
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) {
|
||||
u32 val;
|
||||
|
||||
val = tr32(GRC_VCPU_EXT_CTRL);
|
||||
tw32(GRC_VCPU_EXT_CTRL, val | GRC_VCPU_EXT_CTRL_DISABLE_WOL);
|
||||
} else if (!(tp->tg3_flags & TG3_FLAG_ENABLE_ASF)) {
|
||||
int i;
|
||||
u32 val;
|
||||
|
||||
@ -1223,7 +1286,10 @@ static int tg3_set_power_state(struct tg3 *tp, pci_power_t state)
|
||||
tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x5a);
|
||||
udelay(40);
|
||||
|
||||
mac_mode = MAC_MODE_PORT_MODE_MII;
|
||||
if (tp->tg3_flags2 & TG3_FLG2_MII_SERDES)
|
||||
mac_mode = MAC_MODE_PORT_MODE_GMII;
|
||||
else
|
||||
mac_mode = MAC_MODE_PORT_MODE_MII;
|
||||
|
||||
if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5700 ||
|
||||
!(tp->tg3_flags & TG3_FLAG_WOL_SPEED_100MB))
|
||||
@ -1301,15 +1367,8 @@ static int tg3_set_power_state(struct tg3 *tp, pci_power_t state)
|
||||
}
|
||||
|
||||
if (!(tp->tg3_flags & TG3_FLAG_WOL_ENABLE) &&
|
||||
!(tp->tg3_flags & TG3_FLAG_ENABLE_ASF)) {
|
||||
/* Turn off the PHY */
|
||||
if (!(tp->tg3_flags2 & TG3_FLG2_PHY_SERDES)) {
|
||||
tg3_writephy(tp, MII_TG3_EXT_CTRL,
|
||||
MII_TG3_EXT_CTRL_FORCE_LED_OFF);
|
||||
tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x01b2);
|
||||
tg3_power_down_phy(tp);
|
||||
}
|
||||
}
|
||||
!(tp->tg3_flags & TG3_FLAG_ENABLE_ASF))
|
||||
tg3_power_down_phy(tp);
|
||||
|
||||
tg3_frob_aux_power(tp);
|
||||
|
||||
@ -1467,6 +1526,13 @@ static void tg3_aux_stat_to_speed_duplex(struct tg3 *tp, u32 val, u16 *speed, u8
|
||||
break;
|
||||
|
||||
default:
|
||||
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) {
|
||||
*speed = (val & MII_TG3_AUX_STAT_100) ? SPEED_100 :
|
||||
SPEED_10;
|
||||
*duplex = (val & MII_TG3_AUX_STAT_FULL) ? DUPLEX_FULL :
|
||||
DUPLEX_HALF;
|
||||
break;
|
||||
}
|
||||
*speed = SPEED_INVALID;
|
||||
*duplex = DUPLEX_INVALID;
|
||||
break;
|
||||
@ -1749,7 +1815,7 @@ static int tg3_setup_copper_phy(struct tg3 *tp, int force_reset)
|
||||
|
||||
if (tp->tg3_flags & TG3_FLAG_USE_MI_INTERRUPT)
|
||||
tg3_writephy(tp, MII_TG3_IMASK, ~MII_TG3_INT_LINKCHG);
|
||||
else
|
||||
else if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5906)
|
||||
tg3_writephy(tp, MII_TG3_IMASK, ~0);
|
||||
|
||||
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 ||
|
||||
@ -2406,24 +2472,27 @@ static int tg3_setup_fiber_hw_autoneg(struct tg3 *tp, u32 mac_status)
|
||||
expected_sg_dig_ctrl |= (1 << 12);
|
||||
|
||||
if (sg_dig_ctrl != expected_sg_dig_ctrl) {
|
||||
if ((tp->tg3_flags2 & TG3_FLG2_PARALLEL_DETECT) &&
|
||||
tp->serdes_counter &&
|
||||
((mac_status & (MAC_STATUS_PCS_SYNCED |
|
||||
MAC_STATUS_RCVD_CFG)) ==
|
||||
MAC_STATUS_PCS_SYNCED)) {
|
||||
tp->serdes_counter--;
|
||||
current_link_up = 1;
|
||||
goto out;
|
||||
}
|
||||
restart_autoneg:
|
||||
if (workaround)
|
||||
tw32_f(MAC_SERDES_CFG, serdes_cfg | 0xc011000);
|
||||
tw32_f(SG_DIG_CTRL, expected_sg_dig_ctrl | (1 << 30));
|
||||
udelay(5);
|
||||
tw32_f(SG_DIG_CTRL, expected_sg_dig_ctrl);
|
||||
|
||||
tp->tg3_flags2 |= TG3_FLG2_PHY_JUST_INITTED;
|
||||
tp->serdes_counter = SERDES_AN_TIMEOUT_5704S;
|
||||
tp->tg3_flags2 &= ~TG3_FLG2_PARALLEL_DETECT;
|
||||
} else if (mac_status & (MAC_STATUS_PCS_SYNCED |
|
||||
MAC_STATUS_SIGNAL_DET)) {
|
||||
int i;
|
||||
|
||||
/* Giver time to negotiate (~200ms) */
|
||||
for (i = 0; i < 40000; i++) {
|
||||
sg_dig_status = tr32(SG_DIG_STATUS);
|
||||
if (sg_dig_status & (0x3))
|
||||
break;
|
||||
udelay(5);
|
||||
}
|
||||
sg_dig_status = tr32(SG_DIG_STATUS);
|
||||
mac_status = tr32(MAC_STATUS);
|
||||
|
||||
if ((sg_dig_status & (1 << 1)) &&
|
||||
@ -2439,10 +2508,11 @@ static int tg3_setup_fiber_hw_autoneg(struct tg3 *tp, u32 mac_status)
|
||||
|
||||
tg3_setup_flow_control(tp, local_adv, remote_adv);
|
||||
current_link_up = 1;
|
||||
tp->tg3_flags2 &= ~TG3_FLG2_PHY_JUST_INITTED;
|
||||
tp->serdes_counter = 0;
|
||||
tp->tg3_flags2 &= ~TG3_FLG2_PARALLEL_DETECT;
|
||||
} else if (!(sg_dig_status & (1 << 1))) {
|
||||
if (tp->tg3_flags2 & TG3_FLG2_PHY_JUST_INITTED)
|
||||
tp->tg3_flags2 &= ~TG3_FLG2_PHY_JUST_INITTED;
|
||||
if (tp->serdes_counter)
|
||||
tp->serdes_counter--;
|
||||
else {
|
||||
if (workaround) {
|
||||
u32 val = serdes_cfg;
|
||||
@ -2466,9 +2536,17 @@ static int tg3_setup_fiber_hw_autoneg(struct tg3 *tp, u32 mac_status)
|
||||
!(mac_status & MAC_STATUS_RCVD_CFG)) {
|
||||
tg3_setup_flow_control(tp, 0, 0);
|
||||
current_link_up = 1;
|
||||
}
|
||||
tp->tg3_flags2 |=
|
||||
TG3_FLG2_PARALLEL_DETECT;
|
||||
tp->serdes_counter =
|
||||
SERDES_PARALLEL_DET_TIMEOUT;
|
||||
} else
|
||||
goto restart_autoneg;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
tp->serdes_counter = SERDES_AN_TIMEOUT_5704S;
|
||||
tp->tg3_flags2 &= ~TG3_FLG2_PARALLEL_DETECT;
|
||||
}
|
||||
|
||||
out:
|
||||
@ -2599,14 +2677,16 @@ static int tg3_setup_fiber_phy(struct tg3 *tp, int force_reset)
|
||||
MAC_STATUS_CFG_CHANGED));
|
||||
udelay(5);
|
||||
if ((tr32(MAC_STATUS) & (MAC_STATUS_SYNC_CHANGED |
|
||||
MAC_STATUS_CFG_CHANGED)) == 0)
|
||||
MAC_STATUS_CFG_CHANGED |
|
||||
MAC_STATUS_LNKSTATE_CHANGED)) == 0)
|
||||
break;
|
||||
}
|
||||
|
||||
mac_status = tr32(MAC_STATUS);
|
||||
if ((mac_status & MAC_STATUS_PCS_SYNCED) == 0) {
|
||||
current_link_up = 0;
|
||||
if (tp->link_config.autoneg == AUTONEG_ENABLE) {
|
||||
if (tp->link_config.autoneg == AUTONEG_ENABLE &&
|
||||
tp->serdes_counter == 0) {
|
||||
tw32_f(MAC_MODE, (tp->mac_mode |
|
||||
MAC_MODE_SEND_CONFIGS));
|
||||
udelay(1);
|
||||
@ -2711,7 +2791,7 @@ static int tg3_setup_fiber_mii_phy(struct tg3 *tp, int force_reset)
|
||||
tg3_writephy(tp, MII_BMCR, bmcr);
|
||||
|
||||
tw32_f(MAC_EVENT, MAC_EVENT_LNKSTATE_CHANGED);
|
||||
tp->tg3_flags2 |= TG3_FLG2_PHY_JUST_INITTED;
|
||||
tp->serdes_counter = SERDES_AN_TIMEOUT_5714S;
|
||||
tp->tg3_flags2 &= ~TG3_FLG2_PARALLEL_DETECT;
|
||||
|
||||
return err;
|
||||
@ -2816,9 +2896,9 @@ static int tg3_setup_fiber_mii_phy(struct tg3 *tp, int force_reset)
|
||||
|
||||
static void tg3_serdes_parallel_detect(struct tg3 *tp)
|
||||
{
|
||||
if (tp->tg3_flags2 & TG3_FLG2_PHY_JUST_INITTED) {
|
||||
if (tp->serdes_counter) {
|
||||
/* Give autoneg time to complete. */
|
||||
tp->tg3_flags2 &= ~TG3_FLG2_PHY_JUST_INITTED;
|
||||
tp->serdes_counter--;
|
||||
return;
|
||||
}
|
||||
if (!netif_carrier_ok(tp->dev) &&
|
||||
@ -3535,8 +3615,7 @@ static irqreturn_t tg3_test_isr(int irq, void *dev_id,
|
||||
|
||||
if ((sblk->status & SD_STATUS_UPDATED) ||
|
||||
!(tr32(TG3PCI_PCISTATE) & PCISTATE_INT_NOT_ACTIVE)) {
|
||||
tw32_mailbox(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW,
|
||||
0x00000001);
|
||||
tg3_disable_ints(tp);
|
||||
return IRQ_RETVAL(1);
|
||||
}
|
||||
return IRQ_RETVAL(0);
|
||||
@ -4644,6 +4723,44 @@ static void tg3_write_sig_legacy(struct tg3 *tp, int kind)
|
||||
}
|
||||
}
|
||||
|
||||
static int tg3_poll_fw(struct tg3 *tp)
|
||||
{
|
||||
int i;
|
||||
u32 val;
|
||||
|
||||
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) {
|
||||
for (i = 0; i < 400; i++) {
|
||||
if (tr32(VCPU_STATUS) & VCPU_STATUS_INIT_DONE)
|
||||
return 0;
|
||||
udelay(10);
|
||||
}
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
/* Wait for firmware initialization to complete. */
|
||||
for (i = 0; i < 100000; i++) {
|
||||
tg3_read_mem(tp, NIC_SRAM_FIRMWARE_MBOX, &val);
|
||||
if (val == ~NIC_SRAM_FIRMWARE_MBOX_MAGIC1)
|
||||
break;
|
||||
udelay(10);
|
||||
}
|
||||
|
||||
/* Chip might not be fitted with firmware. Some Sun onboard
|
||||
* parts are configured like that. So don't signal the timeout
|
||||
* of the above loop as an error, but do report the lack of
|
||||
* running firmware once.
|
||||
*/
|
||||
if (i >= 100000 &&
|
||||
!(tp->tg3_flags2 & TG3_FLG2_NO_FWARE_REPORTED)) {
|
||||
tp->tg3_flags2 |= TG3_FLG2_NO_FWARE_REPORTED;
|
||||
|
||||
printk(KERN_INFO PFX "%s: No firmware running.\n",
|
||||
tp->dev->name);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void tg3_stop_fw(struct tg3 *);
|
||||
|
||||
/* tp->lock is held. */
|
||||
@ -4651,7 +4768,7 @@ static int tg3_chip_reset(struct tg3 *tp)
|
||||
{
|
||||
u32 val;
|
||||
void (*write_op)(struct tg3 *, u32, u32);
|
||||
int i;
|
||||
int err;
|
||||
|
||||
tg3_nvram_lock(tp);
|
||||
|
||||
@ -4688,6 +4805,12 @@ static int tg3_chip_reset(struct tg3 *tp)
|
||||
}
|
||||
}
|
||||
|
||||
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) {
|
||||
tw32(VCPU_STATUS, tr32(VCPU_STATUS) | VCPU_STATUS_DRV_RESET);
|
||||
tw32(GRC_VCPU_EXT_CTRL,
|
||||
tr32(GRC_VCPU_EXT_CTRL) & ~GRC_VCPU_EXT_CTRL_HALT_CPU);
|
||||
}
|
||||
|
||||
if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS)
|
||||
val |= GRC_MISC_CFG_KEEP_GPHY_POWER;
|
||||
tw32(GRC_MISC_CFG, val);
|
||||
@ -4811,26 +4934,9 @@ static int tg3_chip_reset(struct tg3 *tp)
|
||||
tw32_f(MAC_MODE, 0);
|
||||
udelay(40);
|
||||
|
||||
/* Wait for firmware initialization to complete. */
|
||||
for (i = 0; i < 100000; i++) {
|
||||
tg3_read_mem(tp, NIC_SRAM_FIRMWARE_MBOX, &val);
|
||||
if (val == ~NIC_SRAM_FIRMWARE_MBOX_MAGIC1)
|
||||
break;
|
||||
udelay(10);
|
||||
}
|
||||
|
||||
/* Chip might not be fitted with firmare. Some Sun onboard
|
||||
* parts are configured like that. So don't signal the timeout
|
||||
* of the above loop as an error, but do report the lack of
|
||||
* running firmware once.
|
||||
*/
|
||||
if (i >= 100000 &&
|
||||
!(tp->tg3_flags2 & TG3_FLG2_NO_FWARE_REPORTED)) {
|
||||
tp->tg3_flags2 |= TG3_FLG2_NO_FWARE_REPORTED;
|
||||
|
||||
printk(KERN_INFO PFX "%s: No firmware running.\n",
|
||||
tp->dev->name);
|
||||
}
|
||||
err = tg3_poll_fw(tp);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if ((tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS) &&
|
||||
tp->pci_chip_rev_id != CHIPREV_ID_5750_A0) {
|
||||
@ -5036,6 +5142,12 @@ static int tg3_halt_cpu(struct tg3 *tp, u32 offset)
|
||||
BUG_ON(offset == TX_CPU_BASE &&
|
||||
(tp->tg3_flags2 & TG3_FLG2_5705_PLUS));
|
||||
|
||||
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) {
|
||||
u32 val = tr32(GRC_VCPU_EXT_CTRL);
|
||||
|
||||
tw32(GRC_VCPU_EXT_CTRL, val | GRC_VCPU_EXT_CTRL_HALT_CPU);
|
||||
return 0;
|
||||
}
|
||||
if (offset == RX_CPU_BASE) {
|
||||
for (i = 0; i < 10000; i++) {
|
||||
tw32(offset + CPU_STATE, 0xffffffff);
|
||||
@ -6040,6 +6152,13 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy)
|
||||
val = 1;
|
||||
else if (val > tp->rx_std_max_post)
|
||||
val = tp->rx_std_max_post;
|
||||
else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) {
|
||||
if (tp->pci_chip_rev_id == CHIPREV_ID_5906_A1)
|
||||
tw32(ISO_PKT_TX, (tr32(ISO_PKT_TX) & ~0x3) | 0x2);
|
||||
|
||||
if (val > (TG3_RX_INTERNAL_RING_SZ_5906 / 2))
|
||||
val = TG3_RX_INTERNAL_RING_SZ_5906 / 2;
|
||||
}
|
||||
|
||||
tw32(RCVBDI_STD_THRESH, val);
|
||||
|
||||
@ -6460,7 +6579,8 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy)
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (!(tp->tg3_flags2 & TG3_FLG2_PHY_SERDES)) {
|
||||
if (!(tp->tg3_flags2 & TG3_FLG2_PHY_SERDES) &&
|
||||
GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5906) {
|
||||
u32 tmp;
|
||||
|
||||
/* Clear CRC stats. */
|
||||
@ -6660,12 +6780,14 @@ static void tg3_timer(unsigned long __opaque)
|
||||
need_setup = 1;
|
||||
}
|
||||
if (need_setup) {
|
||||
tw32_f(MAC_MODE,
|
||||
(tp->mac_mode &
|
||||
~MAC_MODE_PORT_MODE_MASK));
|
||||
udelay(40);
|
||||
tw32_f(MAC_MODE, tp->mac_mode);
|
||||
udelay(40);
|
||||
if (!tp->serdes_counter) {
|
||||
tw32_f(MAC_MODE,
|
||||
(tp->mac_mode &
|
||||
~MAC_MODE_PORT_MODE_MASK));
|
||||
udelay(40);
|
||||
tw32_f(MAC_MODE, tp->mac_mode);
|
||||
udelay(40);
|
||||
}
|
||||
tg3_setup_phy(tp, 0);
|
||||
}
|
||||
} else if (tp->tg3_flags2 & TG3_FLG2_MII_SERDES)
|
||||
@ -6674,13 +6796,29 @@ static void tg3_timer(unsigned long __opaque)
|
||||
tp->timer_counter = tp->timer_multiplier;
|
||||
}
|
||||
|
||||
/* Heartbeat is only sent once every 2 seconds. */
|
||||
/* Heartbeat is only sent once every 2 seconds.
|
||||
*
|
||||
* The heartbeat is to tell the ASF firmware that the host
|
||||
* driver is still alive. In the event that the OS crashes,
|
||||
* ASF needs to reset the hardware to free up the FIFO space
|
||||
* that may be filled with rx packets destined for the host.
|
||||
* If the FIFO is full, ASF will no longer function properly.
|
||||
*
|
||||
* Unintended resets have been reported on real time kernels
|
||||
* where the timer doesn't run on time. Netpoll will also have
|
||||
* same problem.
|
||||
*
|
||||
* The new FWCMD_NICDRV_ALIVE3 command tells the ASF firmware
|
||||
* to check the ring condition when the heartbeat is expiring
|
||||
* before doing the reset. This will prevent most unintended
|
||||
* resets.
|
||||
*/
|
||||
if (!--tp->asf_counter) {
|
||||
if (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) {
|
||||
u32 val;
|
||||
|
||||
tg3_write_mem(tp, NIC_SRAM_FW_CMD_MBOX,
|
||||
FWCMD_NICDRV_ALIVE2);
|
||||
FWCMD_NICDRV_ALIVE3);
|
||||
tg3_write_mem(tp, NIC_SRAM_FW_CMD_LEN_MBOX, 4);
|
||||
/* 5 seconds timeout */
|
||||
tg3_write_mem(tp, NIC_SRAM_FW_CMD_DATA_MBOX, 5);
|
||||
@ -6721,8 +6859,7 @@ static int tg3_request_irq(struct tg3 *tp)
|
||||
static int tg3_test_interrupt(struct tg3 *tp)
|
||||
{
|
||||
struct net_device *dev = tp->dev;
|
||||
int err, i;
|
||||
u32 int_mbox = 0;
|
||||
int err, i, intr_ok = 0;
|
||||
|
||||
if (!netif_running(dev))
|
||||
return -ENODEV;
|
||||
@ -6743,10 +6880,18 @@ static int tg3_test_interrupt(struct tg3 *tp)
|
||||
HOSTCC_MODE_NOW);
|
||||
|
||||
for (i = 0; i < 5; i++) {
|
||||
u32 int_mbox, misc_host_ctrl;
|
||||
|
||||
int_mbox = tr32_mailbox(MAILBOX_INTERRUPT_0 +
|
||||
TG3_64BIT_REG_LOW);
|
||||
if (int_mbox != 0)
|
||||
misc_host_ctrl = tr32(TG3PCI_MISC_HOST_CTRL);
|
||||
|
||||
if ((int_mbox != 0) ||
|
||||
(misc_host_ctrl & MISC_HOST_CTRL_MASK_PCI_INT)) {
|
||||
intr_ok = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
msleep(10);
|
||||
}
|
||||
|
||||
@ -6759,7 +6904,7 @@ static int tg3_test_interrupt(struct tg3 *tp)
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (int_mbox != 0)
|
||||
if (intr_ok)
|
||||
return 0;
|
||||
|
||||
return -EIO;
|
||||
@ -6936,9 +7081,10 @@ static int tg3_open(struct net_device *dev)
|
||||
|
||||
if (tp->tg3_flags2 & TG3_FLG2_USING_MSI) {
|
||||
if (tp->tg3_flags2 & TG3_FLG2_1SHOT_MSI) {
|
||||
u32 val = tr32(0x7c04);
|
||||
u32 val = tr32(PCIE_TRANSACTION_CFG);
|
||||
|
||||
tw32(0x7c04, val | (1 << 29));
|
||||
tw32(PCIE_TRANSACTION_CFG,
|
||||
val | PCIE_TRANS_CFG_1SHOT_MSI);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -7857,7 +8003,7 @@ static int tg3_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
|
||||
if (wol->wolopts & ~WAKE_MAGIC)
|
||||
return -EINVAL;
|
||||
if ((wol->wolopts & WAKE_MAGIC) &&
|
||||
tp->tg3_flags2 & TG3_FLG2_PHY_SERDES &&
|
||||
tp->tg3_flags2 & TG3_FLG2_ANY_SERDES &&
|
||||
!(tp->tg3_flags & TG3_FLAG_SERDES_WOL_CAP))
|
||||
return -EINVAL;
|
||||
|
||||
@ -7893,7 +8039,8 @@ static int tg3_set_tso(struct net_device *dev, u32 value)
|
||||
return -EINVAL;
|
||||
return 0;
|
||||
}
|
||||
if (tp->tg3_flags2 & TG3_FLG2_HW_TSO_2) {
|
||||
if ((tp->tg3_flags2 & TG3_FLG2_HW_TSO_2) &&
|
||||
(GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5906)) {
|
||||
if (value)
|
||||
dev->features |= NETIF_F_TSO6;
|
||||
else
|
||||
@ -8147,6 +8294,8 @@ static void tg3_get_ethtool_stats (struct net_device *dev,
|
||||
|
||||
#define NVRAM_TEST_SIZE 0x100
|
||||
#define NVRAM_SELFBOOT_FORMAT1_SIZE 0x14
|
||||
#define NVRAM_SELFBOOT_HW_SIZE 0x20
|
||||
#define NVRAM_SELFBOOT_DATA_SIZE 0x1c
|
||||
|
||||
static int tg3_test_nvram(struct tg3 *tp)
|
||||
{
|
||||
@ -8158,12 +8307,14 @@ static int tg3_test_nvram(struct tg3 *tp)
|
||||
|
||||
if (magic == TG3_EEPROM_MAGIC)
|
||||
size = NVRAM_TEST_SIZE;
|
||||
else if ((magic & 0xff000000) == 0xa5000000) {
|
||||
else if ((magic & TG3_EEPROM_MAGIC_FW_MSK) == TG3_EEPROM_MAGIC_FW) {
|
||||
if ((magic & 0xe00000) == 0x200000)
|
||||
size = NVRAM_SELFBOOT_FORMAT1_SIZE;
|
||||
else
|
||||
return 0;
|
||||
} else
|
||||
} else if ((magic & TG3_EEPROM_MAGIC_HW_MSK) == TG3_EEPROM_MAGIC_HW)
|
||||
size = NVRAM_SELFBOOT_HW_SIZE;
|
||||
else
|
||||
return -EIO;
|
||||
|
||||
buf = kmalloc(size, GFP_KERNEL);
|
||||
@ -8182,7 +8333,8 @@ static int tg3_test_nvram(struct tg3 *tp)
|
||||
goto out;
|
||||
|
||||
/* Selfboot format */
|
||||
if (cpu_to_be32(buf[0]) != TG3_EEPROM_MAGIC) {
|
||||
if ((cpu_to_be32(buf[0]) & TG3_EEPROM_MAGIC_FW_MSK) ==
|
||||
TG3_EEPROM_MAGIC_FW) {
|
||||
u8 *buf8 = (u8 *) buf, csum8 = 0;
|
||||
|
||||
for (i = 0; i < size; i++)
|
||||
@ -8197,6 +8349,51 @@ static int tg3_test_nvram(struct tg3 *tp)
|
||||
goto out;
|
||||
}
|
||||
|
||||
if ((cpu_to_be32(buf[0]) & TG3_EEPROM_MAGIC_HW_MSK) ==
|
||||
TG3_EEPROM_MAGIC_HW) {
|
||||
u8 data[NVRAM_SELFBOOT_DATA_SIZE];
|
||||
u8 parity[NVRAM_SELFBOOT_DATA_SIZE];
|
||||
u8 *buf8 = (u8 *) buf;
|
||||
int j, k;
|
||||
|
||||
/* Separate the parity bits and the data bytes. */
|
||||
for (i = 0, j = 0, k = 0; i < NVRAM_SELFBOOT_HW_SIZE; i++) {
|
||||
if ((i == 0) || (i == 8)) {
|
||||
int l;
|
||||
u8 msk;
|
||||
|
||||
for (l = 0, msk = 0x80; l < 7; l++, msk >>= 1)
|
||||
parity[k++] = buf8[i] & msk;
|
||||
i++;
|
||||
}
|
||||
else if (i == 16) {
|
||||
int l;
|
||||
u8 msk;
|
||||
|
||||
for (l = 0, msk = 0x20; l < 6; l++, msk >>= 1)
|
||||
parity[k++] = buf8[i] & msk;
|
||||
i++;
|
||||
|
||||
for (l = 0, msk = 0x80; l < 8; l++, msk >>= 1)
|
||||
parity[k++] = buf8[i] & msk;
|
||||
i++;
|
||||
}
|
||||
data[j++] = buf8[i];
|
||||
}
|
||||
|
||||
err = -EIO;
|
||||
for (i = 0; i < NVRAM_SELFBOOT_DATA_SIZE; i++) {
|
||||
u8 hw8 = hweight8(data[i]);
|
||||
|
||||
if ((hw8 & 0x1) && parity[i])
|
||||
goto out;
|
||||
else if (!(hw8 & 0x1) && !parity[i])
|
||||
goto out;
|
||||
}
|
||||
err = 0;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Bootstrap checksum at offset 0x10 */
|
||||
csum = calc_crc((unsigned char *) buf, 0x10);
|
||||
if(csum != cpu_to_le32(buf[0x10/4]))
|
||||
@ -8243,7 +8440,7 @@ static int tg3_test_link(struct tg3 *tp)
|
||||
/* Only test the commonly used registers */
|
||||
static int tg3_test_registers(struct tg3 *tp)
|
||||
{
|
||||
int i, is_5705;
|
||||
int i, is_5705, is_5750;
|
||||
u32 offset, read_mask, write_mask, val, save_val, read_val;
|
||||
static struct {
|
||||
u16 offset;
|
||||
@ -8251,6 +8448,7 @@ static int tg3_test_registers(struct tg3 *tp)
|
||||
#define TG3_FL_5705 0x1
|
||||
#define TG3_FL_NOT_5705 0x2
|
||||
#define TG3_FL_NOT_5788 0x4
|
||||
#define TG3_FL_NOT_5750 0x8
|
||||
u32 read_mask;
|
||||
u32 write_mask;
|
||||
} reg_tbl[] = {
|
||||
@ -8361,9 +8559,9 @@ static int tg3_test_registers(struct tg3 *tp)
|
||||
0xffffffff, 0x00000000 },
|
||||
|
||||
/* Buffer Manager Control Registers. */
|
||||
{ BUFMGR_MB_POOL_ADDR, 0x0000,
|
||||
{ BUFMGR_MB_POOL_ADDR, TG3_FL_NOT_5750,
|
||||
0x00000000, 0x007fff80 },
|
||||
{ BUFMGR_MB_POOL_SIZE, 0x0000,
|
||||
{ BUFMGR_MB_POOL_SIZE, TG3_FL_NOT_5750,
|
||||
0x00000000, 0x007fffff },
|
||||
{ BUFMGR_MB_RDMA_LOW_WATER, 0x0000,
|
||||
0x00000000, 0x0000003f },
|
||||
@ -8389,10 +8587,12 @@ static int tg3_test_registers(struct tg3 *tp)
|
||||
{ 0xffff, 0x0000, 0x00000000, 0x00000000 },
|
||||
};
|
||||
|
||||
if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS)
|
||||
is_5705 = is_5750 = 0;
|
||||
if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS) {
|
||||
is_5705 = 1;
|
||||
else
|
||||
is_5705 = 0;
|
||||
if (tp->tg3_flags2 & TG3_FLG2_5750_PLUS)
|
||||
is_5750 = 1;
|
||||
}
|
||||
|
||||
for (i = 0; reg_tbl[i].offset != 0xffff; i++) {
|
||||
if (is_5705 && (reg_tbl[i].flags & TG3_FL_NOT_5705))
|
||||
@ -8405,6 +8605,9 @@ static int tg3_test_registers(struct tg3 *tp)
|
||||
(reg_tbl[i].flags & TG3_FL_NOT_5788))
|
||||
continue;
|
||||
|
||||
if (is_5750 && (reg_tbl[i].flags & TG3_FL_NOT_5750))
|
||||
continue;
|
||||
|
||||
offset = (u32) reg_tbl[i].offset;
|
||||
read_mask = reg_tbl[i].read_mask;
|
||||
write_mask = reg_tbl[i].write_mask;
|
||||
@ -8496,6 +8699,13 @@ static int tg3_test_memory(struct tg3 *tp)
|
||||
{ 0x00008000, 0x02000},
|
||||
{ 0x00010000, 0x0c000},
|
||||
{ 0xffffffff, 0x00000}
|
||||
}, mem_tbl_5906[] = {
|
||||
{ 0x00000200, 0x00008},
|
||||
{ 0x00004000, 0x00400},
|
||||
{ 0x00006000, 0x00400},
|
||||
{ 0x00008000, 0x01000},
|
||||
{ 0x00010000, 0x01000},
|
||||
{ 0xffffffff, 0x00000}
|
||||
};
|
||||
struct mem_entry *mem_tbl;
|
||||
int err = 0;
|
||||
@ -8505,6 +8715,8 @@ static int tg3_test_memory(struct tg3 *tp)
|
||||
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 ||
|
||||
GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787)
|
||||
mem_tbl = mem_tbl_5755;
|
||||
else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906)
|
||||
mem_tbl = mem_tbl_5906;
|
||||
else
|
||||
mem_tbl = mem_tbl_5705;
|
||||
} else
|
||||
@ -8541,13 +8753,41 @@ static int tg3_run_loopback(struct tg3 *tp, int loopback_mode)
|
||||
return 0;
|
||||
|
||||
mac_mode = (tp->mac_mode & ~MAC_MODE_PORT_MODE_MASK) |
|
||||
MAC_MODE_PORT_INT_LPBACK | MAC_MODE_LINK_POLARITY |
|
||||
MAC_MODE_PORT_MODE_GMII;
|
||||
MAC_MODE_PORT_INT_LPBACK | MAC_MODE_LINK_POLARITY;
|
||||
if (tp->tg3_flags & TG3_FLAG_10_100_ONLY)
|
||||
mac_mode |= MAC_MODE_PORT_MODE_MII;
|
||||
else
|
||||
mac_mode |= MAC_MODE_PORT_MODE_GMII;
|
||||
tw32(MAC_MODE, mac_mode);
|
||||
} else if (loopback_mode == TG3_PHY_LOOPBACK) {
|
||||
tg3_writephy(tp, MII_BMCR, BMCR_LOOPBACK | BMCR_FULLDPLX |
|
||||
BMCR_SPEED1000);
|
||||
u32 val;
|
||||
|
||||
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) {
|
||||
u32 phytest;
|
||||
|
||||
if (!tg3_readphy(tp, MII_TG3_EPHY_TEST, &phytest)) {
|
||||
u32 phy;
|
||||
|
||||
tg3_writephy(tp, MII_TG3_EPHY_TEST,
|
||||
phytest | MII_TG3_EPHY_SHADOW_EN);
|
||||
if (!tg3_readphy(tp, 0x1b, &phy))
|
||||
tg3_writephy(tp, 0x1b, phy & ~0x20);
|
||||
if (!tg3_readphy(tp, 0x10, &phy))
|
||||
tg3_writephy(tp, 0x10, phy & ~0x4000);
|
||||
tg3_writephy(tp, MII_TG3_EPHY_TEST, phytest);
|
||||
}
|
||||
}
|
||||
val = BMCR_LOOPBACK | BMCR_FULLDPLX;
|
||||
if (tp->tg3_flags & TG3_FLAG_10_100_ONLY)
|
||||
val |= BMCR_SPEED100;
|
||||
else
|
||||
val |= BMCR_SPEED1000;
|
||||
|
||||
tg3_writephy(tp, MII_BMCR, val);
|
||||
udelay(40);
|
||||
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906)
|
||||
tg3_writephy(tp, MII_TG3_EPHY_PTEST, 0x1800);
|
||||
|
||||
/* reset to prevent losing 1st rx packet intermittently */
|
||||
if (tp->tg3_flags2 & TG3_FLG2_MII_SERDES) {
|
||||
tw32_f(MAC_RX_MODE, RX_MODE_RESET);
|
||||
@ -8555,7 +8795,11 @@ static int tg3_run_loopback(struct tg3 *tp, int loopback_mode)
|
||||
tw32_f(MAC_RX_MODE, tp->rx_mode);
|
||||
}
|
||||
mac_mode = (tp->mac_mode & ~MAC_MODE_PORT_MODE_MASK) |
|
||||
MAC_MODE_LINK_POLARITY | MAC_MODE_PORT_MODE_GMII;
|
||||
MAC_MODE_LINK_POLARITY;
|
||||
if (tp->tg3_flags & TG3_FLAG_10_100_ONLY)
|
||||
mac_mode |= MAC_MODE_PORT_MODE_MII;
|
||||
else
|
||||
mac_mode |= MAC_MODE_PORT_MODE_GMII;
|
||||
if ((tp->phy_id & PHY_ID_MASK) == PHY_ID_BCM5401) {
|
||||
mac_mode &= ~MAC_MODE_LINK_POLARITY;
|
||||
tg3_writephy(tp, MII_TG3_EXT_CTRL,
|
||||
@ -8604,7 +8848,8 @@ static int tg3_run_loopback(struct tg3 *tp, int loopback_mode)
|
||||
|
||||
udelay(10);
|
||||
|
||||
for (i = 0; i < 10; i++) {
|
||||
/* 250 usec to allow enough time on some 10/100 Mbps devices. */
|
||||
for (i = 0; i < 25; i++) {
|
||||
tw32_f(HOSTCC_MODE, tp->coalesce_mode | HOSTCC_MODE_ENABLE |
|
||||
HOSTCC_MODE_NOW);
|
||||
|
||||
@ -8956,7 +9201,9 @@ static void __devinit tg3_get_eeprom_size(struct tg3 *tp)
|
||||
if (tg3_nvram_read_swab(tp, 0, &magic) != 0)
|
||||
return;
|
||||
|
||||
if ((magic != TG3_EEPROM_MAGIC) && ((magic & 0xff000000) != 0xa5000000))
|
||||
if ((magic != TG3_EEPROM_MAGIC) &&
|
||||
((magic & TG3_EEPROM_MAGIC_FW_MSK) != TG3_EEPROM_MAGIC_FW) &&
|
||||
((magic & TG3_EEPROM_MAGIC_HW_MSK) != TG3_EEPROM_MAGIC_HW))
|
||||
return;
|
||||
|
||||
/*
|
||||
@ -9194,6 +9441,13 @@ static void __devinit tg3_get_5787_nvram_info(struct tg3 *tp)
|
||||
}
|
||||
}
|
||||
|
||||
static void __devinit tg3_get_5906_nvram_info(struct tg3 *tp)
|
||||
{
|
||||
tp->nvram_jedecnum = JEDEC_ATMEL;
|
||||
tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED;
|
||||
tp->nvram_pagesize = ATMEL_AT24C512_CHIP_SIZE;
|
||||
}
|
||||
|
||||
/* Chips other than 5700/5701 use the NVRAM for fetching info. */
|
||||
static void __devinit tg3_nvram_init(struct tg3 *tp)
|
||||
{
|
||||
@ -9230,6 +9484,8 @@ static void __devinit tg3_nvram_init(struct tg3 *tp)
|
||||
tg3_get_5755_nvram_info(tp);
|
||||
else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787)
|
||||
tg3_get_5787_nvram_info(tp);
|
||||
else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906)
|
||||
tg3_get_5906_nvram_info(tp);
|
||||
else
|
||||
tg3_get_nvram_info(tp);
|
||||
|
||||
@ -9703,6 +9959,12 @@ static void __devinit tg3_get_eeprom_hw_cfg(struct tg3 *tp)
|
||||
/* Assume an onboard device by default. */
|
||||
tp->tg3_flags |= TG3_FLAG_EEPROM_WRITE_PROT;
|
||||
|
||||
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) {
|
||||
if (!(tr32(PCIE_TRANSACTION_CFG) & PCIE_TRANS_CFG_LOM))
|
||||
tp->tg3_flags &= ~TG3_FLAG_EEPROM_WRITE_PROT;
|
||||
return;
|
||||
}
|
||||
|
||||
tg3_read_mem(tp, NIC_SRAM_DATA_SIG, &val);
|
||||
if (val == NIC_SRAM_DATA_SIG_MAGIC) {
|
||||
u32 nic_cfg, led_cfg;
|
||||
@ -10034,7 +10296,10 @@ static void __devinit tg3_read_partno(struct tg3 *tp)
|
||||
}
|
||||
|
||||
out_not_found:
|
||||
strcpy(tp->board_part_number, "none");
|
||||
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906)
|
||||
strcpy(tp->board_part_number, "BCM95906");
|
||||
else
|
||||
strcpy(tp->board_part_number, "none");
|
||||
}
|
||||
|
||||
static void __devinit tg3_read_fw_ver(struct tg3 *tp)
|
||||
@ -10236,6 +10501,7 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)
|
||||
GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5752 ||
|
||||
GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 ||
|
||||
GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787 ||
|
||||
GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906 ||
|
||||
(tp->tg3_flags2 & TG3_FLG2_5780_CLASS))
|
||||
tp->tg3_flags2 |= TG3_FLG2_5750_PLUS;
|
||||
|
||||
@ -10245,7 +10511,8 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)
|
||||
|
||||
if (tp->tg3_flags2 & TG3_FLG2_5750_PLUS) {
|
||||
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 ||
|
||||
GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787) {
|
||||
GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787 ||
|
||||
GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) {
|
||||
tp->tg3_flags2 |= TG3_FLG2_HW_TSO_2;
|
||||
tp->tg3_flags2 |= TG3_FLG2_1SHOT_MSI;
|
||||
} else {
|
||||
@ -10262,7 +10529,8 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)
|
||||
GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5750 &&
|
||||
GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5752 &&
|
||||
GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5755 &&
|
||||
GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5787)
|
||||
GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5787 &&
|
||||
GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5906)
|
||||
tp->tg3_flags2 |= TG3_FLG2_JUMBO_CAPABLE;
|
||||
|
||||
if (pci_find_capability(tp->pdev, PCI_CAP_ID_EXP) != 0)
|
||||
@ -10392,6 +10660,12 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)
|
||||
pci_cmd &= ~PCI_COMMAND_MEMORY;
|
||||
pci_write_config_word(tp->pdev, PCI_COMMAND, pci_cmd);
|
||||
}
|
||||
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) {
|
||||
tp->read32_mbox = tg3_read32_mbox_5906;
|
||||
tp->write32_mbox = tg3_write32_mbox_5906;
|
||||
tp->write32_tx_mbox = tg3_write32_mbox_5906;
|
||||
tp->write32_rx_mbox = tg3_write32_mbox_5906;
|
||||
}
|
||||
|
||||
if (tp->write32 == tg3_write_indirect_reg32 ||
|
||||
((tp->tg3_flags & TG3_FLAG_PCIX_MODE) &&
|
||||
@ -10463,6 +10737,7 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)
|
||||
((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) &&
|
||||
(tp->pci_chip_rev_id != CHIPREV_ID_5705_A0) &&
|
||||
(tp->pci_chip_rev_id != CHIPREV_ID_5705_A1)) ||
|
||||
(GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) ||
|
||||
(tp->tg3_flags2 & TG3_FLG2_ANY_SERDES))
|
||||
tp->tg3_flags2 |= TG3_FLG2_NO_ETH_WIRE_SPEED;
|
||||
|
||||
@ -10476,7 +10751,7 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)
|
||||
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 ||
|
||||
GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787)
|
||||
tp->tg3_flags2 |= TG3_FLG2_PHY_JITTER_BUG;
|
||||
else
|
||||
else if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5906)
|
||||
tp->tg3_flags2 |= TG3_FLG2_PHY_BER_BUG;
|
||||
}
|
||||
|
||||
@ -10566,7 +10841,8 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)
|
||||
tp->pdev->device == PCI_DEVICE_ID_TIGON3_5705F)) ||
|
||||
(tp->pdev->vendor == PCI_VENDOR_ID_BROADCOM &&
|
||||
(tp->pdev->device == PCI_DEVICE_ID_TIGON3_5751F ||
|
||||
tp->pdev->device == PCI_DEVICE_ID_TIGON3_5753F)))
|
||||
tp->pdev->device == PCI_DEVICE_ID_TIGON3_5753F)) ||
|
||||
GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906)
|
||||
tp->tg3_flags |= TG3_FLAG_10_100_ONLY;
|
||||
|
||||
err = tg3_phy_probe(tp);
|
||||
@ -10617,7 +10893,8 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)
|
||||
* straddle the 4GB address boundary in some cases.
|
||||
*/
|
||||
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 ||
|
||||
GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787)
|
||||
GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787 ||
|
||||
GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906)
|
||||
tp->dev->hard_start_xmit = tg3_start_xmit;
|
||||
else
|
||||
tp->dev->hard_start_xmit = tg3_start_xmit_dma_bug;
|
||||
@ -10698,6 +10975,8 @@ static int __devinit tg3_get_device_address(struct tg3 *tp)
|
||||
else
|
||||
tg3_nvram_unlock(tp);
|
||||
}
|
||||
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906)
|
||||
mac_offset = 0x10;
|
||||
|
||||
/* First try to get it from MAC address mailbox. */
|
||||
tg3_read_mem(tp, NIC_SRAM_MAC_ADDR_HIGH_MBOX, &hi);
|
||||
@ -11181,6 +11460,12 @@ static void __devinit tg3_init_bufmgr_config(struct tg3 *tp)
|
||||
DEFAULT_MB_MACRX_LOW_WATER_5705;
|
||||
tp->bufmgr_config.mbuf_high_water =
|
||||
DEFAULT_MB_HIGH_WATER_5705;
|
||||
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) {
|
||||
tp->bufmgr_config.mbuf_mac_rx_low_water =
|
||||
DEFAULT_MB_MACRX_LOW_WATER_5906;
|
||||
tp->bufmgr_config.mbuf_high_water =
|
||||
DEFAULT_MB_HIGH_WATER_5906;
|
||||
}
|
||||
|
||||
tp->bufmgr_config.mbuf_read_dma_low_water_jumbo =
|
||||
DEFAULT_MB_RDMA_LOW_WATER_JUMBO_5780;
|
||||
@ -11224,6 +11509,8 @@ static char * __devinit tg3_phy_string(struct tg3 *tp)
|
||||
case PHY_ID_BCM5780: return "5780";
|
||||
case PHY_ID_BCM5755: return "5755";
|
||||
case PHY_ID_BCM5787: return "5787";
|
||||
case PHY_ID_BCM5756: return "5722/5756";
|
||||
case PHY_ID_BCM5906: return "5906";
|
||||
case PHY_ID_BCM8002: return "8002/serdes";
|
||||
case 0: return "serdes";
|
||||
default: return "unknown";
|
||||
@ -11526,7 +11813,8 @@ static int __devinit tg3_init_one(struct pci_dev *pdev,
|
||||
*/
|
||||
if (tp->tg3_flags2 & TG3_FLG2_HW_TSO) {
|
||||
dev->features |= NETIF_F_TSO;
|
||||
if (tp->tg3_flags2 & TG3_FLG2_HW_TSO_2)
|
||||
if ((tp->tg3_flags2 & TG3_FLG2_HW_TSO_2) &&
|
||||
(GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5906))
|
||||
dev->features |= NETIF_F_TSO6;
|
||||
}
|
||||
|
||||
|
@ -24,6 +24,8 @@
|
||||
|
||||
#define RX_COPY_THRESHOLD 256
|
||||
|
||||
#define TG3_RX_INTERNAL_RING_SZ_5906 32
|
||||
|
||||
#define RX_STD_MAX_SIZE 1536
|
||||
#define RX_STD_MAX_SIZE_5705 512
|
||||
#define RX_JUMBO_MAX_SIZE 0xdeadbeef /* XXX */
|
||||
@ -129,6 +131,7 @@
|
||||
#define CHIPREV_ID_5752_A0_HW 0x5000
|
||||
#define CHIPREV_ID_5752_A0 0x6000
|
||||
#define CHIPREV_ID_5752_A1 0x6001
|
||||
#define CHIPREV_ID_5906_A1 0xc001
|
||||
#define GET_ASIC_REV(CHIP_REV_ID) ((CHIP_REV_ID) >> 12)
|
||||
#define ASIC_REV_5700 0x07
|
||||
#define ASIC_REV_5701 0x00
|
||||
@ -141,6 +144,7 @@
|
||||
#define ASIC_REV_5714 0x09
|
||||
#define ASIC_REV_5755 0x0a
|
||||
#define ASIC_REV_5787 0x0b
|
||||
#define ASIC_REV_5906 0x0c
|
||||
#define GET_CHIP_REV(CHIP_REV_ID) ((CHIP_REV_ID) >> 8)
|
||||
#define CHIPREV_5700_AX 0x70
|
||||
#define CHIPREV_5700_BX 0x71
|
||||
@ -646,7 +650,8 @@
|
||||
#define SNDDATAI_SCTRL_FORCE_ZERO 0x00000010
|
||||
#define SNDDATAI_STATSENAB 0x00000c0c
|
||||
#define SNDDATAI_STATSINCMASK 0x00000c10
|
||||
/* 0xc14 --> 0xc80 unused */
|
||||
#define ISO_PKT_TX 0x00000c20
|
||||
/* 0xc24 --> 0xc80 unused */
|
||||
#define SNDDATAI_COS_CNT_0 0x00000c80
|
||||
#define SNDDATAI_COS_CNT_1 0x00000c84
|
||||
#define SNDDATAI_COS_CNT_2 0x00000c88
|
||||
@ -997,11 +1002,13 @@
|
||||
#define BUFMGR_MB_MACRX_LOW_WATER 0x00004414
|
||||
#define DEFAULT_MB_MACRX_LOW_WATER 0x00000020
|
||||
#define DEFAULT_MB_MACRX_LOW_WATER_5705 0x00000010
|
||||
#define DEFAULT_MB_MACRX_LOW_WATER_5906 0x00000004
|
||||
#define DEFAULT_MB_MACRX_LOW_WATER_JUMBO 0x00000098
|
||||
#define DEFAULT_MB_MACRX_LOW_WATER_JUMBO_5780 0x0000004b
|
||||
#define BUFMGR_MB_HIGH_WATER 0x00004418
|
||||
#define DEFAULT_MB_HIGH_WATER 0x00000060
|
||||
#define DEFAULT_MB_HIGH_WATER_5705 0x00000060
|
||||
#define DEFAULT_MB_HIGH_WATER_5906 0x00000010
|
||||
#define DEFAULT_MB_HIGH_WATER_JUMBO 0x0000017c
|
||||
#define DEFAULT_MB_HIGH_WATER_JUMBO_5780 0x00000096
|
||||
#define BUFMGR_RX_MB_ALLOC_REQ 0x0000441c
|
||||
@ -1138,7 +1145,12 @@
|
||||
#define TX_CPU_STATE 0x00005404
|
||||
#define TX_CPU_PGMCTR 0x0000541c
|
||||
|
||||
#define VCPU_STATUS 0x00005100
|
||||
#define VCPU_STATUS_INIT_DONE 0x04000000
|
||||
#define VCPU_STATUS_DRV_RESET 0x08000000
|
||||
|
||||
/* Mailboxes */
|
||||
#define GRCMBOX_BASE 0x00005600
|
||||
#define GRCMBOX_INTERRUPT_0 0x00005800 /* 64-bit */
|
||||
#define GRCMBOX_INTERRUPT_1 0x00005808 /* 64-bit */
|
||||
#define GRCMBOX_INTERRUPT_2 0x00005810 /* 64-bit */
|
||||
@ -1398,7 +1410,10 @@
|
||||
#define GRC_EEPROM_CTRL 0x00006840
|
||||
#define GRC_MDI_CTRL 0x00006844
|
||||
#define GRC_SEEPROM_DELAY 0x00006848
|
||||
/* 0x684c --> 0x6c00 unused */
|
||||
/* 0x684c --> 0x6890 unused */
|
||||
#define GRC_VCPU_EXT_CTRL 0x00006890
|
||||
#define GRC_VCPU_EXT_CTRL_HALT_CPU 0x00400000
|
||||
#define GRC_VCPU_EXT_CTRL_DISABLE_WOL 0x20000000
|
||||
#define GRC_FASTBOOT_PC 0x00006894 /* 5752, 5755, 5787 */
|
||||
|
||||
/* 0x6c00 --> 0x7000 unused */
|
||||
@ -1485,9 +1500,17 @@
|
||||
#define NVRAM_WRITE1 0x00007028
|
||||
/* 0x702c --> 0x7400 unused */
|
||||
|
||||
/* 0x7400 --> 0x8000 unused */
|
||||
/* 0x7400 --> 0x7c00 unused */
|
||||
#define PCIE_TRANSACTION_CFG 0x00007c04
|
||||
#define PCIE_TRANS_CFG_1SHOT_MSI 0x20000000
|
||||
#define PCIE_TRANS_CFG_LOM 0x00000020
|
||||
|
||||
|
||||
#define TG3_EEPROM_MAGIC 0x669955aa
|
||||
#define TG3_EEPROM_MAGIC_FW 0xa5000000
|
||||
#define TG3_EEPROM_MAGIC_FW_MSK 0xff000000
|
||||
#define TG3_EEPROM_MAGIC_HW 0xabcd
|
||||
#define TG3_EEPROM_MAGIC_HW_MSK 0xffff
|
||||
|
||||
/* 32K Window into NIC internal memory */
|
||||
#define NIC_SRAM_WIN_BASE 0x00008000
|
||||
@ -1537,6 +1560,7 @@
|
||||
#define FWCMD_NICDRV_FIX_DMAR 0x00000005
|
||||
#define FWCMD_NICDRV_FIX_DMAW 0x00000006
|
||||
#define FWCMD_NICDRV_ALIVE2 0x0000000d
|
||||
#define FWCMD_NICDRV_ALIVE3 0x0000000e
|
||||
#define NIC_SRAM_FW_CMD_LEN_MBOX 0x00000b7c
|
||||
#define NIC_SRAM_FW_CMD_DATA_MBOX 0x00000b80
|
||||
#define NIC_SRAM_FW_ASF_STATUS_MBOX 0x00000c00
|
||||
@ -1604,6 +1628,7 @@
|
||||
#define MII_TG3_DSP_RW_PORT 0x15 /* DSP coefficient read/write port */
|
||||
|
||||
#define MII_TG3_DSP_ADDRESS 0x17 /* DSP address register */
|
||||
#define MII_TG3_EPHY_PTEST 0x17 /* 5906 PHY register */
|
||||
|
||||
#define MII_TG3_AUX_CTRL 0x18 /* auxilliary control register */
|
||||
|
||||
@ -1617,6 +1642,8 @@
|
||||
#define MII_TG3_AUX_STAT_100FULL 0x0500
|
||||
#define MII_TG3_AUX_STAT_1000HALF 0x0600
|
||||
#define MII_TG3_AUX_STAT_1000FULL 0x0700
|
||||
#define MII_TG3_AUX_STAT_100 0x0008
|
||||
#define MII_TG3_AUX_STAT_FULL 0x0001
|
||||
|
||||
#define MII_TG3_ISTAT 0x1a /* IRQ status register */
|
||||
#define MII_TG3_IMASK 0x1b /* IRQ mask register */
|
||||
@ -1627,6 +1654,9 @@
|
||||
#define MII_TG3_INT_DUPLEXCHG 0x0008
|
||||
#define MII_TG3_INT_ANEG_PAGE_RX 0x0400
|
||||
|
||||
#define MII_TG3_EPHY_TEST 0x1f /* 5906 PHY register */
|
||||
#define MII_TG3_EPHY_SHADOW_EN 0x80
|
||||
|
||||
/* There are two ways to manage the TX descriptors on the tigon3.
|
||||
* Either the descriptors are in host DMA'able memory, or they
|
||||
* exist only in the cards on-chip SRAM. All 16 send bds are under
|
||||
@ -2203,7 +2233,6 @@ struct tg3 {
|
||||
#define TG3_FLG2_PCI_EXPRESS 0x00000200
|
||||
#define TG3_FLG2_ASF_NEW_HANDSHAKE 0x00000400
|
||||
#define TG3_FLG2_HW_AUTONEG 0x00000800
|
||||
#define TG3_FLG2_PHY_JUST_INITTED 0x00001000
|
||||
#define TG3_FLG2_PHY_SERDES 0x00002000
|
||||
#define TG3_FLG2_CAPACITIVE_COUPLING 0x00004000
|
||||
#define TG3_FLG2_FLASH 0x00008000
|
||||
@ -2236,6 +2265,12 @@ struct tg3 {
|
||||
u16 asf_counter;
|
||||
u16 asf_multiplier;
|
||||
|
||||
/* 1 second counter for transient serdes link events */
|
||||
u32 serdes_counter;
|
||||
#define SERDES_AN_TIMEOUT_5704S 2
|
||||
#define SERDES_PARALLEL_DET_TIMEOUT 1
|
||||
#define SERDES_AN_TIMEOUT_5714S 1
|
||||
|
||||
struct tg3_link_config link_config;
|
||||
struct tg3_bufmgr_config bufmgr_config;
|
||||
|
||||
@ -2276,6 +2311,8 @@ struct tg3 {
|
||||
#define PHY_ID_BCM5780 0x60008350
|
||||
#define PHY_ID_BCM5755 0xbc050cc0
|
||||
#define PHY_ID_BCM5787 0xbc050ce0
|
||||
#define PHY_ID_BCM5756 0xbc050ed0
|
||||
#define PHY_ID_BCM5906 0xdc00ac40
|
||||
#define PHY_ID_BCM8002 0x60010140
|
||||
#define PHY_ID_INVALID 0xffffffff
|
||||
#define PHY_ID_REV_MASK 0x0000000f
|
||||
@ -2302,7 +2339,8 @@ struct tg3 {
|
||||
(X) == PHY_ID_BCM5705 || (X) == PHY_ID_BCM5750 || \
|
||||
(X) == PHY_ID_BCM5752 || (X) == PHY_ID_BCM5714 || \
|
||||
(X) == PHY_ID_BCM5780 || (X) == PHY_ID_BCM5787 || \
|
||||
(X) == PHY_ID_BCM5755 || (X) == PHY_ID_BCM8002)
|
||||
(X) == PHY_ID_BCM5755 || (X) == PHY_ID_BCM5756 || \
|
||||
(X) == PHY_ID_BCM5906 || (X) == PHY_ID_BCM8002)
|
||||
|
||||
struct tg3_hw_stats *hw_stats;
|
||||
dma_addr_t stats_mapping;
|
||||
|
@ -161,7 +161,7 @@ static int cisco_rx(struct sk_buff *skb)
|
||||
struct hdlc_header *data = (struct hdlc_header*)skb->data;
|
||||
struct cisco_packet *cisco_data;
|
||||
struct in_device *in_dev;
|
||||
u32 addr, mask;
|
||||
__be32 addr, mask;
|
||||
|
||||
if (skb->len < sizeof(struct hdlc_header))
|
||||
goto rx_error;
|
||||
|
@ -763,7 +763,7 @@ static void sppp_cisco_input (struct sppp *sp, struct sk_buff *skb)
|
||||
{
|
||||
struct in_device *in_dev;
|
||||
struct in_ifaddr *ifa;
|
||||
u32 addr = 0, mask = ~0; /* FIXME: is the mask correct? */
|
||||
__be32 addr = 0, mask = ~0; /* FIXME: is the mask correct? */
|
||||
#ifdef CONFIG_INET
|
||||
rcu_read_lock();
|
||||
if ((in_dev = __in_dev_get_rcu(dev)) != NULL)
|
||||
|
@ -1342,7 +1342,7 @@ static unsigned char *strip_make_packet(unsigned char *buffer,
|
||||
* 'broadcast hub' radio (First byte of address being 0xFF means broadcast)
|
||||
*/
|
||||
if (haddr.c[0] == 0xFF) {
|
||||
u32 brd = 0;
|
||||
__be32 brd = 0;
|
||||
struct in_device *in_dev;
|
||||
|
||||
rcu_read_lock();
|
||||
@ -1406,7 +1406,7 @@ static void strip_send(struct strip *strip_info, struct sk_buff *skb)
|
||||
int doreset = (long) jiffies - strip_info->watchdog_doreset >= 0;
|
||||
int doprobe = (long) jiffies - strip_info->watchdog_doprobe >= 0
|
||||
&& !doreset;
|
||||
u32 addr, brd;
|
||||
__be32 addr, brd;
|
||||
|
||||
/*
|
||||
* 1. If we have a packet, encapsulate it and put it in the buffer
|
||||
|
@ -8067,7 +8067,7 @@ qeth_arp_constructor(struct neighbour *neigh)
|
||||
neigh->parms = neigh_parms_clone(parms);
|
||||
rcu_read_unlock();
|
||||
|
||||
neigh->type = inet_addr_type(*(u32 *) neigh->primary_key);
|
||||
neigh->type = inet_addr_type(*(__be32 *) neigh->primary_key);
|
||||
neigh->nud_state = NUD_NOARP;
|
||||
neigh->ops = arp_direct_ops;
|
||||
neigh->output = neigh->ops->queue_xmit;
|
||||
|
@ -58,6 +58,7 @@ header-y += elf-em.h
|
||||
header-y += fadvise.h
|
||||
header-y += fd.h
|
||||
header-y += fdreg.h
|
||||
header-y += fib_rules.h
|
||||
header-y += ftape-header-segment.h
|
||||
header-y += ftape-vendors.h
|
||||
header-y += fuse.h
|
||||
@ -70,6 +71,7 @@ header-y += hysdn_if.h
|
||||
header-y += i2c-dev.h
|
||||
header-y += i8k.h
|
||||
header-y += icmp.h
|
||||
header-y += if_addr.h
|
||||
header-y += if_arcnet.h
|
||||
header-y += if_arp.h
|
||||
header-y += if_bonding.h
|
||||
@ -79,6 +81,7 @@ header-y += if_fddi.h
|
||||
header-y += if.h
|
||||
header-y += if_hippi.h
|
||||
header-y += if_infiniband.h
|
||||
header-y += if_link.h
|
||||
header-y += if_packet.h
|
||||
header-y += if_plip.h
|
||||
header-y += if_ppp.h
|
||||
@ -110,6 +113,7 @@ header-y += mmtimer.h
|
||||
header-y += mqueue.h
|
||||
header-y += mtio.h
|
||||
header-y += ncp_no.h
|
||||
header-y += neighbour.h
|
||||
header-y += netfilter_arp.h
|
||||
header-y += netrom.h
|
||||
header-y += nfs2.h
|
||||
|
@ -88,15 +88,7 @@ static inline struct atalk_sock *at_sk(struct sock *sk)
|
||||
#include <asm/byteorder.h>
|
||||
|
||||
struct ddpehdr {
|
||||
#ifdef __LITTLE_ENDIAN_BITFIELD
|
||||
__u16 deh_len:10,
|
||||
deh_hops:4,
|
||||
deh_pad:2;
|
||||
#else
|
||||
__u16 deh_pad:2,
|
||||
deh_hops:4,
|
||||
deh_len:10;
|
||||
#endif
|
||||
__be16 deh_len_hops; /* lower 10 bits are length, next 4 - hops */
|
||||
__be16 deh_sum;
|
||||
__be16 deh_dnet;
|
||||
__be16 deh_snet;
|
||||
@ -112,36 +104,6 @@ static __inline__ struct ddpehdr *ddp_hdr(struct sk_buff *skb)
|
||||
return (struct ddpehdr *)skb->h.raw;
|
||||
}
|
||||
|
||||
/*
|
||||
* Don't drop the struct into the struct above. You'll get some
|
||||
* surprise padding.
|
||||
*/
|
||||
struct ddpebits {
|
||||
#ifdef __LITTLE_ENDIAN_BITFIELD
|
||||
__u16 deh_len:10,
|
||||
deh_hops:4,
|
||||
deh_pad:2;
|
||||
#else
|
||||
__u16 deh_pad:2,
|
||||
deh_hops:4,
|
||||
deh_len:10;
|
||||
#endif
|
||||
};
|
||||
|
||||
/* Short form header */
|
||||
struct ddpshdr {
|
||||
#ifdef __LITTLE_ENDIAN_BITFIELD
|
||||
__u16 dsh_len:10,
|
||||
dsh_pad:6;
|
||||
#else
|
||||
__u16 dsh_pad:6,
|
||||
dsh_len:10;
|
||||
#endif
|
||||
__u8 dsh_dport;
|
||||
__u8 dsh_sport;
|
||||
/* And netatalk apps expect to stick the type in themselves */
|
||||
};
|
||||
|
||||
/* AppleTalk AARP headers */
|
||||
struct elapaarp {
|
||||
__be16 hw_type;
|
||||
|
@ -95,6 +95,12 @@
|
||||
#define AUDIT_MAC_POLICY_LOAD 1403 /* Policy file load */
|
||||
#define AUDIT_MAC_STATUS 1404 /* Changed enforcing,permissive,off */
|
||||
#define AUDIT_MAC_CONFIG_CHANGE 1405 /* Changes to booleans */
|
||||
#define AUDIT_MAC_UNLBL_ACCEPT 1406 /* NetLabel: allow unlabeled traffic */
|
||||
#define AUDIT_MAC_UNLBL_DENY 1407 /* NetLabel: deny unlabeled traffic */
|
||||
#define AUDIT_MAC_CIPSOV4_ADD 1408 /* NetLabel: add CIPSOv4 DOI entry */
|
||||
#define AUDIT_MAC_CIPSOV4_DEL 1409 /* NetLabel: del CIPSOv4 DOI entry */
|
||||
#define AUDIT_MAC_MAP_ADD 1410 /* NetLabel: add LSM domain mapping */
|
||||
#define AUDIT_MAC_MAP_DEL 1411 /* NetLabel: del LSM domain mapping */
|
||||
|
||||
#define AUDIT_FIRST_KERN_ANOM_MSG 1700
|
||||
#define AUDIT_LAST_KERN_ANOM_MSG 1799
|
||||
|
@ -38,7 +38,7 @@ struct sock_exterr_skb
|
||||
} header;
|
||||
struct sock_extended_err ee;
|
||||
u16 addr_offset;
|
||||
u16 port;
|
||||
__be16 port;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@ -68,16 +68,16 @@
|
||||
struct icmphdr {
|
||||
__u8 type;
|
||||
__u8 code;
|
||||
__u16 checksum;
|
||||
__be16 checksum;
|
||||
union {
|
||||
struct {
|
||||
__u16 id;
|
||||
__u16 sequence;
|
||||
__be16 id;
|
||||
__be16 sequence;
|
||||
} echo;
|
||||
__u32 gateway;
|
||||
__be32 gateway;
|
||||
struct {
|
||||
__u16 __unused;
|
||||
__u16 mtu;
|
||||
__be16 __unused;
|
||||
__be16 mtu;
|
||||
} frag;
|
||||
} un;
|
||||
};
|
||||
|
@ -214,134 +214,4 @@ struct ifconf
|
||||
#define ifc_buf ifc_ifcu.ifcu_buf /* buffer address */
|
||||
#define ifc_req ifc_ifcu.ifcu_req /* array of structures */
|
||||
|
||||
/* The struct should be in sync with struct net_device_stats */
|
||||
struct rtnl_link_stats
|
||||
{
|
||||
__u32 rx_packets; /* total packets received */
|
||||
__u32 tx_packets; /* total packets transmitted */
|
||||
__u32 rx_bytes; /* total bytes received */
|
||||
__u32 tx_bytes; /* total bytes transmitted */
|
||||
__u32 rx_errors; /* bad packets received */
|
||||
__u32 tx_errors; /* packet transmit problems */
|
||||
__u32 rx_dropped; /* no space in linux buffers */
|
||||
__u32 tx_dropped; /* no space available in linux */
|
||||
__u32 multicast; /* multicast packets received */
|
||||
__u32 collisions;
|
||||
|
||||
/* detailed rx_errors: */
|
||||
__u32 rx_length_errors;
|
||||
__u32 rx_over_errors; /* receiver ring buff overflow */
|
||||
__u32 rx_crc_errors; /* recved pkt with crc error */
|
||||
__u32 rx_frame_errors; /* recv'd frame alignment error */
|
||||
__u32 rx_fifo_errors; /* recv'r fifo overrun */
|
||||
__u32 rx_missed_errors; /* receiver missed packet */
|
||||
|
||||
/* detailed tx_errors */
|
||||
__u32 tx_aborted_errors;
|
||||
__u32 tx_carrier_errors;
|
||||
__u32 tx_fifo_errors;
|
||||
__u32 tx_heartbeat_errors;
|
||||
__u32 tx_window_errors;
|
||||
|
||||
/* for cslip etc */
|
||||
__u32 rx_compressed;
|
||||
__u32 tx_compressed;
|
||||
};
|
||||
|
||||
/* The struct should be in sync with struct ifmap */
|
||||
struct rtnl_link_ifmap
|
||||
{
|
||||
__u64 mem_start;
|
||||
__u64 mem_end;
|
||||
__u64 base_addr;
|
||||
__u16 irq;
|
||||
__u8 dma;
|
||||
__u8 port;
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
IFLA_UNSPEC,
|
||||
IFLA_ADDRESS,
|
||||
IFLA_BROADCAST,
|
||||
IFLA_IFNAME,
|
||||
IFLA_MTU,
|
||||
IFLA_LINK,
|
||||
IFLA_QDISC,
|
||||
IFLA_STATS,
|
||||
IFLA_COST,
|
||||
#define IFLA_COST IFLA_COST
|
||||
IFLA_PRIORITY,
|
||||
#define IFLA_PRIORITY IFLA_PRIORITY
|
||||
IFLA_MASTER,
|
||||
#define IFLA_MASTER IFLA_MASTER
|
||||
IFLA_WIRELESS, /* Wireless Extension event - see wireless.h */
|
||||
#define IFLA_WIRELESS IFLA_WIRELESS
|
||||
IFLA_PROTINFO, /* Protocol specific information for a link */
|
||||
#define IFLA_PROTINFO IFLA_PROTINFO
|
||||
IFLA_TXQLEN,
|
||||
#define IFLA_TXQLEN IFLA_TXQLEN
|
||||
IFLA_MAP,
|
||||
#define IFLA_MAP IFLA_MAP
|
||||
IFLA_WEIGHT,
|
||||
#define IFLA_WEIGHT IFLA_WEIGHT
|
||||
IFLA_OPERSTATE,
|
||||
IFLA_LINKMODE,
|
||||
__IFLA_MAX
|
||||
};
|
||||
|
||||
|
||||
#define IFLA_MAX (__IFLA_MAX - 1)
|
||||
|
||||
/* ifi_flags.
|
||||
|
||||
IFF_* flags.
|
||||
|
||||
The only change is:
|
||||
IFF_LOOPBACK, IFF_BROADCAST and IFF_POINTOPOINT are
|
||||
more not changeable by user. They describe link media
|
||||
characteristics and set by device driver.
|
||||
|
||||
Comments:
|
||||
- Combination IFF_BROADCAST|IFF_POINTOPOINT is invalid
|
||||
- If neither of these three flags are set;
|
||||
the interface is NBMA.
|
||||
|
||||
- IFF_MULTICAST does not mean anything special:
|
||||
multicasts can be used on all not-NBMA links.
|
||||
IFF_MULTICAST means that this media uses special encapsulation
|
||||
for multicast frames. Apparently, all IFF_POINTOPOINT and
|
||||
IFF_BROADCAST devices are able to use multicasts too.
|
||||
*/
|
||||
|
||||
/* IFLA_LINK.
|
||||
For usual devices it is equal ifi_index.
|
||||
If it is a "virtual interface" (f.e. tunnel), ifi_link
|
||||
can point to real physical interface (f.e. for bandwidth calculations),
|
||||
or maybe 0, what means, that real media is unknown (usual
|
||||
for IPIP tunnels, when route to endpoint is allowed to change)
|
||||
*/
|
||||
|
||||
/* Subtype attributes for IFLA_PROTINFO */
|
||||
enum
|
||||
{
|
||||
IFLA_INET6_UNSPEC,
|
||||
IFLA_INET6_FLAGS, /* link flags */
|
||||
IFLA_INET6_CONF, /* sysctl parameters */
|
||||
IFLA_INET6_STATS, /* statistics */
|
||||
IFLA_INET6_MCAST, /* MC things. What of them? */
|
||||
IFLA_INET6_CACHEINFO, /* time values and max reasm size */
|
||||
__IFLA_INET6_MAX
|
||||
};
|
||||
|
||||
#define IFLA_INET6_MAX (__IFLA_INET6_MAX - 1)
|
||||
|
||||
struct ifla_cacheinfo
|
||||
{
|
||||
__u32 max_reasm_len;
|
||||
__u32 tstamp; /* ipv6InterfaceTable updated timestamp */
|
||||
__u32 reachable_time;
|
||||
__u32 retrans_time;
|
||||
};
|
||||
|
||||
#endif /* _LINUX_IF_H */
|
||||
|
@ -130,11 +130,11 @@ struct arpreq_old {
|
||||
|
||||
struct arphdr
|
||||
{
|
||||
unsigned short ar_hrd; /* format of hardware address */
|
||||
unsigned short ar_pro; /* format of protocol address */
|
||||
__be16 ar_hrd; /* format of hardware address */
|
||||
__be16 ar_pro; /* format of protocol address */
|
||||
unsigned char ar_hln; /* length of hardware address */
|
||||
unsigned char ar_pln; /* length of protocol address */
|
||||
unsigned short ar_op; /* ARP opcode (command) */
|
||||
__be16 ar_op; /* ARP opcode (command) */
|
||||
|
||||
#if 0
|
||||
/*
|
||||
|
136
include/linux/if_link.h
Normal file
136
include/linux/if_link.h
Normal file
@ -0,0 +1,136 @@
|
||||
#ifndef _LINUX_IF_LINK_H
|
||||
#define _LINUX_IF_LINK_H
|
||||
|
||||
#include <linux/netlink.h>
|
||||
|
||||
/* The struct should be in sync with struct net_device_stats */
|
||||
struct rtnl_link_stats
|
||||
{
|
||||
__u32 rx_packets; /* total packets received */
|
||||
__u32 tx_packets; /* total packets transmitted */
|
||||
__u32 rx_bytes; /* total bytes received */
|
||||
__u32 tx_bytes; /* total bytes transmitted */
|
||||
__u32 rx_errors; /* bad packets received */
|
||||
__u32 tx_errors; /* packet transmit problems */
|
||||
__u32 rx_dropped; /* no space in linux buffers */
|
||||
__u32 tx_dropped; /* no space available in linux */
|
||||
__u32 multicast; /* multicast packets received */
|
||||
__u32 collisions;
|
||||
|
||||
/* detailed rx_errors: */
|
||||
__u32 rx_length_errors;
|
||||
__u32 rx_over_errors; /* receiver ring buff overflow */
|
||||
__u32 rx_crc_errors; /* recved pkt with crc error */
|
||||
__u32 rx_frame_errors; /* recv'd frame alignment error */
|
||||
__u32 rx_fifo_errors; /* recv'r fifo overrun */
|
||||
__u32 rx_missed_errors; /* receiver missed packet */
|
||||
|
||||
/* detailed tx_errors */
|
||||
__u32 tx_aborted_errors;
|
||||
__u32 tx_carrier_errors;
|
||||
__u32 tx_fifo_errors;
|
||||
__u32 tx_heartbeat_errors;
|
||||
__u32 tx_window_errors;
|
||||
|
||||
/* for cslip etc */
|
||||
__u32 rx_compressed;
|
||||
__u32 tx_compressed;
|
||||
};
|
||||
|
||||
/* The struct should be in sync with struct ifmap */
|
||||
struct rtnl_link_ifmap
|
||||
{
|
||||
__u64 mem_start;
|
||||
__u64 mem_end;
|
||||
__u64 base_addr;
|
||||
__u16 irq;
|
||||
__u8 dma;
|
||||
__u8 port;
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
IFLA_UNSPEC,
|
||||
IFLA_ADDRESS,
|
||||
IFLA_BROADCAST,
|
||||
IFLA_IFNAME,
|
||||
IFLA_MTU,
|
||||
IFLA_LINK,
|
||||
IFLA_QDISC,
|
||||
IFLA_STATS,
|
||||
IFLA_COST,
|
||||
#define IFLA_COST IFLA_COST
|
||||
IFLA_PRIORITY,
|
||||
#define IFLA_PRIORITY IFLA_PRIORITY
|
||||
IFLA_MASTER,
|
||||
#define IFLA_MASTER IFLA_MASTER
|
||||
IFLA_WIRELESS, /* Wireless Extension event - see wireless.h */
|
||||
#define IFLA_WIRELESS IFLA_WIRELESS
|
||||
IFLA_PROTINFO, /* Protocol specific information for a link */
|
||||
#define IFLA_PROTINFO IFLA_PROTINFO
|
||||
IFLA_TXQLEN,
|
||||
#define IFLA_TXQLEN IFLA_TXQLEN
|
||||
IFLA_MAP,
|
||||
#define IFLA_MAP IFLA_MAP
|
||||
IFLA_WEIGHT,
|
||||
#define IFLA_WEIGHT IFLA_WEIGHT
|
||||
IFLA_OPERSTATE,
|
||||
IFLA_LINKMODE,
|
||||
__IFLA_MAX
|
||||
};
|
||||
|
||||
|
||||
#define IFLA_MAX (__IFLA_MAX - 1)
|
||||
|
||||
/* ifi_flags.
|
||||
|
||||
IFF_* flags.
|
||||
|
||||
The only change is:
|
||||
IFF_LOOPBACK, IFF_BROADCAST and IFF_POINTOPOINT are
|
||||
more not changeable by user. They describe link media
|
||||
characteristics and set by device driver.
|
||||
|
||||
Comments:
|
||||
- Combination IFF_BROADCAST|IFF_POINTOPOINT is invalid
|
||||
- If neither of these three flags are set;
|
||||
the interface is NBMA.
|
||||
|
||||
- IFF_MULTICAST does not mean anything special:
|
||||
multicasts can be used on all not-NBMA links.
|
||||
IFF_MULTICAST means that this media uses special encapsulation
|
||||
for multicast frames. Apparently, all IFF_POINTOPOINT and
|
||||
IFF_BROADCAST devices are able to use multicasts too.
|
||||
*/
|
||||
|
||||
/* IFLA_LINK.
|
||||
For usual devices it is equal ifi_index.
|
||||
If it is a "virtual interface" (f.e. tunnel), ifi_link
|
||||
can point to real physical interface (f.e. for bandwidth calculations),
|
||||
or maybe 0, what means, that real media is unknown (usual
|
||||
for IPIP tunnels, when route to endpoint is allowed to change)
|
||||
*/
|
||||
|
||||
/* Subtype attributes for IFLA_PROTINFO */
|
||||
enum
|
||||
{
|
||||
IFLA_INET6_UNSPEC,
|
||||
IFLA_INET6_FLAGS, /* link flags */
|
||||
IFLA_INET6_CONF, /* sysctl parameters */
|
||||
IFLA_INET6_STATS, /* statistics */
|
||||
IFLA_INET6_MCAST, /* MC things. What of them? */
|
||||
IFLA_INET6_CACHEINFO, /* time values and max reasm size */
|
||||
__IFLA_INET6_MAX
|
||||
};
|
||||
|
||||
#define IFLA_INET6_MAX (__IFLA_INET6_MAX - 1)
|
||||
|
||||
struct ifla_cacheinfo
|
||||
{
|
||||
__u32 max_reasm_len;
|
||||
__u32 tstamp; /* ipv6InterfaceTable updated timestamp */
|
||||
__u32 reachable_time;
|
||||
__u32 retrans_time;
|
||||
};
|
||||
|
||||
#endif /* _LINUX_IF_LINK_H */
|
@ -30,8 +30,8 @@ struct igmphdr
|
||||
{
|
||||
__u8 type;
|
||||
__u8 code; /* For newer IGMP */
|
||||
__u16 csum;
|
||||
__u32 group;
|
||||
__be16 csum;
|
||||
__be32 group;
|
||||
};
|
||||
|
||||
/* V3 group record types [grec_type] */
|
||||
@ -45,25 +45,25 @@ struct igmphdr
|
||||
struct igmpv3_grec {
|
||||
__u8 grec_type;
|
||||
__u8 grec_auxwords;
|
||||
__u16 grec_nsrcs;
|
||||
__u32 grec_mca;
|
||||
__u32 grec_src[0];
|
||||
__be16 grec_nsrcs;
|
||||
__be32 grec_mca;
|
||||
__be32 grec_src[0];
|
||||
};
|
||||
|
||||
struct igmpv3_report {
|
||||
__u8 type;
|
||||
__u8 resv1;
|
||||
__u16 csum;
|
||||
__u16 resv2;
|
||||
__u16 ngrec;
|
||||
__be16 csum;
|
||||
__be16 resv2;
|
||||
__be16 ngrec;
|
||||
struct igmpv3_grec grec[0];
|
||||
};
|
||||
|
||||
struct igmpv3_query {
|
||||
__u8 type;
|
||||
__u8 code;
|
||||
__u16 csum;
|
||||
__u32 group;
|
||||
__be16 csum;
|
||||
__be32 group;
|
||||
#if defined(__LITTLE_ENDIAN_BITFIELD)
|
||||
__u8 qrv:3,
|
||||
suppress:1,
|
||||
@ -76,8 +76,8 @@ struct igmpv3_query {
|
||||
#error "Please fix <asm/byteorder.h>"
|
||||
#endif
|
||||
__u8 qqic;
|
||||
__u16 nsrcs;
|
||||
__u32 srcs[0];
|
||||
__be16 nsrcs;
|
||||
__be32 srcs[0];
|
||||
};
|
||||
|
||||
#define IGMP_HOST_MEMBERSHIP_QUERY 0x11 /* From RFC1112 */
|
||||
@ -136,11 +136,11 @@ struct ip_sf_socklist
|
||||
{
|
||||
unsigned int sl_max;
|
||||
unsigned int sl_count;
|
||||
__u32 sl_addr[0];
|
||||
__be32 sl_addr[0];
|
||||
};
|
||||
|
||||
#define IP_SFLSIZE(count) (sizeof(struct ip_sf_socklist) + \
|
||||
(count) * sizeof(__u32))
|
||||
(count) * sizeof(__be32))
|
||||
|
||||
#define IP_SFBLOCK 10 /* allocate this many at once */
|
||||
|
||||
@ -159,7 +159,7 @@ struct ip_mc_socklist
|
||||
struct ip_sf_list
|
||||
{
|
||||
struct ip_sf_list *sf_next;
|
||||
__u32 sf_inaddr;
|
||||
__be32 sf_inaddr;
|
||||
unsigned long sf_count[2]; /* include/exclude counts */
|
||||
unsigned char sf_gsresp; /* include in g & s response? */
|
||||
unsigned char sf_oldin; /* change state */
|
||||
@ -197,7 +197,7 @@ struct ip_mc_list
|
||||
#define IGMPV3_QQIC(value) IGMPV3_EXP(0x80, 4, 3, value)
|
||||
#define IGMPV3_MRC(value) IGMPV3_EXP(0x80, 4, 3, value)
|
||||
|
||||
extern int ip_check_mc(struct in_device *dev, u32 mc_addr, u32 src_addr, u16 proto);
|
||||
extern int ip_check_mc(struct in_device *dev, __be32 mc_addr, __be32 src_addr, u16 proto);
|
||||
extern int igmp_rcv(struct sk_buff *);
|
||||
extern int ip_mc_join_group(struct sock *sk, struct ip_mreqn *imr);
|
||||
extern int ip_mc_leave_group(struct sock *sk, struct ip_mreqn *imr);
|
||||
@ -209,13 +209,13 @@ extern int ip_mc_msfget(struct sock *sk, struct ip_msfilter *msf,
|
||||
struct ip_msfilter __user *optval, int __user *optlen);
|
||||
extern int ip_mc_gsfget(struct sock *sk, struct group_filter *gsf,
|
||||
struct group_filter __user *optval, int __user *optlen);
|
||||
extern int ip_mc_sf_allow(struct sock *sk, u32 local, u32 rmt, int dif);
|
||||
extern int ip_mc_sf_allow(struct sock *sk, __be32 local, __be32 rmt, int dif);
|
||||
extern void ip_mr_init(void);
|
||||
extern void ip_mc_init_dev(struct in_device *);
|
||||
extern void ip_mc_destroy_dev(struct in_device *);
|
||||
extern void ip_mc_up(struct in_device *);
|
||||
extern void ip_mc_down(struct in_device *);
|
||||
extern void ip_mc_dec_group(struct in_device *in_dev, u32 addr);
|
||||
extern void ip_mc_inc_group(struct in_device *in_dev, u32 addr);
|
||||
extern void ip_mc_dec_group(struct in_device *in_dev, __be32 addr);
|
||||
extern void ip_mc_inc_group(struct in_device *in_dev, __be32 addr);
|
||||
#endif
|
||||
#endif
|
||||
|
@ -123,17 +123,17 @@ struct ip_mreqn
|
||||
};
|
||||
|
||||
struct ip_mreq_source {
|
||||
__u32 imr_multiaddr;
|
||||
__u32 imr_interface;
|
||||
__u32 imr_sourceaddr;
|
||||
__be32 imr_multiaddr;
|
||||
__be32 imr_interface;
|
||||
__be32 imr_sourceaddr;
|
||||
};
|
||||
|
||||
struct ip_msfilter {
|
||||
__u32 imsf_multiaddr;
|
||||
__u32 imsf_interface;
|
||||
__be32 imsf_multiaddr;
|
||||
__be32 imsf_interface;
|
||||
__u32 imsf_fmode;
|
||||
__u32 imsf_numsrc;
|
||||
__u32 imsf_slist[1];
|
||||
__be32 imsf_slist[1];
|
||||
};
|
||||
|
||||
#define IP_MSFILTER_SIZE(numsrc) \
|
||||
|
@ -32,8 +32,8 @@ struct in6_addr
|
||||
union
|
||||
{
|
||||
__u8 u6_addr8[16];
|
||||
__u16 u6_addr16[8];
|
||||
__u32 u6_addr32[4];
|
||||
__be16 u6_addr16[8];
|
||||
__be32 u6_addr32[4];
|
||||
} in6_u;
|
||||
#define s6_addr in6_u.u6_addr8
|
||||
#define s6_addr16 in6_u.u6_addr16
|
||||
@ -53,7 +53,7 @@ extern const struct in6_addr in6addr_loopback;
|
||||
|
||||
struct sockaddr_in6 {
|
||||
unsigned short int sin6_family; /* AF_INET6 */
|
||||
__u16 sin6_port; /* Transport layer port # */
|
||||
__be16 sin6_port; /* Transport layer port # */
|
||||
__u32 sin6_flowinfo; /* IPv6 flow information */
|
||||
struct in6_addr sin6_addr; /* IPv6 address */
|
||||
__u32 sin6_scope_id; /* scope id (new in RFC2553) */
|
||||
|
@ -9,10 +9,10 @@
|
||||
|
||||
/* Socket identity */
|
||||
struct inet_diag_sockid {
|
||||
__u16 idiag_sport;
|
||||
__u16 idiag_dport;
|
||||
__u32 idiag_src[4];
|
||||
__u32 idiag_dst[4];
|
||||
__be16 idiag_sport;
|
||||
__be16 idiag_dport;
|
||||
__be32 idiag_src[4];
|
||||
__be32 idiag_dst[4];
|
||||
__u32 idiag_if;
|
||||
__u32 idiag_cookie[2];
|
||||
#define INET_DIAG_NOCOOKIE (~0U)
|
||||
@ -67,7 +67,7 @@ struct inet_diag_hostcond {
|
||||
__u8 family;
|
||||
__u8 prefix_len;
|
||||
int port;
|
||||
__u32 addr[0];
|
||||
__be32 addr[0];
|
||||
};
|
||||
|
||||
/* Base info structure. It contains socket identity (addrs/ports/cookie)
|
||||
|
@ -90,11 +90,11 @@ struct in_ifaddr
|
||||
struct in_ifaddr *ifa_next;
|
||||
struct in_device *ifa_dev;
|
||||
struct rcu_head rcu_head;
|
||||
u32 ifa_local;
|
||||
u32 ifa_address;
|
||||
u32 ifa_mask;
|
||||
u32 ifa_broadcast;
|
||||
u32 ifa_anycast;
|
||||
__be32 ifa_local;
|
||||
__be32 ifa_address;
|
||||
__be32 ifa_mask;
|
||||
__be32 ifa_broadcast;
|
||||
__be32 ifa_anycast;
|
||||
unsigned char ifa_scope;
|
||||
unsigned char ifa_flags;
|
||||
unsigned char ifa_prefixlen;
|
||||
@ -104,18 +104,18 @@ struct in_ifaddr
|
||||
extern int register_inetaddr_notifier(struct notifier_block *nb);
|
||||
extern int unregister_inetaddr_notifier(struct notifier_block *nb);
|
||||
|
||||
extern struct net_device *ip_dev_find(u32 addr);
|
||||
extern int inet_addr_onlink(struct in_device *in_dev, u32 a, u32 b);
|
||||
extern struct net_device *ip_dev_find(__be32 addr);
|
||||
extern int inet_addr_onlink(struct in_device *in_dev, __be32 a, __be32 b);
|
||||
extern int devinet_ioctl(unsigned int cmd, void __user *);
|
||||
extern void devinet_init(void);
|
||||
extern struct in_device *inetdev_init(struct net_device *dev);
|
||||
extern struct in_device *inetdev_by_index(int);
|
||||
extern u32 inet_select_addr(const struct net_device *dev, u32 dst, int scope);
|
||||
extern u32 inet_confirm_addr(const struct net_device *dev, u32 dst, u32 local, int scope);
|
||||
extern struct in_ifaddr *inet_ifa_byprefix(struct in_device *in_dev, u32 prefix, u32 mask);
|
||||
extern __be32 inet_select_addr(const struct net_device *dev, __be32 dst, int scope);
|
||||
extern __be32 inet_confirm_addr(const struct net_device *dev, __be32 dst, __be32 local, int scope);
|
||||
extern struct in_ifaddr *inet_ifa_byprefix(struct in_device *in_dev, __be32 prefix, __be32 mask);
|
||||
extern void inet_forward_change(void);
|
||||
|
||||
static __inline__ int inet_ifa_match(u32 addr, struct in_ifaddr *ifa)
|
||||
static __inline__ int inet_ifa_match(__be32 addr, struct in_ifaddr *ifa)
|
||||
{
|
||||
return !((addr^ifa->ifa_address)&ifa->ifa_mask);
|
||||
}
|
||||
@ -183,7 +183,7 @@ static inline void in_dev_put(struct in_device *idev)
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
static __inline__ __u32 inet_make_mask(int logmask)
|
||||
static __inline__ __be32 inet_make_mask(int logmask)
|
||||
{
|
||||
if (logmask)
|
||||
return htonl(~((1<<(32-logmask))-1));
|
||||
|
@ -96,7 +96,7 @@ struct iphdr {
|
||||
__be16 frag_off;
|
||||
__u8 ttl;
|
||||
__u8 protocol;
|
||||
__u16 check;
|
||||
__be16 check;
|
||||
__be32 saddr;
|
||||
__be32 daddr;
|
||||
/*The options start here. */
|
||||
@ -105,22 +105,22 @@ struct iphdr {
|
||||
struct ip_auth_hdr {
|
||||
__u8 nexthdr;
|
||||
__u8 hdrlen; /* This one is measured in 32 bit units! */
|
||||
__u16 reserved;
|
||||
__u32 spi;
|
||||
__u32 seq_no; /* Sequence number */
|
||||
__be16 reserved;
|
||||
__be32 spi;
|
||||
__be32 seq_no; /* Sequence number */
|
||||
__u8 auth_data[0]; /* Variable len but >=4. Mind the 64 bit alignment! */
|
||||
};
|
||||
|
||||
struct ip_esp_hdr {
|
||||
__u32 spi;
|
||||
__u32 seq_no; /* Sequence number */
|
||||
__be32 spi;
|
||||
__be32 seq_no; /* Sequence number */
|
||||
__u8 enc_data[0]; /* Variable len but >=8. Mind the 64 bit alignment! */
|
||||
};
|
||||
|
||||
struct ip_comp_hdr {
|
||||
__u8 nexthdr;
|
||||
__u8 flags;
|
||||
__u16 cpi;
|
||||
__be16 cpi;
|
||||
};
|
||||
|
||||
#endif /* _LINUX_IP_H */
|
||||
|
@ -99,22 +99,22 @@ struct ipv6_destopt_hao {
|
||||
struct ipv6_auth_hdr {
|
||||
__u8 nexthdr;
|
||||
__u8 hdrlen; /* This one is measured in 32 bit units! */
|
||||
__u16 reserved;
|
||||
__u32 spi;
|
||||
__u32 seq_no; /* Sequence number */
|
||||
__be16 reserved;
|
||||
__be32 spi;
|
||||
__be32 seq_no; /* Sequence number */
|
||||
__u8 auth_data[0]; /* Length variable but >=4. Mind the 64 bit alignment! */
|
||||
};
|
||||
|
||||
struct ipv6_esp_hdr {
|
||||
__u32 spi;
|
||||
__u32 seq_no; /* Sequence number */
|
||||
__be32 spi;
|
||||
__be32 seq_no; /* Sequence number */
|
||||
__u8 enc_data[0]; /* Length variable but >=8. Mind the 64 bit alignment! */
|
||||
};
|
||||
|
||||
struct ipv6_comp_hdr {
|
||||
__u8 nexthdr;
|
||||
__u8 flags;
|
||||
__u16 cpi;
|
||||
__be16 cpi;
|
||||
};
|
||||
|
||||
/*
|
||||
@ -136,7 +136,7 @@ struct ipv6hdr {
|
||||
#endif
|
||||
__u8 flow_lbl[3];
|
||||
|
||||
__u16 payload_len;
|
||||
__be16 payload_len;
|
||||
__u8 nexthdr;
|
||||
__u8 hop_limit;
|
||||
|
||||
@ -461,7 +461,7 @@ static inline struct raw6_sock *raw6_sk(const struct sock *sk)
|
||||
|
||||
#define INET6_MATCH(__sk, __hash, __saddr, __daddr, __ports, __dif)\
|
||||
(((__sk)->sk_hash == (__hash)) && \
|
||||
((*((__u32 *)&(inet_sk(__sk)->dport))) == (__ports)) && \
|
||||
((*((__portpair *)&(inet_sk(__sk)->dport))) == (__ports)) && \
|
||||
((__sk)->sk_family == AF_INET6) && \
|
||||
ipv6_addr_equal(&inet6_sk(__sk)->daddr, (__saddr)) && \
|
||||
ipv6_addr_equal(&inet6_sk(__sk)->rcv_saddr, (__daddr)) && \
|
||||
|
@ -142,7 +142,7 @@ struct vif_device
|
||||
unsigned long rate_limit; /* Traffic shaping (NI) */
|
||||
unsigned char threshold; /* TTL threshold */
|
||||
unsigned short flags; /* Control flags */
|
||||
__u32 local,remote; /* Addresses(remote for tunnels)*/
|
||||
__be32 local,remote; /* Addresses(remote for tunnels)*/
|
||||
int link; /* Physical interface index */
|
||||
};
|
||||
|
||||
@ -151,8 +151,8 @@ struct vif_device
|
||||
struct mfc_cache
|
||||
{
|
||||
struct mfc_cache *next; /* Next entry on cache line */
|
||||
__u32 mfc_mcastgrp; /* Group the entry belongs to */
|
||||
__u32 mfc_origin; /* Source of packet */
|
||||
__be32 mfc_mcastgrp; /* Group the entry belongs to */
|
||||
__be32 mfc_origin; /* Source of packet */
|
||||
vifi_t mfc_parent; /* Source interface */
|
||||
int mfc_flags; /* Flags on line */
|
||||
|
||||
@ -179,9 +179,9 @@ struct mfc_cache
|
||||
#define MFC_LINES 64
|
||||
|
||||
#ifdef __BIG_ENDIAN
|
||||
#define MFC_HASH(a,b) ((((a)>>24)^((b)>>26))&(MFC_LINES-1))
|
||||
#define MFC_HASH(a,b) (((((__force u32)(__be32)a)>>24)^(((__force u32)(__be32)b)>>26))&(MFC_LINES-1))
|
||||
#else
|
||||
#define MFC_HASH(a,b) (((a)^((b)>>2))&(MFC_LINES-1))
|
||||
#define MFC_HASH(a,b) ((((__force u32)(__be32)a)^(((__force u32)(__be32)b)>>2))&(MFC_LINES-1))
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@ -213,8 +213,8 @@ struct pimreghdr
|
||||
{
|
||||
__u8 type;
|
||||
__u8 reserved;
|
||||
__u16 csum;
|
||||
__u32 flags;
|
||||
__be16 csum;
|
||||
__be32 flags;
|
||||
};
|
||||
|
||||
extern int pim_rcv_v1(struct sk_buff *);
|
||||
|
@ -187,7 +187,7 @@ struct hh_cache
|
||||
{
|
||||
struct hh_cache *hh_next; /* Next entry */
|
||||
atomic_t hh_refcnt; /* number of users */
|
||||
unsigned short hh_type; /* protocol identifier, f.e ETH_P_IP
|
||||
__be16 hh_type; /* protocol identifier, f.e ETH_P_IP
|
||||
* NOTE: For VLANs, this will be the
|
||||
* encapuslated type. --BLG
|
||||
*/
|
||||
|
@ -46,11 +46,11 @@ struct arpt_arp {
|
||||
struct arpt_devaddr_info tgt_devaddr;
|
||||
|
||||
/* ARP operation code. */
|
||||
u_int16_t arpop, arpop_mask;
|
||||
__be16 arpop, arpop_mask;
|
||||
|
||||
/* ARP hardware address and protocol address format. */
|
||||
u_int16_t arhrd, arhrd_mask;
|
||||
u_int16_t arpro, arpro_mask;
|
||||
__be16 arhrd, arhrd_mask;
|
||||
__be16 arpro, arpro_mask;
|
||||
|
||||
/* The protocol address length is only accepted if it is 4
|
||||
* so there is no use in offering a way to do filtering on it.
|
||||
|
@ -157,7 +157,7 @@ struct ip_conntrack_expect
|
||||
unsigned int flags;
|
||||
|
||||
#ifdef CONFIG_IP_NF_NAT_NEEDED
|
||||
u_int32_t saved_ip;
|
||||
__be32 saved_ip;
|
||||
/* This is the original per-proto part, used to map the
|
||||
* expected connection the way the recipient expects. */
|
||||
union ip_conntrack_manip_proto saved_proto;
|
||||
|
@ -30,7 +30,7 @@ struct ip_ct_h323_master {
|
||||
struct ip_conntrack_expect;
|
||||
|
||||
extern int get_h225_addr(unsigned char *data, TransportAddress * addr,
|
||||
u_int32_t * ip, u_int16_t * port);
|
||||
__be32 * ip, u_int16_t * port);
|
||||
extern void ip_conntrack_h245_expect(struct ip_conntrack *new,
|
||||
struct ip_conntrack_expect *this);
|
||||
extern void ip_conntrack_q931_expect(struct ip_conntrack *new,
|
||||
@ -38,11 +38,11 @@ extern void ip_conntrack_q931_expect(struct ip_conntrack *new,
|
||||
extern int (*set_h245_addr_hook) (struct sk_buff ** pskb,
|
||||
unsigned char **data, int dataoff,
|
||||
H245_TransportAddress * addr,
|
||||
u_int32_t ip, u_int16_t port);
|
||||
__be32 ip, u_int16_t port);
|
||||
extern int (*set_h225_addr_hook) (struct sk_buff ** pskb,
|
||||
unsigned char **data, int dataoff,
|
||||
TransportAddress * addr,
|
||||
u_int32_t ip, u_int16_t port);
|
||||
__be32 ip, u_int16_t port);
|
||||
extern int (*set_sig_addr_hook) (struct sk_buff ** pskb,
|
||||
struct ip_conntrack * ct,
|
||||
enum ip_conntrack_info ctinfo,
|
||||
|
@ -23,13 +23,13 @@ union ip_conntrack_manip_proto
|
||||
__be16 port;
|
||||
} tcp;
|
||||
struct {
|
||||
u_int16_t port;
|
||||
__be16 port;
|
||||
} udp;
|
||||
struct {
|
||||
u_int16_t id;
|
||||
__be16 id;
|
||||
} icmp;
|
||||
struct {
|
||||
u_int16_t port;
|
||||
__be16 port;
|
||||
} sctp;
|
||||
struct {
|
||||
__be16 key; /* key is 32bit, pptp only uses 16 */
|
||||
@ -39,7 +39,7 @@ union ip_conntrack_manip_proto
|
||||
/* The manipulable part of the tuple. */
|
||||
struct ip_conntrack_manip
|
||||
{
|
||||
u_int32_t ip;
|
||||
__be32 ip;
|
||||
union ip_conntrack_manip_proto u;
|
||||
};
|
||||
|
||||
@ -50,22 +50,22 @@ struct ip_conntrack_tuple
|
||||
|
||||
/* These are the parts of the tuple which are fixed. */
|
||||
struct {
|
||||
u_int32_t ip;
|
||||
__be32 ip;
|
||||
union {
|
||||
/* Add other protocols here. */
|
||||
u_int16_t all;
|
||||
|
||||
struct {
|
||||
u_int16_t port;
|
||||
__be16 port;
|
||||
} tcp;
|
||||
struct {
|
||||
u_int16_t port;
|
||||
__be16 port;
|
||||
} udp;
|
||||
struct {
|
||||
u_int8_t type, code;
|
||||
} icmp;
|
||||
struct {
|
||||
u_int16_t port;
|
||||
__be16 port;
|
||||
} sctp;
|
||||
struct {
|
||||
__be16 key; /* key is 32bit,
|
||||
|
@ -33,7 +33,7 @@ struct ip_nat_range
|
||||
unsigned int flags;
|
||||
|
||||
/* Inclusive: network order. */
|
||||
u_int32_t min_ip, max_ip;
|
||||
__be32 min_ip, max_ip;
|
||||
|
||||
/* Inclusive: network order */
|
||||
union ip_conntrack_manip_proto min, max;
|
||||
|
@ -26,7 +26,7 @@ typedef struct ipq_packet_msg {
|
||||
unsigned int hook; /* Netfilter hook we rode in on */
|
||||
char indev_name[IFNAMSIZ]; /* Name of incoming interface */
|
||||
char outdev_name[IFNAMSIZ]; /* Name of outgoing interface */
|
||||
unsigned short hw_protocol; /* Hardware protocol (network order) */
|
||||
__be16 hw_protocol; /* Hardware protocol (network order) */
|
||||
unsigned short hw_type; /* Hardware type */
|
||||
unsigned char hw_addrlen; /* Hardware address length */
|
||||
unsigned char hw_addr[8]; /* Hardware address */
|
||||
|
@ -8,7 +8,7 @@
|
||||
|
||||
struct ipt_iprange {
|
||||
/* Inclusive: network order. */
|
||||
u_int32_t min_ip, max_ip;
|
||||
__be32 min_ip, max_ip;
|
||||
};
|
||||
|
||||
struct ipt_iprange_info
|
||||
|
@ -1904,6 +1904,7 @@
|
||||
#define PCI_DEVICE_ID_TIGON3_5705_2 0x1654
|
||||
#define PCI_DEVICE_ID_TIGON3_5720 0x1658
|
||||
#define PCI_DEVICE_ID_TIGON3_5721 0x1659
|
||||
#define PCI_DEVICE_ID_TIGON3_5722 0x165a
|
||||
#define PCI_DEVICE_ID_TIGON3_5705M 0x165d
|
||||
#define PCI_DEVICE_ID_TIGON3_5705M_2 0x165e
|
||||
#define PCI_DEVICE_ID_TIGON3_5714 0x1668
|
||||
@ -1913,6 +1914,7 @@
|
||||
#define PCI_DEVICE_ID_TIGON3_5705F 0x166e
|
||||
#define PCI_DEVICE_ID_TIGON3_5754M 0x1672
|
||||
#define PCI_DEVICE_ID_TIGON3_5755M 0x1673
|
||||
#define PCI_DEVICE_ID_TIGON3_5756 0x1674
|
||||
#define PCI_DEVICE_ID_TIGON3_5750 0x1676
|
||||
#define PCI_DEVICE_ID_TIGON3_5751 0x1677
|
||||
#define PCI_DEVICE_ID_TIGON3_5715 0x1678
|
||||
@ -1942,6 +1944,8 @@
|
||||
#define PCI_DEVICE_ID_TIGON3_5901 0x170d
|
||||
#define PCI_DEVICE_ID_BCM4401B1 0x170c
|
||||
#define PCI_DEVICE_ID_TIGON3_5901_2 0x170e
|
||||
#define PCI_DEVICE_ID_TIGON3_5906 0x1712
|
||||
#define PCI_DEVICE_ID_TIGON3_5906M 0x1713
|
||||
#define PCI_DEVICE_ID_BCM4401 0x4401
|
||||
#define PCI_DEVICE_ID_BCM4401B0 0x4402
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
#define __LINUX_RTNETLINK_H
|
||||
|
||||
#include <linux/netlink.h>
|
||||
#include <linux/if.h>
|
||||
#include <linux/if_link.h>
|
||||
|
||||
/****
|
||||
* Routing/neighbour discovery messages.
|
||||
|
@ -109,13 +109,13 @@ struct rpc_credops {
|
||||
void (*crdestroy)(struct rpc_cred *);
|
||||
|
||||
int (*crmatch)(struct auth_cred *, struct rpc_cred *, int);
|
||||
u32 * (*crmarshal)(struct rpc_task *, u32 *);
|
||||
__be32 * (*crmarshal)(struct rpc_task *, __be32 *);
|
||||
int (*crrefresh)(struct rpc_task *);
|
||||
u32 * (*crvalidate)(struct rpc_task *, u32 *);
|
||||
__be32 * (*crvalidate)(struct rpc_task *, __be32 *);
|
||||
int (*crwrap_req)(struct rpc_task *, kxdrproc_t,
|
||||
void *, u32 *, void *);
|
||||
void *, __be32 *, void *);
|
||||
int (*crunwrap_resp)(struct rpc_task *, kxdrproc_t,
|
||||
void *, u32 *, void *);
|
||||
void *, __be32 *, void *);
|
||||
};
|
||||
|
||||
extern struct rpc_authops authunix_ops;
|
||||
@ -134,10 +134,10 @@ struct rpc_cred * rpcauth_bindcred(struct rpc_task *);
|
||||
void rpcauth_holdcred(struct rpc_task *);
|
||||
void put_rpccred(struct rpc_cred *);
|
||||
void rpcauth_unbindcred(struct rpc_task *);
|
||||
u32 * rpcauth_marshcred(struct rpc_task *, u32 *);
|
||||
u32 * rpcauth_checkverf(struct rpc_task *, u32 *);
|
||||
int rpcauth_wrap_req(struct rpc_task *task, kxdrproc_t encode, void *rqstp, u32 *data, void *obj);
|
||||
int rpcauth_unwrap_resp(struct rpc_task *task, kxdrproc_t decode, void *rqstp, u32 *data, void *obj);
|
||||
__be32 * rpcauth_marshcred(struct rpc_task *, __be32 *);
|
||||
__be32 * rpcauth_checkverf(struct rpc_task *, __be32 *);
|
||||
int rpcauth_wrap_req(struct rpc_task *task, kxdrproc_t encode, void *rqstp, __be32 *data, void *obj);
|
||||
int rpcauth_unwrap_resp(struct rpc_task *task, kxdrproc_t decode, void *rqstp, __be32 *data, void *obj);
|
||||
int rpcauth_refreshcred(struct rpc_task *);
|
||||
void rpcauth_invalcred(struct rpc_task *);
|
||||
int rpcauth_uptodatecred(struct rpc_task *);
|
||||
|
@ -95,7 +95,7 @@ enum rpc_auth_stat {
|
||||
* 2GB.
|
||||
*/
|
||||
|
||||
typedef u32 rpc_fraghdr;
|
||||
typedef __be32 rpc_fraghdr;
|
||||
|
||||
#define RPC_LAST_STREAM_FRAGMENT (1U << 31)
|
||||
#define RPC_FRAGMENT_SIZE_MASK (~RPC_LAST_STREAM_FRAGMENT)
|
||||
|
@ -78,28 +78,45 @@ struct svc_serv {
|
||||
*/
|
||||
#define RPCSVC_MAXPAGES ((RPCSVC_MAXPAYLOAD+PAGE_SIZE-1)/PAGE_SIZE + 2)
|
||||
|
||||
static inline u32 svc_getu32(struct kvec *iov)
|
||||
static inline u32 svc_getnl(struct kvec *iov)
|
||||
{
|
||||
u32 val, *vp;
|
||||
__be32 val, *vp;
|
||||
vp = iov->iov_base;
|
||||
val = *vp++;
|
||||
iov->iov_base = (void*)vp;
|
||||
iov->iov_len -= sizeof(u32);
|
||||
iov->iov_len -= sizeof(__be32);
|
||||
return ntohl(val);
|
||||
}
|
||||
|
||||
static inline void svc_putnl(struct kvec *iov, u32 val)
|
||||
{
|
||||
__be32 *vp = iov->iov_base + iov->iov_len;
|
||||
*vp = htonl(val);
|
||||
iov->iov_len += sizeof(__be32);
|
||||
}
|
||||
|
||||
static inline __be32 svc_getu32(struct kvec *iov)
|
||||
{
|
||||
__be32 val, *vp;
|
||||
vp = iov->iov_base;
|
||||
val = *vp++;
|
||||
iov->iov_base = (void*)vp;
|
||||
iov->iov_len -= sizeof(__be32);
|
||||
return val;
|
||||
}
|
||||
|
||||
static inline void svc_ungetu32(struct kvec *iov)
|
||||
{
|
||||
u32 *vp = (u32 *)iov->iov_base;
|
||||
__be32 *vp = (__be32 *)iov->iov_base;
|
||||
iov->iov_base = (void *)(vp - 1);
|
||||
iov->iov_len += sizeof(*vp);
|
||||
}
|
||||
|
||||
static inline void svc_putu32(struct kvec *iov, u32 val)
|
||||
static inline void svc_putu32(struct kvec *iov, __be32 val)
|
||||
{
|
||||
u32 *vp = iov->iov_base + iov->iov_len;
|
||||
__be32 *vp = iov->iov_base + iov->iov_len;
|
||||
*vp = val;
|
||||
iov->iov_len += sizeof(u32);
|
||||
iov->iov_len += sizeof(__be32);
|
||||
}
|
||||
|
||||
|
||||
@ -130,7 +147,7 @@ struct svc_rqst {
|
||||
short rq_arghi; /* pages available in argument page list */
|
||||
short rq_resused; /* pages used for result */
|
||||
|
||||
u32 rq_xid; /* transmission id */
|
||||
__be32 rq_xid; /* transmission id */
|
||||
u32 rq_prog; /* program number */
|
||||
u32 rq_vers; /* program version */
|
||||
u32 rq_proc; /* procedure number */
|
||||
@ -139,7 +156,7 @@ struct svc_rqst {
|
||||
rq_secure : 1; /* secure port */
|
||||
|
||||
|
||||
__u32 rq_daddr; /* dest addr of request - reply from here */
|
||||
__be32 rq_daddr; /* dest addr of request - reply from here */
|
||||
|
||||
void * rq_argp; /* decoded arguments */
|
||||
void * rq_resp; /* xdr'd results */
|
||||
@ -169,7 +186,7 @@ struct svc_rqst {
|
||||
* Check buffer bounds after decoding arguments
|
||||
*/
|
||||
static inline int
|
||||
xdr_argsize_check(struct svc_rqst *rqstp, u32 *p)
|
||||
xdr_argsize_check(struct svc_rqst *rqstp, __be32 *p)
|
||||
{
|
||||
char *cp = (char *)p;
|
||||
struct kvec *vec = &rqstp->rq_arg.head[0];
|
||||
@ -178,7 +195,7 @@ xdr_argsize_check(struct svc_rqst *rqstp, u32 *p)
|
||||
}
|
||||
|
||||
static inline int
|
||||
xdr_ressize_check(struct svc_rqst *rqstp, u32 *p)
|
||||
xdr_ressize_check(struct svc_rqst *rqstp, __be32 *p)
|
||||
{
|
||||
struct kvec *vec = &rqstp->rq_res.head[0];
|
||||
char *cp = (char*)p;
|
||||
@ -249,10 +266,10 @@ struct svc_deferred_req {
|
||||
u32 prot; /* protocol (UDP or TCP) */
|
||||
struct sockaddr_in addr;
|
||||
struct svc_sock *svsk; /* where reply must go */
|
||||
u32 daddr; /* where reply must come from */
|
||||
__be32 daddr; /* where reply must come from */
|
||||
struct cache_deferred_req handle;
|
||||
int argslen;
|
||||
u32 args[0];
|
||||
__be32 args[0];
|
||||
};
|
||||
|
||||
/*
|
||||
@ -284,7 +301,7 @@ struct svc_version {
|
||||
* A return value of 0 means drop the request.
|
||||
* vs_dispatch == NULL means use default dispatcher.
|
||||
*/
|
||||
int (*vs_dispatch)(struct svc_rqst *, u32 *);
|
||||
int (*vs_dispatch)(struct svc_rqst *, __be32 *);
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -95,7 +95,7 @@ struct auth_ops {
|
||||
char * name;
|
||||
struct module *owner;
|
||||
int flavour;
|
||||
int (*accept)(struct svc_rqst *rq, u32 *authp);
|
||||
int (*accept)(struct svc_rqst *rq, __be32 *authp);
|
||||
int (*release)(struct svc_rqst *rq);
|
||||
void (*domain_release)(struct auth_domain *);
|
||||
int (*set_client)(struct svc_rqst *rq);
|
||||
@ -112,7 +112,7 @@ struct auth_ops {
|
||||
#define SVC_COMPLETE 9
|
||||
|
||||
|
||||
extern int svc_authenticate(struct svc_rqst *rqstp, u32 *authp);
|
||||
extern int svc_authenticate(struct svc_rqst *rqstp, __be32 *authp);
|
||||
extern int svc_authorise(struct svc_rqst *rqstp);
|
||||
extern int svc_set_client(struct svc_rqst *rqstp);
|
||||
extern int svc_auth_register(rpc_authflavor_t flavor, struct auth_ops *aops);
|
||||
|
@ -32,7 +32,7 @@ struct xdr_netobj {
|
||||
* side) or svc_rqst pointer (server side).
|
||||
* Encode functions always assume there's enough room in the buffer.
|
||||
*/
|
||||
typedef int (*kxdrproc_t)(void *rqstp, u32 *data, void *obj);
|
||||
typedef int (*kxdrproc_t)(void *rqstp, __be32 *data, void *obj);
|
||||
|
||||
/*
|
||||
* Basic structure for transmission/reception of a client XDR message.
|
||||
@ -88,19 +88,19 @@ struct xdr_buf {
|
||||
/*
|
||||
* Miscellaneous XDR helper functions
|
||||
*/
|
||||
u32 * xdr_encode_opaque_fixed(u32 *p, const void *ptr, unsigned int len);
|
||||
u32 * xdr_encode_opaque(u32 *p, const void *ptr, unsigned int len);
|
||||
u32 * xdr_encode_string(u32 *p, const char *s);
|
||||
u32 * xdr_decode_string_inplace(u32 *p, char **sp, int *lenp, int maxlen);
|
||||
u32 * xdr_encode_netobj(u32 *p, const struct xdr_netobj *);
|
||||
u32 * xdr_decode_netobj(u32 *p, struct xdr_netobj *);
|
||||
__be32 *xdr_encode_opaque_fixed(__be32 *p, const void *ptr, unsigned int len);
|
||||
__be32 *xdr_encode_opaque(__be32 *p, const void *ptr, unsigned int len);
|
||||
__be32 *xdr_encode_string(__be32 *p, const char *s);
|
||||
__be32 *xdr_decode_string_inplace(__be32 *p, char **sp, int *lenp, int maxlen);
|
||||
__be32 *xdr_encode_netobj(__be32 *p, const struct xdr_netobj *);
|
||||
__be32 *xdr_decode_netobj(__be32 *p, struct xdr_netobj *);
|
||||
|
||||
void xdr_encode_pages(struct xdr_buf *, struct page **, unsigned int,
|
||||
unsigned int);
|
||||
void xdr_inline_pages(struct xdr_buf *, unsigned int,
|
||||
struct page **, unsigned int, unsigned int);
|
||||
|
||||
static inline u32 *xdr_encode_array(u32 *p, const void *s, unsigned int len)
|
||||
static inline __be32 *xdr_encode_array(__be32 *p, const void *s, unsigned int len)
|
||||
{
|
||||
return xdr_encode_opaque(p, s, len);
|
||||
}
|
||||
@ -108,16 +108,16 @@ static inline u32 *xdr_encode_array(u32 *p, const void *s, unsigned int len)
|
||||
/*
|
||||
* Decode 64bit quantities (NFSv3 support)
|
||||
*/
|
||||
static inline u32 *
|
||||
xdr_encode_hyper(u32 *p, __u64 val)
|
||||
static inline __be32 *
|
||||
xdr_encode_hyper(__be32 *p, __u64 val)
|
||||
{
|
||||
*p++ = htonl(val >> 32);
|
||||
*p++ = htonl(val & 0xFFFFFFFF);
|
||||
return p;
|
||||
}
|
||||
|
||||
static inline u32 *
|
||||
xdr_decode_hyper(u32 *p, __u64 *valp)
|
||||
static inline __be32 *
|
||||
xdr_decode_hyper(__be32 *p, __u64 *valp)
|
||||
{
|
||||
*valp = ((__u64) ntohl(*p++)) << 32;
|
||||
*valp |= ntohl(*p++);
|
||||
@ -128,7 +128,7 @@ xdr_decode_hyper(u32 *p, __u64 *valp)
|
||||
* Adjust kvec to reflect end of xdr'ed data (RPC client XDR)
|
||||
*/
|
||||
static inline int
|
||||
xdr_adjust_iovec(struct kvec *iov, u32 *p)
|
||||
xdr_adjust_iovec(struct kvec *iov, __be32 *p)
|
||||
{
|
||||
return iov->iov_len = ((u8 *) p - (u8 *) iov->iov_base);
|
||||
}
|
||||
@ -180,19 +180,19 @@ extern int xdr_encode_array2(struct xdr_buf *buf, unsigned int base,
|
||||
* Provide some simple tools for XDR buffer overflow-checking etc.
|
||||
*/
|
||||
struct xdr_stream {
|
||||
uint32_t *p; /* start of available buffer */
|
||||
__be32 *p; /* start of available buffer */
|
||||
struct xdr_buf *buf; /* XDR buffer to read/write */
|
||||
|
||||
uint32_t *end; /* end of available buffer space */
|
||||
__be32 *end; /* end of available buffer space */
|
||||
struct kvec *iov; /* pointer to the current kvec */
|
||||
};
|
||||
|
||||
extern void xdr_init_encode(struct xdr_stream *xdr, struct xdr_buf *buf, uint32_t *p);
|
||||
extern uint32_t *xdr_reserve_space(struct xdr_stream *xdr, size_t nbytes);
|
||||
extern void xdr_init_encode(struct xdr_stream *xdr, struct xdr_buf *buf, __be32 *p);
|
||||
extern __be32 *xdr_reserve_space(struct xdr_stream *xdr, size_t nbytes);
|
||||
extern void xdr_write_pages(struct xdr_stream *xdr, struct page **pages,
|
||||
unsigned int base, unsigned int len);
|
||||
extern void xdr_init_decode(struct xdr_stream *xdr, struct xdr_buf *buf, uint32_t *p);
|
||||
extern uint32_t *xdr_inline_decode(struct xdr_stream *xdr, size_t nbytes);
|
||||
extern void xdr_init_decode(struct xdr_stream *xdr, struct xdr_buf *buf, __be32 *p);
|
||||
extern __be32 *xdr_inline_decode(struct xdr_stream *xdr, size_t nbytes);
|
||||
extern void xdr_read_pages(struct xdr_stream *xdr, unsigned int len);
|
||||
extern void xdr_enter_page(struct xdr_stream *xdr, unsigned int len);
|
||||
|
||||
|
@ -79,7 +79,7 @@ struct rpc_rqst {
|
||||
* This is the private part
|
||||
*/
|
||||
struct rpc_task * rq_task; /* RPC task data */
|
||||
__u32 rq_xid; /* request XID */
|
||||
__be32 rq_xid; /* request XID */
|
||||
int rq_cong; /* has incremented xprt->cong */
|
||||
int rq_received; /* receive completed */
|
||||
u32 rq_seqno; /* gss seq no. used on req. */
|
||||
@ -171,9 +171,9 @@ struct rpc_xprt {
|
||||
/*
|
||||
* State of TCP reply receive stuff
|
||||
*/
|
||||
u32 tcp_recm, /* Fragment header */
|
||||
tcp_xid, /* Current XID */
|
||||
tcp_reclen, /* fragment length */
|
||||
__be32 tcp_recm, /* Fragment header */
|
||||
tcp_xid; /* Current XID */
|
||||
u32 tcp_reclen, /* fragment length */
|
||||
tcp_offset; /* fragment offset */
|
||||
unsigned long tcp_copied, /* copied to request */
|
||||
tcp_flags;
|
||||
@ -253,7 +253,7 @@ void xprt_release(struct rpc_task *task);
|
||||
struct rpc_xprt * xprt_get(struct rpc_xprt *xprt);
|
||||
void xprt_put(struct rpc_xprt *xprt);
|
||||
|
||||
static inline u32 *xprt_skip_transport_header(struct rpc_xprt *xprt, u32 *p)
|
||||
static inline __be32 *xprt_skip_transport_header(struct rpc_xprt *xprt, __be32 *p)
|
||||
{
|
||||
return p + xprt->tsh_size;
|
||||
}
|
||||
@ -268,7 +268,7 @@ void xprt_wait_for_buffer_space(struct rpc_task *task);
|
||||
void xprt_write_space(struct rpc_xprt *xprt);
|
||||
void xprt_update_rtt(struct rpc_task *task);
|
||||
void xprt_adjust_cwnd(struct rpc_task *task, int result);
|
||||
struct rpc_rqst * xprt_lookup_rqst(struct rpc_xprt *xprt, u32 xid);
|
||||
struct rpc_rqst * xprt_lookup_rqst(struct rpc_xprt *xprt, __be32 xid);
|
||||
void xprt_complete_rqst(struct rpc_task *task, int copied);
|
||||
void xprt_release_rqst_cong(struct rpc_task *task);
|
||||
void xprt_disconnect(struct rpc_xprt *xprt);
|
||||
|
@ -21,10 +21,10 @@
|
||||
#include <asm/byteorder.h>
|
||||
|
||||
struct tcphdr {
|
||||
__u16 source;
|
||||
__u16 dest;
|
||||
__u32 seq;
|
||||
__u32 ack_seq;
|
||||
__be16 source;
|
||||
__be16 dest;
|
||||
__be32 seq;
|
||||
__be32 ack_seq;
|
||||
#if defined(__LITTLE_ENDIAN_BITFIELD)
|
||||
__u16 res1:4,
|
||||
doff:4,
|
||||
@ -50,9 +50,9 @@ struct tcphdr {
|
||||
#else
|
||||
#error "Adjust your <asm/byteorder.h> defines"
|
||||
#endif
|
||||
__u16 window;
|
||||
__u16 check;
|
||||
__u16 urg_ptr;
|
||||
__be16 window;
|
||||
__be16 check;
|
||||
__be16 urg_ptr;
|
||||
};
|
||||
|
||||
/*
|
||||
@ -62,7 +62,7 @@ struct tcphdr {
|
||||
*/
|
||||
union tcp_word_hdr {
|
||||
struct tcphdr hdr;
|
||||
__u32 words[5];
|
||||
__be32 words[5];
|
||||
};
|
||||
|
||||
#define tcp_flag_word(tp) ( ((union tcp_word_hdr *)(tp))->words [3])
|
||||
@ -166,6 +166,11 @@ struct tcp_info
|
||||
#include <net/inet_timewait_sock.h>
|
||||
|
||||
/* This defines a selective acknowledgement block. */
|
||||
struct tcp_sack_block_wire {
|
||||
__be32 start_seq;
|
||||
__be32 end_seq;
|
||||
};
|
||||
|
||||
struct tcp_sack_block {
|
||||
__u32 start_seq;
|
||||
__u32 end_seq;
|
||||
@ -211,7 +216,7 @@ struct tcp_sock {
|
||||
* Header prediction flags
|
||||
* 0x5?10 << 16 + snd_wnd in net byte order
|
||||
*/
|
||||
__u32 pred_flags;
|
||||
__be32 pred_flags;
|
||||
|
||||
/*
|
||||
* RFC793 variables by their proper names. This means you can
|
||||
|
@ -28,7 +28,7 @@
|
||||
#include <linux/if_tr.h>
|
||||
|
||||
#ifdef __KERNEL__
|
||||
extern unsigned short tr_type_trans(struct sk_buff *skb, struct net_device *dev);
|
||||
extern __be16 tr_type_trans(struct sk_buff *skb, struct net_device *dev);
|
||||
extern void tr_source_route(struct sk_buff *skb, struct trh_hdr *trh, struct net_device *dev);
|
||||
extern struct net_device *alloc_trdev(int sizeof_priv);
|
||||
|
||||
|
@ -20,10 +20,10 @@
|
||||
#include <linux/types.h>
|
||||
|
||||
struct udphdr {
|
||||
__u16 source;
|
||||
__u16 dest;
|
||||
__u16 len;
|
||||
__u16 check;
|
||||
__be16 source;
|
||||
__be16 dest;
|
||||
__be16 len;
|
||||
__be16 check;
|
||||
};
|
||||
|
||||
/* UDP socket options */
|
||||
|
@ -12,8 +12,8 @@
|
||||
*/
|
||||
typedef union
|
||||
{
|
||||
__u32 a4;
|
||||
__u32 a6[4];
|
||||
__be32 a4;
|
||||
__be32 a6[4];
|
||||
} xfrm_address_t;
|
||||
|
||||
/* Ident of a specific xfrm_state. It is used on input to lookup
|
||||
@ -23,7 +23,7 @@ typedef union
|
||||
struct xfrm_id
|
||||
{
|
||||
xfrm_address_t daddr;
|
||||
__u32 spi;
|
||||
__be32 spi;
|
||||
__u8 proto;
|
||||
};
|
||||
|
||||
@ -49,10 +49,10 @@ struct xfrm_selector
|
||||
{
|
||||
xfrm_address_t daddr;
|
||||
xfrm_address_t saddr;
|
||||
__u16 dport;
|
||||
__u16 dport_mask;
|
||||
__u16 sport;
|
||||
__u16 sport_mask;
|
||||
__be16 dport;
|
||||
__be16 dport_mask;
|
||||
__be16 sport;
|
||||
__be16 sport_mask;
|
||||
__u16 family;
|
||||
__u8 prefixlen_d;
|
||||
__u8 prefixlen_s;
|
||||
@ -281,7 +281,7 @@ struct xfrm_usersa_info {
|
||||
|
||||
struct xfrm_usersa_id {
|
||||
xfrm_address_t daddr;
|
||||
__u32 spi;
|
||||
__be32 spi;
|
||||
__u16 family;
|
||||
__u8 proto;
|
||||
};
|
||||
|
@ -12,15 +12,15 @@ extern struct neigh_table arp_tbl;
|
||||
extern void arp_init(void);
|
||||
extern int arp_find(unsigned char *haddr, struct sk_buff *skb);
|
||||
extern int arp_ioctl(unsigned int cmd, void __user *arg);
|
||||
extern void arp_send(int type, int ptype, u32 dest_ip,
|
||||
struct net_device *dev, u32 src_ip,
|
||||
extern void arp_send(int type, int ptype, __be32 dest_ip,
|
||||
struct net_device *dev, __be32 src_ip,
|
||||
unsigned char *dest_hw, unsigned char *src_hw, unsigned char *th);
|
||||
extern int arp_bind_neighbour(struct dst_entry *dst);
|
||||
extern int arp_mc_map(u32 addr, u8 *haddr, struct net_device *dev, int dir);
|
||||
extern void arp_ifdown(struct net_device *dev);
|
||||
|
||||
extern struct sk_buff *arp_create(int type, int ptype, u32 dest_ip,
|
||||
struct net_device *dev, u32 src_ip,
|
||||
extern struct sk_buff *arp_create(int type, int ptype, __be32 dest_ip,
|
||||
struct net_device *dev, __be32 src_ip,
|
||||
unsigned char *dest_hw, unsigned char *src_hw,
|
||||
unsigned char *target_hw);
|
||||
extern void arp_xmit(struct sk_buff *skb);
|
||||
|
@ -44,12 +44,13 @@
|
||||
#define HCI_NOTIFY_VOICE_SETTING 3
|
||||
|
||||
/* HCI device types */
|
||||
#define HCI_VHCI 0
|
||||
#define HCI_VIRTUAL 0
|
||||
#define HCI_USB 1
|
||||
#define HCI_PCCARD 2
|
||||
#define HCI_UART 3
|
||||
#define HCI_RS232 4
|
||||
#define HCI_PCI 5
|
||||
#define HCI_SDIO 6
|
||||
|
||||
/* HCI device quirks */
|
||||
enum {
|
||||
@ -296,6 +297,7 @@ struct hci_cp_host_buffer_size {
|
||||
|
||||
/* Link Control */
|
||||
#define OGF_LINK_CTL 0x01
|
||||
|
||||
#define OCF_CREATE_CONN 0x0005
|
||||
struct hci_cp_create_conn {
|
||||
bdaddr_t bdaddr;
|
||||
@ -306,6 +308,11 @@ struct hci_cp_create_conn {
|
||||
__u8 role_switch;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
#define OCF_CREATE_CONN_CANCEL 0x0008
|
||||
struct hci_cp_create_conn_cancel {
|
||||
bdaddr_t bdaddr;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
#define OCF_ACCEPT_CONN_REQ 0x0009
|
||||
struct hci_cp_accept_conn_req {
|
||||
bdaddr_t bdaddr;
|
||||
@ -339,6 +346,8 @@ struct hci_cp_inquiry {
|
||||
|
||||
#define OCF_INQUIRY_CANCEL 0x0002
|
||||
|
||||
#define OCF_EXIT_PERIODIC_INQ 0x0004
|
||||
|
||||
#define OCF_LINK_KEY_REPLY 0x000B
|
||||
struct hci_cp_link_key_reply {
|
||||
bdaddr_t bdaddr;
|
||||
|
@ -72,6 +72,9 @@ struct hci_dev {
|
||||
__u8 type;
|
||||
bdaddr_t bdaddr;
|
||||
__u8 features[8];
|
||||
__u8 hci_ver;
|
||||
__u16 hci_rev;
|
||||
__u16 manufacturer;
|
||||
__u16 voice_setting;
|
||||
|
||||
__u16 pkt_type;
|
||||
@ -165,6 +168,10 @@ struct hci_conn {
|
||||
struct timer_list disc_timer;
|
||||
struct timer_list idle_timer;
|
||||
|
||||
struct work_struct work;
|
||||
|
||||
struct device dev;
|
||||
|
||||
struct hci_dev *hdev;
|
||||
void *l2cap_data;
|
||||
void *sco_data;
|
||||
@ -309,10 +316,13 @@ static inline void hci_conn_put(struct hci_conn *conn)
|
||||
if (atomic_dec_and_test(&conn->refcnt)) {
|
||||
unsigned long timeo;
|
||||
if (conn->type == ACL_LINK) {
|
||||
timeo = msecs_to_jiffies(HCI_DISCONN_TIMEOUT);
|
||||
if (!conn->out)
|
||||
timeo *= 2;
|
||||
del_timer(&conn->idle_timer);
|
||||
if (conn->state == BT_CONNECTED) {
|
||||
timeo = msecs_to_jiffies(HCI_DISCONN_TIMEOUT);
|
||||
if (!conn->out)
|
||||
timeo *= 2;
|
||||
} else
|
||||
timeo = msecs_to_jiffies(10);
|
||||
} else
|
||||
timeo = msecs_to_jiffies(10);
|
||||
mod_timer(&conn->disc_timer, jiffies + timeo);
|
||||
@ -412,6 +422,8 @@ static inline int hci_recv_frame(struct sk_buff *skb)
|
||||
|
||||
int hci_register_sysfs(struct hci_dev *hdev);
|
||||
void hci_unregister_sysfs(struct hci_dev *hdev);
|
||||
void hci_conn_add_sysfs(struct hci_conn *conn);
|
||||
void hci_conn_del_sysfs(struct hci_conn *conn);
|
||||
|
||||
#define SET_HCIDEV_DEV(hdev, pdev) ((hdev)->parent = (pdev))
|
||||
|
||||
|
@ -128,7 +128,9 @@ extern int cipso_v4_rbm_strictvalid;
|
||||
|
||||
#ifdef CONFIG_NETLABEL
|
||||
int cipso_v4_doi_add(struct cipso_v4_doi *doi_def);
|
||||
int cipso_v4_doi_remove(u32 doi, void (*callback) (struct rcu_head * head));
|
||||
int cipso_v4_doi_remove(u32 doi,
|
||||
u32 audit_secid,
|
||||
void (*callback) (struct rcu_head * head));
|
||||
struct cipso_v4_doi *cipso_v4_doi_getdef(u32 doi);
|
||||
int cipso_v4_doi_walk(u32 *skip_cnt,
|
||||
int (*callback) (struct cipso_v4_doi *doi_def, void *arg),
|
||||
@ -143,6 +145,7 @@ static inline int cipso_v4_doi_add(struct cipso_v4_doi *doi_def)
|
||||
}
|
||||
|
||||
static inline int cipso_v4_doi_remove(u32 doi,
|
||||
u32 audit_secid,
|
||||
void (*callback) (struct rcu_head * head))
|
||||
{
|
||||
return 0;
|
||||
|
@ -84,7 +84,7 @@ struct dst_entry
|
||||
struct dst_ops
|
||||
{
|
||||
unsigned short family;
|
||||
unsigned short protocol;
|
||||
__be16 protocol;
|
||||
unsigned gc_thresh;
|
||||
|
||||
int (*gc)(void);
|
||||
|
@ -16,8 +16,8 @@ struct flowi {
|
||||
|
||||
union {
|
||||
struct {
|
||||
__u32 daddr;
|
||||
__u32 saddr;
|
||||
__be32 daddr;
|
||||
__be32 saddr;
|
||||
__u32 fwmark;
|
||||
__u8 tos;
|
||||
__u8 scope;
|
||||
@ -56,8 +56,8 @@ struct flowi {
|
||||
#define FLOWI_FLAG_MULTIPATHOLDROUTE 0x01
|
||||
union {
|
||||
struct {
|
||||
__u16 sport;
|
||||
__u16 dport;
|
||||
__be16 sport;
|
||||
__be16 dport;
|
||||
} ports;
|
||||
|
||||
struct {
|
||||
@ -73,7 +73,7 @@ struct flowi {
|
||||
__u8 objname[16]; /* Not zero terminated */
|
||||
} dnports;
|
||||
|
||||
__u32 spi;
|
||||
__be32 spi;
|
||||
|
||||
#ifdef CONFIG_IPV6_MIP6
|
||||
struct {
|
||||
|
@ -38,7 +38,7 @@ struct dst_entry;
|
||||
struct net_proto_family;
|
||||
struct sk_buff;
|
||||
|
||||
extern void icmp_send(struct sk_buff *skb_in, int type, int code, u32 info);
|
||||
extern void icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info);
|
||||
extern int icmp_rcv(struct sk_buff *skb);
|
||||
extern int icmp_ioctl(struct sock *sk, int cmd, unsigned long arg);
|
||||
extern void icmp_init(struct net_proto_family *ops);
|
||||
|
@ -238,9 +238,9 @@ extern struct sock *inet_csk_accept(struct sock *sk, int flags, int *err);
|
||||
|
||||
extern struct request_sock *inet_csk_search_req(const struct sock *sk,
|
||||
struct request_sock ***prevp,
|
||||
const __u16 rport,
|
||||
const __u32 raddr,
|
||||
const __u32 laddr);
|
||||
const __be16 rport,
|
||||
const __be32 raddr,
|
||||
const __be32 laddr);
|
||||
extern int inet_csk_bind_conflict(const struct sock *sk,
|
||||
const struct inet_bind_bucket *tb);
|
||||
extern int inet_csk_get_port(struct inet_hashinfo *hashinfo,
|
||||
|
@ -272,42 +272,56 @@ static inline int inet_iif(const struct sk_buff *skb)
|
||||
}
|
||||
|
||||
extern struct sock *__inet_lookup_listener(struct inet_hashinfo *hashinfo,
|
||||
const u32 daddr,
|
||||
const __be32 daddr,
|
||||
const unsigned short hnum,
|
||||
const int dif);
|
||||
|
||||
static inline struct sock *inet_lookup_listener(struct inet_hashinfo *hashinfo,
|
||||
u32 daddr, u16 dport, int dif)
|
||||
__be32 daddr, __be16 dport, int dif)
|
||||
{
|
||||
return __inet_lookup_listener(hashinfo, daddr, ntohs(dport), dif);
|
||||
}
|
||||
|
||||
/* Socket demux engine toys. */
|
||||
/* What happens here is ugly; there's a pair of adjacent fields in
|
||||
struct inet_sock; __be16 dport followed by __u16 num. We want to
|
||||
search by pair, so we combine the keys into a single 32bit value
|
||||
and compare with 32bit value read from &...->dport. Let's at least
|
||||
make sure that it's not mixed with anything else...
|
||||
On 64bit targets we combine comparisons with pair of adjacent __be32
|
||||
fields in the same way.
|
||||
*/
|
||||
typedef __u32 __bitwise __portpair;
|
||||
#ifdef __BIG_ENDIAN
|
||||
#define INET_COMBINED_PORTS(__sport, __dport) \
|
||||
(((__u32)(__sport) << 16) | (__u32)(__dport))
|
||||
((__force __portpair)(((__force __u32)(__be16)(__sport) << 16) | (__u32)(__dport)))
|
||||
#else /* __LITTLE_ENDIAN */
|
||||
#define INET_COMBINED_PORTS(__sport, __dport) \
|
||||
(((__u32)(__dport) << 16) | (__u32)(__sport))
|
||||
((__force __portpair)(((__u32)(__dport) << 16) | (__force __u32)(__be16)(__sport)))
|
||||
#endif
|
||||
|
||||
#if (BITS_PER_LONG == 64)
|
||||
typedef __u64 __bitwise __addrpair;
|
||||
#ifdef __BIG_ENDIAN
|
||||
#define INET_ADDR_COOKIE(__name, __saddr, __daddr) \
|
||||
const __u64 __name = (((__u64)(__saddr)) << 32) | ((__u64)(__daddr));
|
||||
const __addrpair __name = (__force __addrpair) ( \
|
||||
(((__force __u64)(__be32)(__saddr)) << 32) | \
|
||||
((__force __u64)(__be32)(__daddr)));
|
||||
#else /* __LITTLE_ENDIAN */
|
||||
#define INET_ADDR_COOKIE(__name, __saddr, __daddr) \
|
||||
const __u64 __name = (((__u64)(__daddr)) << 32) | ((__u64)(__saddr));
|
||||
const __addrpair __name = (__force __addrpair) ( \
|
||||
(((__force __u64)(__be32)(__daddr)) << 32) | \
|
||||
((__force __u64)(__be32)(__saddr)));
|
||||
#endif /* __BIG_ENDIAN */
|
||||
#define INET_MATCH(__sk, __hash, __cookie, __saddr, __daddr, __ports, __dif)\
|
||||
(((__sk)->sk_hash == (__hash)) && \
|
||||
((*((__u64 *)&(inet_sk(__sk)->daddr))) == (__cookie)) && \
|
||||
((*((__u32 *)&(inet_sk(__sk)->dport))) == (__ports)) && \
|
||||
((*((__addrpair *)&(inet_sk(__sk)->daddr))) == (__cookie)) && \
|
||||
((*((__portpair *)&(inet_sk(__sk)->dport))) == (__ports)) && \
|
||||
(!((__sk)->sk_bound_dev_if) || ((__sk)->sk_bound_dev_if == (__dif))))
|
||||
#define INET_TW_MATCH(__sk, __hash, __cookie, __saddr, __daddr, __ports, __dif)\
|
||||
(((__sk)->sk_hash == (__hash)) && \
|
||||
((*((__u64 *)&(inet_twsk(__sk)->tw_daddr))) == (__cookie)) && \
|
||||
((*((__u32 *)&(inet_twsk(__sk)->tw_dport))) == (__ports)) && \
|
||||
((*((__addrpair *)&(inet_twsk(__sk)->tw_daddr))) == (__cookie)) && \
|
||||
((*((__portpair *)&(inet_twsk(__sk)->tw_dport))) == (__ports)) && \
|
||||
(!((__sk)->sk_bound_dev_if) || ((__sk)->sk_bound_dev_if == (__dif))))
|
||||
#else /* 32-bit arch */
|
||||
#define INET_ADDR_COOKIE(__name, __saddr, __daddr)
|
||||
@ -315,13 +329,13 @@ static inline struct sock *inet_lookup_listener(struct inet_hashinfo *hashinfo,
|
||||
(((__sk)->sk_hash == (__hash)) && \
|
||||
(inet_sk(__sk)->daddr == (__saddr)) && \
|
||||
(inet_sk(__sk)->rcv_saddr == (__daddr)) && \
|
||||
((*((__u32 *)&(inet_sk(__sk)->dport))) == (__ports)) && \
|
||||
((*((__portpair *)&(inet_sk(__sk)->dport))) == (__ports)) && \
|
||||
(!((__sk)->sk_bound_dev_if) || ((__sk)->sk_bound_dev_if == (__dif))))
|
||||
#define INET_TW_MATCH(__sk, __hash,__cookie, __saddr, __daddr, __ports, __dif) \
|
||||
(((__sk)->sk_hash == (__hash)) && \
|
||||
(inet_twsk(__sk)->tw_daddr == (__saddr)) && \
|
||||
(inet_twsk(__sk)->tw_rcv_saddr == (__daddr)) && \
|
||||
((*((__u32 *)&(inet_twsk(__sk)->tw_dport))) == (__ports)) && \
|
||||
((*((__portpair *)&(inet_twsk(__sk)->tw_dport))) == (__ports)) && \
|
||||
(!((__sk)->sk_bound_dev_if) || ((__sk)->sk_bound_dev_if == (__dif))))
|
||||
#endif /* 64-bit arch */
|
||||
|
||||
@ -333,12 +347,12 @@ static inline struct sock *inet_lookup_listener(struct inet_hashinfo *hashinfo,
|
||||
*/
|
||||
static inline struct sock *
|
||||
__inet_lookup_established(struct inet_hashinfo *hashinfo,
|
||||
const u32 saddr, const u16 sport,
|
||||
const u32 daddr, const u16 hnum,
|
||||
const __be32 saddr, const __be16 sport,
|
||||
const __be32 daddr, const u16 hnum,
|
||||
const int dif)
|
||||
{
|
||||
INET_ADDR_COOKIE(acookie, saddr, daddr)
|
||||
const __u32 ports = INET_COMBINED_PORTS(sport, hnum);
|
||||
const __portpair ports = INET_COMBINED_PORTS(sport, hnum);
|
||||
struct sock *sk;
|
||||
const struct hlist_node *node;
|
||||
/* Optimize here for direct hit, only listening connections can
|
||||
@ -370,8 +384,8 @@ static inline struct sock *
|
||||
|
||||
static inline struct sock *
|
||||
inet_lookup_established(struct inet_hashinfo *hashinfo,
|
||||
const u32 saddr, const u16 sport,
|
||||
const u32 daddr, const u16 dport,
|
||||
const __be32 saddr, const __be16 sport,
|
||||
const __be32 daddr, const __be16 dport,
|
||||
const int dif)
|
||||
{
|
||||
return __inet_lookup_established(hashinfo, saddr, sport, daddr,
|
||||
@ -379,8 +393,8 @@ static inline struct sock *
|
||||
}
|
||||
|
||||
static inline struct sock *__inet_lookup(struct inet_hashinfo *hashinfo,
|
||||
const u32 saddr, const u16 sport,
|
||||
const u32 daddr, const u16 dport,
|
||||
const __be32 saddr, const __be16 sport,
|
||||
const __be32 daddr, const __be16 dport,
|
||||
const int dif)
|
||||
{
|
||||
u16 hnum = ntohs(dport);
|
||||
@ -390,8 +404,8 @@ static inline struct sock *__inet_lookup(struct inet_hashinfo *hashinfo,
|
||||
}
|
||||
|
||||
static inline struct sock *inet_lookup(struct inet_hashinfo *hashinfo,
|
||||
const u32 saddr, const u16 sport,
|
||||
const u32 daddr, const u16 dport,
|
||||
const __be32 saddr, const __be16 sport,
|
||||
const __be32 daddr, const __be16 dport,
|
||||
const int dif)
|
||||
{
|
||||
struct sock *sk;
|
||||
|
@ -36,7 +36,7 @@
|
||||
* @ts_needaddr - Need to record addr of outgoing dev
|
||||
*/
|
||||
struct ip_options {
|
||||
__u32 faddr;
|
||||
__be32 faddr;
|
||||
unsigned char optlen;
|
||||
unsigned char srr;
|
||||
unsigned char rr;
|
||||
@ -62,9 +62,9 @@ struct inet_request_sock {
|
||||
u16 inet6_rsk_offset;
|
||||
/* 2 bytes hole, try to pack */
|
||||
#endif
|
||||
u32 loc_addr;
|
||||
u32 rmt_addr;
|
||||
u16 rmt_port;
|
||||
__be32 loc_addr;
|
||||
__be32 rmt_addr;
|
||||
__be16 rmt_port;
|
||||
u16 snd_wscale : 4,
|
||||
rcv_wscale : 4,
|
||||
tstamp_ok : 1,
|
||||
@ -110,15 +110,15 @@ struct inet_sock {
|
||||
struct ipv6_pinfo *pinet6;
|
||||
#endif
|
||||
/* Socket demultiplex comparisons on incoming packets. */
|
||||
__u32 daddr;
|
||||
__u32 rcv_saddr;
|
||||
__u16 dport;
|
||||
__be32 daddr;
|
||||
__be32 rcv_saddr;
|
||||
__be16 dport;
|
||||
__u16 num;
|
||||
__u32 saddr;
|
||||
__be32 saddr;
|
||||
__s16 uc_ttl;
|
||||
__u16 cmsg_flags;
|
||||
struct ip_options *opt;
|
||||
__u16 sport;
|
||||
__be16 sport;
|
||||
__u16 id;
|
||||
__u8 tos;
|
||||
__u8 mc_ttl;
|
||||
@ -129,7 +129,7 @@ struct inet_sock {
|
||||
hdrincl:1,
|
||||
mc_loop:1;
|
||||
int mc_index;
|
||||
__u32 mc_addr;
|
||||
__be32 mc_addr;
|
||||
struct ip_mc_socklist *mc_list;
|
||||
struct {
|
||||
unsigned int flags;
|
||||
@ -137,7 +137,7 @@ struct inet_sock {
|
||||
struct ip_options *opt;
|
||||
struct rtable *rt;
|
||||
int length; /* Total length of all frames */
|
||||
u32 addr;
|
||||
__be32 addr;
|
||||
struct flowi fl;
|
||||
} cork;
|
||||
};
|
||||
@ -167,10 +167,10 @@ static inline void inet_sk_copy_descendant(struct sock *sk_to,
|
||||
|
||||
extern int inet_sk_rebuild_header(struct sock *sk);
|
||||
|
||||
static inline unsigned int inet_ehashfn(const __u32 laddr, const __u16 lport,
|
||||
const __u32 faddr, const __u16 fport)
|
||||
static inline unsigned int inet_ehashfn(const __be32 laddr, const __u16 lport,
|
||||
const __be32 faddr, const __be16 fport)
|
||||
{
|
||||
unsigned int h = (laddr ^ lport) ^ (faddr ^ fport);
|
||||
unsigned int h = ((__force __u32)laddr ^ lport) ^ ((__force __u32)faddr ^ (__force __u32)fport);
|
||||
h ^= h >> 16;
|
||||
h ^= h >> 8;
|
||||
return h;
|
||||
@ -179,10 +179,10 @@ static inline unsigned int inet_ehashfn(const __u32 laddr, const __u16 lport,
|
||||
static inline int inet_sk_ehashfn(const struct sock *sk)
|
||||
{
|
||||
const struct inet_sock *inet = inet_sk(sk);
|
||||
const __u32 laddr = inet->rcv_saddr;
|
||||
const __be32 laddr = inet->rcv_saddr;
|
||||
const __u16 lport = inet->num;
|
||||
const __u32 faddr = inet->daddr;
|
||||
const __u16 fport = inet->dport;
|
||||
const __be32 faddr = inet->daddr;
|
||||
const __be16 fport = inet->dport;
|
||||
|
||||
return inet_ehashfn(laddr, lport, faddr, fport);
|
||||
}
|
||||
|
@ -120,10 +120,10 @@ struct inet_timewait_sock {
|
||||
unsigned char tw_rcv_wscale;
|
||||
/* Socket demultiplex comparisons on incoming packets. */
|
||||
/* these five are in inet_sock */
|
||||
__u16 tw_sport;
|
||||
__u32 tw_daddr __attribute__((aligned(INET_TIMEWAIT_ADDRCMP_ALIGN_BYTES)));
|
||||
__u32 tw_rcv_saddr;
|
||||
__u16 tw_dport;
|
||||
__be16 tw_sport;
|
||||
__be32 tw_daddr __attribute__((aligned(INET_TIMEWAIT_ADDRCMP_ALIGN_BYTES)));
|
||||
__be32 tw_rcv_saddr;
|
||||
__be16 tw_dport;
|
||||
__u16 tw_num;
|
||||
/* And these are ours. */
|
||||
__u8 tw_ipv6only:1;
|
||||
@ -186,7 +186,7 @@ static inline struct inet_timewait_sock *inet_twsk(const struct sock *sk)
|
||||
return (struct inet_timewait_sock *)sk;
|
||||
}
|
||||
|
||||
static inline u32 inet_rcv_saddr(const struct sock *sk)
|
||||
static inline __be32 inet_rcv_saddr(const struct sock *sk)
|
||||
{
|
||||
return likely(sk->sk_state != TCP_TIME_WAIT) ?
|
||||
inet_sk(sk)->rcv_saddr : inet_twsk(sk)->tw_rcv_saddr;
|
||||
|
@ -22,7 +22,7 @@ struct inet_peer
|
||||
unsigned long dtime; /* the time of last use of not
|
||||
* referenced entries */
|
||||
atomic_t refcnt;
|
||||
__u32 v4daddr; /* peer's address */
|
||||
__be32 v4daddr; /* peer's address */
|
||||
__u16 avl_height;
|
||||
__u16 ip_id_count; /* IP ID for the next packet */
|
||||
atomic_t rid; /* Frag reception counter */
|
||||
@ -33,7 +33,7 @@ struct inet_peer
|
||||
void inet_initpeers(void) __init;
|
||||
|
||||
/* can be called with or without local BH being disabled */
|
||||
struct inet_peer *inet_getpeer(__u32 daddr, int create);
|
||||
struct inet_peer *inet_getpeer(__be32 daddr, int create);
|
||||
|
||||
extern spinlock_t inet_peer_unused_lock;
|
||||
extern struct inet_peer **inet_peer_unused_tailp;
|
||||
|
@ -45,7 +45,7 @@ struct inet_skb_parm
|
||||
|
||||
struct ipcm_cookie
|
||||
{
|
||||
u32 addr;
|
||||
__be32 addr;
|
||||
int oif;
|
||||
struct ip_options *opt;
|
||||
};
|
||||
@ -86,7 +86,7 @@ extern int igmp_mc_proc_init(void);
|
||||
*/
|
||||
|
||||
extern int ip_build_and_send_pkt(struct sk_buff *skb, struct sock *sk,
|
||||
u32 saddr, u32 daddr,
|
||||
__be32 saddr, __be32 daddr,
|
||||
struct ip_options *opt);
|
||||
extern int ip_rcv(struct sk_buff *skb, struct net_device *dev,
|
||||
struct packet_type *pt, struct net_device *orig_dev);
|
||||
@ -335,7 +335,7 @@ extern int ip_net_unreachable(struct sk_buff *skb);
|
||||
* Functions provided by ip_options.c
|
||||
*/
|
||||
|
||||
extern void ip_options_build(struct sk_buff *skb, struct ip_options *opt, u32 daddr, struct rtable *rt, int is_frag);
|
||||
extern void ip_options_build(struct sk_buff *skb, struct ip_options *opt, __be32 daddr, struct rtable *rt, int is_frag);
|
||||
extern int ip_options_echo(struct ip_options *dopt, struct sk_buff *skb);
|
||||
extern void ip_options_fragment(struct sk_buff *skb);
|
||||
extern int ip_options_compile(struct ip_options *opt, struct sk_buff *skb);
|
||||
@ -363,8 +363,8 @@ extern int ip_ra_control(struct sock *sk, unsigned char on, void (*destructor)(s
|
||||
|
||||
extern int ip_recv_error(struct sock *sk, struct msghdr *msg, int len);
|
||||
extern void ip_icmp_error(struct sock *sk, struct sk_buff *skb, int err,
|
||||
u16 port, u32 info, u8 *payload);
|
||||
extern void ip_local_error(struct sock *sk, int err, u32 daddr, u16 dport,
|
||||
__be16 port, u32 info, u8 *payload);
|
||||
extern void ip_local_error(struct sock *sk, int err, __be32 daddr, __be16 dport,
|
||||
u32 info);
|
||||
|
||||
/* sysctl helpers - any sysctl which holds a value that ends up being
|
||||
|
@ -30,13 +30,13 @@ struct fib_config {
|
||||
u8 fc_type;
|
||||
/* 1 byte unused */
|
||||
u32 fc_table;
|
||||
u32 fc_dst;
|
||||
u32 fc_src;
|
||||
u32 fc_gw;
|
||||
__be32 fc_dst;
|
||||
__be32 fc_src;
|
||||
__be32 fc_gw;
|
||||
int fc_oif;
|
||||
u32 fc_flags;
|
||||
u32 fc_priority;
|
||||
u32 fc_prefsrc;
|
||||
__be32 fc_prefsrc;
|
||||
struct nlattr *fc_mx;
|
||||
struct rtnexthop *fc_mp;
|
||||
int fc_mx_len;
|
||||
@ -63,7 +63,7 @@ struct fib_nh {
|
||||
__u32 nh_tclassid;
|
||||
#endif
|
||||
int nh_oif;
|
||||
u32 nh_gw;
|
||||
__be32 nh_gw;
|
||||
};
|
||||
|
||||
/*
|
||||
@ -78,7 +78,7 @@ struct fib_info {
|
||||
int fib_dead;
|
||||
unsigned fib_flags;
|
||||
int fib_protocol;
|
||||
u32 fib_prefsrc;
|
||||
__be32 fib_prefsrc;
|
||||
u32 fib_priority;
|
||||
u32 fib_metrics[RTAX_MAX];
|
||||
#define fib_mtu fib_metrics[RTAX_MTU-1]
|
||||
@ -107,8 +107,8 @@ struct fib_result {
|
||||
unsigned char type;
|
||||
unsigned char scope;
|
||||
#ifdef CONFIG_IP_ROUTE_MULTIPATH_CACHED
|
||||
__u32 network;
|
||||
__u32 netmask;
|
||||
__be32 network;
|
||||
__be32 netmask;
|
||||
#endif
|
||||
struct fib_info *fi;
|
||||
#ifdef CONFIG_IP_MULTIPLE_TABLES
|
||||
@ -117,7 +117,7 @@ struct fib_result {
|
||||
};
|
||||
|
||||
struct fib_result_nl {
|
||||
u32 fl_addr; /* To be looked up*/
|
||||
__be32 fl_addr; /* To be looked up*/
|
||||
u32 fl_fwmark;
|
||||
unsigned char fl_tos;
|
||||
unsigned char fl_scope;
|
||||
@ -222,17 +222,17 @@ extern int inet_rtm_delroute(struct sk_buff *skb, struct nlmsghdr* nlh, void *ar
|
||||
extern int inet_rtm_newroute(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg);
|
||||
extern int inet_rtm_getroute(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg);
|
||||
extern int inet_dump_fib(struct sk_buff *skb, struct netlink_callback *cb);
|
||||
extern int fib_validate_source(u32 src, u32 dst, u8 tos, int oif,
|
||||
struct net_device *dev, u32 *spec_dst, u32 *itag);
|
||||
extern int fib_validate_source(__be32 src, __be32 dst, u8 tos, int oif,
|
||||
struct net_device *dev, __be32 *spec_dst, u32 *itag);
|
||||
extern void fib_select_multipath(const struct flowi *flp, struct fib_result *res);
|
||||
|
||||
struct rtentry;
|
||||
|
||||
/* Exported by fib_semantics.c */
|
||||
extern int ip_fib_check_default(u32 gw, struct net_device *dev);
|
||||
extern int fib_sync_down(u32 local, struct net_device *dev, int force);
|
||||
extern int ip_fib_check_default(__be32 gw, struct net_device *dev);
|
||||
extern int fib_sync_down(__be32 local, struct net_device *dev, int force);
|
||||
extern int fib_sync_up(struct net_device *dev);
|
||||
extern u32 __fib_res_prefsrc(struct fib_result *res);
|
||||
extern __be32 __fib_res_prefsrc(struct fib_result *res);
|
||||
|
||||
/* Exported by fib_hash.c */
|
||||
extern struct fib_table *fib_hash_init(u32 id);
|
||||
|
@ -17,7 +17,7 @@ struct ip_mp_alg_ops {
|
||||
void (*mp_alg_select_route)(const struct flowi *flp,
|
||||
struct rtable *rth, struct rtable **rp);
|
||||
void (*mp_alg_flush)(void);
|
||||
void (*mp_alg_set_nhinfo)(__u32 network, __u32 netmask,
|
||||
void (*mp_alg_set_nhinfo)(__be32 network, __be32 netmask,
|
||||
unsigned char prefixlen,
|
||||
const struct fib_nh *nh);
|
||||
void (*mp_alg_remove)(struct rtable *rth);
|
||||
@ -59,7 +59,7 @@ static inline void multipath_flush(void)
|
||||
}
|
||||
|
||||
static inline void multipath_set_nhinfo(struct rtable *rth,
|
||||
__u32 network, __u32 netmask,
|
||||
__be32 network, __be32 netmask,
|
||||
unsigned char prefixlen,
|
||||
const struct fib_nh *nh)
|
||||
{
|
||||
|
@ -100,22 +100,22 @@
|
||||
struct ip_vs_service_user {
|
||||
/* virtual service addresses */
|
||||
u_int16_t protocol;
|
||||
u_int32_t addr; /* virtual ip address */
|
||||
u_int16_t port;
|
||||
__be32 addr; /* virtual ip address */
|
||||
__be16 port;
|
||||
u_int32_t fwmark; /* firwall mark of service */
|
||||
|
||||
/* virtual service options */
|
||||
char sched_name[IP_VS_SCHEDNAME_MAXLEN];
|
||||
unsigned flags; /* virtual service flags */
|
||||
unsigned timeout; /* persistent timeout in sec */
|
||||
u_int32_t netmask; /* persistent netmask */
|
||||
__be32 netmask; /* persistent netmask */
|
||||
};
|
||||
|
||||
|
||||
struct ip_vs_dest_user {
|
||||
/* destination server address */
|
||||
u_int32_t addr;
|
||||
u_int16_t port;
|
||||
__be32 addr;
|
||||
__be16 port;
|
||||
|
||||
/* real server options */
|
||||
unsigned conn_flags; /* connection flags */
|
||||
@ -163,15 +163,15 @@ struct ip_vs_getinfo {
|
||||
struct ip_vs_service_entry {
|
||||
/* which service: user fills in these */
|
||||
u_int16_t protocol;
|
||||
u_int32_t addr; /* virtual address */
|
||||
u_int16_t port;
|
||||
__be32 addr; /* virtual address */
|
||||
__be16 port;
|
||||
u_int32_t fwmark; /* firwall mark of service */
|
||||
|
||||
/* service options */
|
||||
char sched_name[IP_VS_SCHEDNAME_MAXLEN];
|
||||
unsigned flags; /* virtual service flags */
|
||||
unsigned timeout; /* persistent timeout */
|
||||
u_int32_t netmask; /* persistent netmask */
|
||||
__be32 netmask; /* persistent netmask */
|
||||
|
||||
/* number of real servers */
|
||||
unsigned int num_dests;
|
||||
@ -182,8 +182,8 @@ struct ip_vs_service_entry {
|
||||
|
||||
|
||||
struct ip_vs_dest_entry {
|
||||
u_int32_t addr; /* destination address */
|
||||
u_int16_t port;
|
||||
__be32 addr; /* destination address */
|
||||
__be16 port;
|
||||
unsigned conn_flags; /* connection flags */
|
||||
int weight; /* destination weight */
|
||||
|
||||
@ -203,8 +203,8 @@ struct ip_vs_dest_entry {
|
||||
struct ip_vs_get_dests {
|
||||
/* which service: user fills in these */
|
||||
u_int16_t protocol;
|
||||
u_int32_t addr; /* virtual address */
|
||||
u_int16_t port;
|
||||
__be32 addr; /* virtual address */
|
||||
__be16 port;
|
||||
u_int32_t fwmark; /* firwall mark of service */
|
||||
|
||||
/* number of real servers */
|
||||
@ -502,12 +502,12 @@ struct ip_vs_conn {
|
||||
struct list_head c_list; /* hashed list heads */
|
||||
|
||||
/* Protocol, addresses and port numbers */
|
||||
__u32 caddr; /* client address */
|
||||
__u32 vaddr; /* virtual address */
|
||||
__u32 daddr; /* destination address */
|
||||
__u16 cport;
|
||||
__u16 vport;
|
||||
__u16 dport;
|
||||
__be32 caddr; /* client address */
|
||||
__be32 vaddr; /* virtual address */
|
||||
__be32 daddr; /* destination address */
|
||||
__be16 cport;
|
||||
__be16 vport;
|
||||
__be16 dport;
|
||||
__u16 protocol; /* Which protocol (TCP/UDP) */
|
||||
|
||||
/* counter and timer */
|
||||
@ -554,12 +554,12 @@ struct ip_vs_service {
|
||||
atomic_t usecnt; /* use counter */
|
||||
|
||||
__u16 protocol; /* which protocol (TCP/UDP) */
|
||||
__u32 addr; /* IP address for virtual service */
|
||||
__u16 port; /* port number for the service */
|
||||
__be32 addr; /* IP address for virtual service */
|
||||
__be16 port; /* port number for the service */
|
||||
__u32 fwmark; /* firewall mark of the service */
|
||||
unsigned flags; /* service status flags */
|
||||
unsigned timeout; /* persistent timeout in ticks */
|
||||
__u32 netmask; /* grouping granularity */
|
||||
__be32 netmask; /* grouping granularity */
|
||||
|
||||
struct list_head destinations; /* real server d-linked list */
|
||||
__u32 num_dests; /* number of servers */
|
||||
@ -581,8 +581,8 @@ struct ip_vs_dest {
|
||||
struct list_head n_list; /* for the dests in the service */
|
||||
struct list_head d_list; /* for table with all the dests */
|
||||
|
||||
__u32 addr; /* IP address of the server */
|
||||
__u16 port; /* port number of the server */
|
||||
__be32 addr; /* IP address of the server */
|
||||
__be16 port; /* port number of the server */
|
||||
volatile unsigned flags; /* dest status flags */
|
||||
atomic_t conn_flags; /* flags to copy to conn */
|
||||
atomic_t weight; /* server weight */
|
||||
@ -605,8 +605,8 @@ struct ip_vs_dest {
|
||||
/* for virtual service */
|
||||
struct ip_vs_service *svc; /* service it belongs to */
|
||||
__u16 protocol; /* which protocol (TCP/UDP) */
|
||||
__u32 vaddr; /* virtual IP address */
|
||||
__u16 vport; /* virtual port number */
|
||||
__be32 vaddr; /* virtual IP address */
|
||||
__be16 vport; /* virtual port number */
|
||||
__u32 vfwmark; /* firewall mark of service */
|
||||
};
|
||||
|
||||
@ -648,7 +648,7 @@ struct ip_vs_app
|
||||
/* members for application incarnations */
|
||||
struct list_head p_list; /* member in proto app list */
|
||||
struct ip_vs_app *app; /* its real application */
|
||||
__u16 port; /* port number in net order */
|
||||
__be16 port; /* port number in net order */
|
||||
atomic_t usecnt; /* usage counter */
|
||||
|
||||
/* output hook: return false if can't linearize. diff set for TCP. */
|
||||
@ -740,11 +740,11 @@ enum {
|
||||
};
|
||||
|
||||
extern struct ip_vs_conn *ip_vs_conn_in_get
|
||||
(int protocol, __u32 s_addr, __u16 s_port, __u32 d_addr, __u16 d_port);
|
||||
(int protocol, __be32 s_addr, __be16 s_port, __be32 d_addr, __be16 d_port);
|
||||
extern struct ip_vs_conn *ip_vs_ct_in_get
|
||||
(int protocol, __u32 s_addr, __u16 s_port, __u32 d_addr, __u16 d_port);
|
||||
(int protocol, __be32 s_addr, __be16 s_port, __be32 d_addr, __be16 d_port);
|
||||
extern struct ip_vs_conn *ip_vs_conn_out_get
|
||||
(int protocol, __u32 s_addr, __u16 s_port, __u32 d_addr, __u16 d_port);
|
||||
(int protocol, __be32 s_addr, __be16 s_port, __be32 d_addr, __be16 d_port);
|
||||
|
||||
/* put back the conn without restarting its timer */
|
||||
static inline void __ip_vs_conn_put(struct ip_vs_conn *cp)
|
||||
@ -752,11 +752,11 @@ static inline void __ip_vs_conn_put(struct ip_vs_conn *cp)
|
||||
atomic_dec(&cp->refcnt);
|
||||
}
|
||||
extern void ip_vs_conn_put(struct ip_vs_conn *cp);
|
||||
extern void ip_vs_conn_fill_cport(struct ip_vs_conn *cp, __u16 cport);
|
||||
extern void ip_vs_conn_fill_cport(struct ip_vs_conn *cp, __be16 cport);
|
||||
|
||||
extern struct ip_vs_conn *
|
||||
ip_vs_conn_new(int proto, __u32 caddr, __u16 cport, __u32 vaddr, __u16 vport,
|
||||
__u32 daddr, __u16 dport, unsigned flags,
|
||||
ip_vs_conn_new(int proto, __be32 caddr, __be16 cport, __be32 vaddr, __be16 vport,
|
||||
__be32 daddr, __be16 dport, unsigned flags,
|
||||
struct ip_vs_dest *dest);
|
||||
extern void ip_vs_conn_expire_now(struct ip_vs_conn *cp);
|
||||
|
||||
@ -887,7 +887,7 @@ extern int sysctl_ip_vs_nat_icmp_send;
|
||||
extern struct ip_vs_stats ip_vs_stats;
|
||||
|
||||
extern struct ip_vs_service *
|
||||
ip_vs_service_get(__u32 fwmark, __u16 protocol, __u32 vaddr, __u16 vport);
|
||||
ip_vs_service_get(__u32 fwmark, __u16 protocol, __be32 vaddr, __be16 vport);
|
||||
|
||||
static inline void ip_vs_service_put(struct ip_vs_service *svc)
|
||||
{
|
||||
@ -895,7 +895,7 @@ static inline void ip_vs_service_put(struct ip_vs_service *svc)
|
||||
}
|
||||
|
||||
extern struct ip_vs_dest *
|
||||
ip_vs_lookup_real_service(__u16 protocol, __u32 daddr, __u16 dport);
|
||||
ip_vs_lookup_real_service(__u16 protocol, __be32 daddr, __be16 dport);
|
||||
extern int ip_vs_use_count_inc(void);
|
||||
extern void ip_vs_use_count_dec(void);
|
||||
extern int ip_vs_control_init(void);
|
||||
|
@ -318,8 +318,8 @@ static inline void ipv6_addr_prefix(struct in6_addr *pfx,
|
||||
|
||||
#ifndef __HAVE_ARCH_ADDR_SET
|
||||
static inline void ipv6_addr_set(struct in6_addr *addr,
|
||||
__u32 w1, __u32 w2,
|
||||
__u32 w3, __u32 w4)
|
||||
__be32 w1, __be32 w2,
|
||||
__be32 w3, __be32 w4)
|
||||
{
|
||||
addr->s6_addr32[0] = w1;
|
||||
addr->s6_addr32[1] = w2;
|
||||
@ -337,7 +337,7 @@ static inline int ipv6_addr_equal(const struct in6_addr *a1,
|
||||
a1->s6_addr32[3] == a2->s6_addr32[3]);
|
||||
}
|
||||
|
||||
static inline int __ipv6_prefix_equal(const u32 *a1, const u32 *a2,
|
||||
static inline int __ipv6_prefix_equal(const __be32 *a1, const __be32 *a2,
|
||||
unsigned int prefixlen)
|
||||
{
|
||||
unsigned pdw, pbi;
|
||||
|
@ -98,7 +98,15 @@
|
||||
#define IRLAN_SHORT 1
|
||||
#define IRLAN_ARRAY 2
|
||||
|
||||
#define IRLAN_MAX_HEADER (TTP_HEADER+LMP_HEADER+LAP_MAX_HEADER)
|
||||
/* IrLAN sits on top if IrTTP */
|
||||
#define IRLAN_MAX_HEADER (TTP_HEADER+LMP_HEADER)
|
||||
/* 1 byte for the command code and 1 byte for the parameter count */
|
||||
#define IRLAN_CMD_HEADER 2
|
||||
|
||||
#define IRLAN_STRING_PARAMETER_LEN(name, value) (1 + strlen((name)) + 2 \
|
||||
+ strlen ((value)))
|
||||
#define IRLAN_BYTE_PARAMETER_LEN(name) (1 + strlen((name)) + 2 + 1)
|
||||
#define IRLAN_SHORT_PARAMETER_LEN(name) (1 + strlen((name)) + 2 + 2)
|
||||
|
||||
/*
|
||||
* IrLAN client
|
||||
|
@ -74,6 +74,19 @@ struct discovery_t;
|
||||
|
||||
#define PF_BIT 0x10 /* Poll/final bit */
|
||||
|
||||
/* Some IrLAP field lengths */
|
||||
/*
|
||||
* Only baud rate triplet is 4 bytes (PV can be 2 bytes).
|
||||
* All others params (7) are 3 bytes, so that's 7*3 + 1*4 bytes.
|
||||
*/
|
||||
#define IRLAP_NEGOCIATION_PARAMS_LEN 25
|
||||
#define IRLAP_DISCOVERY_INFO_LEN 32
|
||||
|
||||
struct disc_frame {
|
||||
__u8 caddr; /* Connection address */
|
||||
__u8 control;
|
||||
} IRDA_PACK;
|
||||
|
||||
struct xid_frame {
|
||||
__u8 caddr; /* Connection address */
|
||||
__u8 control;
|
||||
@ -95,11 +108,25 @@ struct test_frame {
|
||||
struct ua_frame {
|
||||
__u8 caddr;
|
||||
__u8 control;
|
||||
|
||||
__u32 saddr; /* Source device address */
|
||||
__u32 daddr; /* Dest device address */
|
||||
} IRDA_PACK;
|
||||
|
||||
|
||||
struct dm_frame {
|
||||
__u8 caddr; /* Connection address */
|
||||
__u8 control;
|
||||
} IRDA_PACK;
|
||||
|
||||
struct rd_frame {
|
||||
__u8 caddr; /* Connection address */
|
||||
__u8 control;
|
||||
} IRDA_PACK;
|
||||
|
||||
struct rr_frame {
|
||||
__u8 caddr; /* Connection address */
|
||||
__u8 control;
|
||||
} IRDA_PACK;
|
||||
|
||||
struct i_frame {
|
||||
__u8 caddr;
|
||||
__u8 control;
|
||||
|
@ -48,7 +48,7 @@
|
||||
#define DEV_ADDR_ANY 0xffffffff
|
||||
|
||||
#define LMP_HEADER 2 /* Dest LSAP + Source LSAP */
|
||||
#define LMP_CONTROL_HEADER 4
|
||||
#define LMP_CONTROL_HEADER 4 /* LMP_HEADER + opcode + parameter */
|
||||
#define LMP_PID_HEADER 1 /* Used by Ultra */
|
||||
#define LMP_MAX_HEADER (LMP_CONTROL_HEADER+LAP_MAX_HEADER)
|
||||
|
||||
|
@ -96,7 +96,7 @@
|
||||
struct netlbl_dom_map;
|
||||
|
||||
/* Domain mapping operations */
|
||||
int netlbl_domhsh_remove(const char *domain);
|
||||
int netlbl_domhsh_remove(const char *domain, u32 audit_secid);
|
||||
|
||||
/* LSM security attributes */
|
||||
struct netlbl_lsm_cache {
|
||||
|
@ -831,6 +831,9 @@ static inline int nla_put_msecs(struct sk_buff *skb, int attrtype,
|
||||
#define NLA_PUT_U32(skb, attrtype, value) \
|
||||
NLA_PUT_TYPE(skb, u32, attrtype, value)
|
||||
|
||||
#define NLA_PUT_BE32(skb, attrtype, value) \
|
||||
NLA_PUT_TYPE(skb, __be32, attrtype, value)
|
||||
|
||||
#define NLA_PUT_U64(skb, attrtype, value) \
|
||||
NLA_PUT_TYPE(skb, u64, attrtype, value)
|
||||
|
||||
@ -852,6 +855,15 @@ static inline u32 nla_get_u32(struct nlattr *nla)
|
||||
return *(u32 *) nla_data(nla);
|
||||
}
|
||||
|
||||
/**
|
||||
* nla_get_be32 - return payload of __be32 attribute
|
||||
* @nla: __be32 netlink attribute
|
||||
*/
|
||||
static inline __be32 nla_get_be32(struct nlattr *nla)
|
||||
{
|
||||
return *(__be32 *) nla_data(nla);
|
||||
}
|
||||
|
||||
/**
|
||||
* nla_get_u16 - return payload of u16 attribute
|
||||
* @nla: u16 netlink attribute
|
||||
|
@ -62,18 +62,18 @@ struct rtable
|
||||
__u16 rt_type;
|
||||
__u16 rt_multipath_alg;
|
||||
|
||||
__u32 rt_dst; /* Path destination */
|
||||
__u32 rt_src; /* Path source */
|
||||
__be32 rt_dst; /* Path destination */
|
||||
__be32 rt_src; /* Path source */
|
||||
int rt_iif;
|
||||
|
||||
/* Info on neighbour */
|
||||
__u32 rt_gateway;
|
||||
__be32 rt_gateway;
|
||||
|
||||
/* Cache lookup keys */
|
||||
struct flowi fl;
|
||||
|
||||
/* Miscellaneous cached information */
|
||||
__u32 rt_spec_dst; /* RFC1122 specific destination */
|
||||
__be32 rt_spec_dst; /* RFC1122 specific destination */
|
||||
struct inet_peer *peer; /* long-living peer info */
|
||||
};
|
||||
|
||||
@ -109,18 +109,18 @@ extern struct ip_rt_acct *ip_rt_acct;
|
||||
|
||||
struct in_device;
|
||||
extern int ip_rt_init(void);
|
||||
extern void ip_rt_redirect(u32 old_gw, u32 dst, u32 new_gw,
|
||||
u32 src, struct net_device *dev);
|
||||
extern void ip_rt_redirect(__be32 old_gw, __be32 dst, __be32 new_gw,
|
||||
__be32 src, struct net_device *dev);
|
||||
extern void ip_rt_advice(struct rtable **rp, int advice);
|
||||
extern void rt_cache_flush(int how);
|
||||
extern int __ip_route_output_key(struct rtable **, const struct flowi *flp);
|
||||
extern int ip_route_output_key(struct rtable **, struct flowi *flp);
|
||||
extern int ip_route_output_flow(struct rtable **rp, struct flowi *flp, struct sock *sk, int flags);
|
||||
extern int ip_route_input(struct sk_buff*, u32 dst, u32 src, u8 tos, struct net_device *devin);
|
||||
extern int ip_route_input(struct sk_buff*, __be32 dst, __be32 src, u8 tos, struct net_device *devin);
|
||||
extern unsigned short ip_rt_frag_needed(struct iphdr *iph, unsigned short new_mtu);
|
||||
extern void ip_rt_send_redirect(struct sk_buff *skb);
|
||||
|
||||
extern unsigned inet_addr_type(u32 addr);
|
||||
extern unsigned inet_addr_type(__be32 addr);
|
||||
extern void ip_rt_multicast_event(struct in_device *);
|
||||
extern int ip_rt_ioctl(unsigned int cmd, void __user *arg);
|
||||
extern void ip_rt_get_source(u8 *src, struct rtable *rt);
|
||||
@ -144,9 +144,9 @@ static inline char rt_tos2priority(u8 tos)
|
||||
return ip_tos2prio[IPTOS_TOS(tos)>>1];
|
||||
}
|
||||
|
||||
static inline int ip_route_connect(struct rtable **rp, u32 dst,
|
||||
u32 src, u32 tos, int oif, u8 protocol,
|
||||
u16 sport, u16 dport, struct sock *sk)
|
||||
static inline int ip_route_connect(struct rtable **rp, __be32 dst,
|
||||
__be32 src, u32 tos, int oif, u8 protocol,
|
||||
__be16 sport, __be16 dport, struct sock *sk)
|
||||
{
|
||||
struct flowi fl = { .oif = oif,
|
||||
.nl_u = { .ip4_u = { .daddr = dst,
|
||||
@ -172,7 +172,7 @@ static inline int ip_route_connect(struct rtable **rp, u32 dst,
|
||||
}
|
||||
|
||||
static inline int ip_route_newports(struct rtable **rp, u8 protocol,
|
||||
u16 sport, u16 dport, struct sock *sk)
|
||||
__be16 sport, __be16 dport, struct sock *sk)
|
||||
{
|
||||
if (sport != (*rp)->fl.fl_ip_sport ||
|
||||
dport != (*rp)->fl.fl_ip_dport) {
|
||||
|
@ -437,8 +437,8 @@ static inline void xfrm_state_hold(struct xfrm_state *x)
|
||||
|
||||
static __inline__ int addr_match(void *token1, void *token2, int prefixlen)
|
||||
{
|
||||
__u32 *a1 = token1;
|
||||
__u32 *a2 = token2;
|
||||
__be32 *a1 = token1;
|
||||
__be32 *a2 = token2;
|
||||
int pdw;
|
||||
int pbi;
|
||||
|
||||
@ -450,7 +450,7 @@ static __inline__ int addr_match(void *token1, void *token2, int prefixlen)
|
||||
return 0;
|
||||
|
||||
if (pbi) {
|
||||
__u32 mask;
|
||||
__be32 mask;
|
||||
|
||||
mask = htonl((0xffffffff) << (32 - pbi));
|
||||
|
||||
@ -462,9 +462,9 @@ static __inline__ int addr_match(void *token1, void *token2, int prefixlen)
|
||||
}
|
||||
|
||||
static __inline__
|
||||
u16 xfrm_flowi_sport(struct flowi *fl)
|
||||
__be16 xfrm_flowi_sport(struct flowi *fl)
|
||||
{
|
||||
u16 port;
|
||||
__be16 port;
|
||||
switch(fl->proto) {
|
||||
case IPPROTO_TCP:
|
||||
case IPPROTO_UDP:
|
||||
@ -487,9 +487,9 @@ u16 xfrm_flowi_sport(struct flowi *fl)
|
||||
}
|
||||
|
||||
static __inline__
|
||||
u16 xfrm_flowi_dport(struct flowi *fl)
|
||||
__be16 xfrm_flowi_dport(struct flowi *fl)
|
||||
{
|
||||
u16 port;
|
||||
__be16 port;
|
||||
switch(fl->proto) {
|
||||
case IPPROTO_TCP:
|
||||
case IPPROTO_UDP:
|
||||
@ -912,7 +912,7 @@ extern int xfrm_state_check_expire(struct xfrm_state *x);
|
||||
extern void xfrm_state_insert(struct xfrm_state *x);
|
||||
extern int xfrm_state_add(struct xfrm_state *x);
|
||||
extern int xfrm_state_update(struct xfrm_state *x);
|
||||
extern struct xfrm_state *xfrm_state_lookup(xfrm_address_t *daddr, u32 spi, u8 proto, unsigned short family);
|
||||
extern struct xfrm_state *xfrm_state_lookup(xfrm_address_t *daddr, __be32 spi, u8 proto, unsigned short family);
|
||||
extern struct xfrm_state *xfrm_state_lookup_byaddr(xfrm_address_t *daddr, xfrm_address_t *saddr, u8 proto, unsigned short family);
|
||||
#ifdef CONFIG_XFRM_SUB_POLICY
|
||||
extern int xfrm_tmpl_sort(struct xfrm_tmpl **dst, struct xfrm_tmpl **src,
|
||||
@ -935,8 +935,8 @@ static inline int xfrm_state_sort(struct xfrm_state **dst, struct xfrm_state **s
|
||||
extern struct xfrm_state *xfrm_find_acq_byseq(u32 seq);
|
||||
extern int xfrm_state_delete(struct xfrm_state *x);
|
||||
extern void xfrm_state_flush(u8 proto);
|
||||
extern int xfrm_replay_check(struct xfrm_state *x, u32 seq);
|
||||
extern void xfrm_replay_advance(struct xfrm_state *x, u32 seq);
|
||||
extern int xfrm_replay_check(struct xfrm_state *x, __be32 seq);
|
||||
extern void xfrm_replay_advance(struct xfrm_state *x, __be32 seq);
|
||||
extern void xfrm_replay_notify(struct xfrm_state *x, int event);
|
||||
extern int xfrm_state_check(struct xfrm_state *x, struct sk_buff *skb);
|
||||
extern int xfrm_state_mtu(struct xfrm_state *x, int mtu);
|
||||
@ -945,7 +945,7 @@ extern int xfrm4_rcv(struct sk_buff *skb);
|
||||
extern int xfrm4_output(struct sk_buff *skb);
|
||||
extern int xfrm4_tunnel_register(struct xfrm_tunnel *handler);
|
||||
extern int xfrm4_tunnel_deregister(struct xfrm_tunnel *handler);
|
||||
extern int xfrm6_rcv_spi(struct sk_buff *skb, u32 spi);
|
||||
extern int xfrm6_rcv_spi(struct sk_buff *skb, __be32 spi);
|
||||
extern int xfrm6_rcv(struct sk_buff **pskb);
|
||||
extern int xfrm6_input_addr(struct sk_buff *skb, xfrm_address_t *daddr,
|
||||
xfrm_address_t *saddr, u8 proto);
|
||||
@ -989,7 +989,7 @@ struct xfrm_policy *xfrm_policy_bysel_ctx(u8 type, int dir,
|
||||
struct xfrm_policy *xfrm_policy_byid(u8, int dir, u32 id, int delete);
|
||||
void xfrm_policy_flush(u8 type);
|
||||
u32 xfrm_get_acqseq(void);
|
||||
void xfrm_alloc_spi(struct xfrm_state *x, u32 minspi, u32 maxspi);
|
||||
void xfrm_alloc_spi(struct xfrm_state *x, __be32 minspi, __be32 maxspi);
|
||||
struct xfrm_state * xfrm_find_acq(u8 mode, u32 reqid, u8 proto,
|
||||
xfrm_address_t *daddr, xfrm_address_t *saddr,
|
||||
int create, unsigned short family);
|
||||
@ -1004,7 +1004,7 @@ extern void km_policy_expired(struct xfrm_policy *pol, int dir, int hard, u32 pi
|
||||
extern int km_report(u8 proto, struct xfrm_selector *sel, xfrm_address_t *addr);
|
||||
|
||||
extern void xfrm_input_init(void);
|
||||
extern int xfrm_parse_spi(struct sk_buff *skb, u8 nexthdr, u32 *spi, u32 *seq);
|
||||
extern int xfrm_parse_spi(struct sk_buff *skb, u8 nexthdr, __be32 *spi, __be32 *seq);
|
||||
|
||||
extern void xfrm_probe_algs(void);
|
||||
extern int xfrm_count_auth_supported(void);
|
||||
|
12
net/802/tr.c
12
net/802/tr.c
@ -164,7 +164,7 @@ static int tr_rebuild_header(struct sk_buff *skb)
|
||||
*/
|
||||
|
||||
if(trllc->ethertype != htons(ETH_P_IP)) {
|
||||
printk("tr_rebuild_header: Don't know how to resolve type %04X addresses ?\n",(unsigned int)htons(trllc->ethertype));
|
||||
printk("tr_rebuild_header: Don't know how to resolve type %04X addresses ?\n", ntohs(trllc->ethertype));
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -186,7 +186,7 @@ static int tr_rebuild_header(struct sk_buff *skb)
|
||||
* it via SNAP.
|
||||
*/
|
||||
|
||||
unsigned short tr_type_trans(struct sk_buff *skb, struct net_device *dev)
|
||||
__be16 tr_type_trans(struct sk_buff *skb, struct net_device *dev)
|
||||
{
|
||||
|
||||
struct trh_hdr *trh=(struct trh_hdr *)skb->data;
|
||||
@ -229,15 +229,15 @@ unsigned short tr_type_trans(struct sk_buff *skb, struct net_device *dev)
|
||||
*/
|
||||
|
||||
if (trllc->dsap == EXTENDED_SAP &&
|
||||
(trllc->ethertype == ntohs(ETH_P_IP) ||
|
||||
trllc->ethertype == ntohs(ETH_P_IPV6) ||
|
||||
trllc->ethertype == ntohs(ETH_P_ARP)))
|
||||
(trllc->ethertype == htons(ETH_P_IP) ||
|
||||
trllc->ethertype == htons(ETH_P_IPV6) ||
|
||||
trllc->ethertype == htons(ETH_P_ARP)))
|
||||
{
|
||||
skb_pull(skb, sizeof(struct trllc));
|
||||
return trllc->ethertype;
|
||||
}
|
||||
|
||||
return ntohs(ETH_P_TR_802_2);
|
||||
return htons(ETH_P_TR_802_2);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -231,7 +231,7 @@ config NET_TCPPROBE
|
||||
TCP congestion avoidance modules. If you don't understand
|
||||
what was just said, you don't need it: say N.
|
||||
|
||||
Documentation on how to use the packet generator can be found
|
||||
Documentation on how to use TCP connection probing can be found
|
||||
at http://linux-net.osdl.org/index.php/TcpProbe
|
||||
|
||||
To compile this code as a module, choose M here: the
|
||||
|
@ -1002,7 +1002,7 @@ static unsigned long atalk_sum_skb(const struct sk_buff *skb, int offset,
|
||||
return sum;
|
||||
}
|
||||
|
||||
static unsigned short atalk_checksum(const struct sk_buff *skb, int len)
|
||||
static __be16 atalk_checksum(const struct sk_buff *skb, int len)
|
||||
{
|
||||
unsigned long sum;
|
||||
|
||||
@ -1010,7 +1010,7 @@ static unsigned short atalk_checksum(const struct sk_buff *skb, int len)
|
||||
sum = atalk_sum_skb(skb, 4, len-4, 0);
|
||||
|
||||
/* Use 0xFFFF for 0. 0 itself means none */
|
||||
return sum ? htons((unsigned short)sum) : 0xFFFF;
|
||||
return sum ? htons((unsigned short)sum) : htons(0xFFFF);
|
||||
}
|
||||
|
||||
static struct proto ddp_proto = {
|
||||
@ -1289,7 +1289,7 @@ static int handle_ip_over_ddp(struct sk_buff *skb)
|
||||
#endif
|
||||
|
||||
static void atalk_route_packet(struct sk_buff *skb, struct net_device *dev,
|
||||
struct ddpehdr *ddp, struct ddpebits *ddphv,
|
||||
struct ddpehdr *ddp, __u16 len_hops,
|
||||
int origlen)
|
||||
{
|
||||
struct atalk_route *rt;
|
||||
@ -1317,10 +1317,12 @@ static void atalk_route_packet(struct sk_buff *skb, struct net_device *dev,
|
||||
|
||||
/* Route the packet */
|
||||
rt = atrtr_find(&ta);
|
||||
if (!rt || ddphv->deh_hops == DDP_MAXHOPS)
|
||||
/* increment hops count */
|
||||
len_hops += 1 << 10;
|
||||
if (!rt || !(len_hops & (15 << 10)))
|
||||
goto free_it;
|
||||
|
||||
/* FIXME: use skb->cb to be able to use shared skbs */
|
||||
ddphv->deh_hops++;
|
||||
|
||||
/*
|
||||
* Route goes through another gateway, so set the target to the
|
||||
@ -1335,11 +1337,10 @@ static void atalk_route_packet(struct sk_buff *skb, struct net_device *dev,
|
||||
/* Fix up skb->len field */
|
||||
skb_trim(skb, min_t(unsigned int, origlen,
|
||||
(rt->dev->hard_header_len +
|
||||
ddp_dl->header_length + ddphv->deh_len)));
|
||||
ddp_dl->header_length + (len_hops & 1023))));
|
||||
|
||||
/* Mend the byte order */
|
||||
/* FIXME: use skb->cb to be able to use shared skbs */
|
||||
*((__u16 *)ddp) = ntohs(*((__u16 *)ddphv));
|
||||
ddp->deh_len_hops = htons(len_hops);
|
||||
|
||||
/*
|
||||
* Send the buffer onwards
|
||||
@ -1394,7 +1395,7 @@ static int atalk_rcv(struct sk_buff *skb, struct net_device *dev,
|
||||
struct atalk_iface *atif;
|
||||
struct sockaddr_at tosat;
|
||||
int origlen;
|
||||
struct ddpebits ddphv;
|
||||
__u16 len_hops;
|
||||
|
||||
/* Don't mangle buffer if shared */
|
||||
if (!(skb = skb_share_check(skb, GFP_ATOMIC)))
|
||||
@ -1406,16 +1407,11 @@ static int atalk_rcv(struct sk_buff *skb, struct net_device *dev,
|
||||
|
||||
ddp = ddp_hdr(skb);
|
||||
|
||||
/*
|
||||
* Fix up the length field [Ok this is horrible but otherwise
|
||||
* I end up with unions of bit fields and messy bit field order
|
||||
* compiler/endian dependencies..]
|
||||
*/
|
||||
*((__u16 *)&ddphv) = ntohs(*((__u16 *)ddp));
|
||||
len_hops = ntohs(ddp->deh_len_hops);
|
||||
|
||||
/* Trim buffer in case of stray trailing data */
|
||||
origlen = skb->len;
|
||||
skb_trim(skb, min_t(unsigned int, skb->len, ddphv.deh_len));
|
||||
skb_trim(skb, min_t(unsigned int, skb->len, len_hops & 1023));
|
||||
|
||||
/*
|
||||
* Size check to see if ddp->deh_len was crap
|
||||
@ -1430,7 +1426,7 @@ static int atalk_rcv(struct sk_buff *skb, struct net_device *dev,
|
||||
* valid for net byte orders all over the networking code...
|
||||
*/
|
||||
if (ddp->deh_sum &&
|
||||
atalk_checksum(skb, ddphv.deh_len) != ddp->deh_sum)
|
||||
atalk_checksum(skb, len_hops & 1023) != ddp->deh_sum)
|
||||
/* Not a valid AppleTalk frame - dustbin time */
|
||||
goto freeit;
|
||||
|
||||
@ -1444,7 +1440,7 @@ static int atalk_rcv(struct sk_buff *skb, struct net_device *dev,
|
||||
/* Not ours, so we route the packet via the correct
|
||||
* AppleTalk iface
|
||||
*/
|
||||
atalk_route_packet(skb, dev, ddp, &ddphv, origlen);
|
||||
atalk_route_packet(skb, dev, ddp, len_hops, origlen);
|
||||
goto out;
|
||||
}
|
||||
|
||||
@ -1489,7 +1485,7 @@ static int ltalk_rcv(struct sk_buff *skb, struct net_device *dev,
|
||||
/* Find our address */
|
||||
struct atalk_addr *ap = atalk_find_dev_addr(dev);
|
||||
|
||||
if (!ap || skb->len < sizeof(struct ddpshdr))
|
||||
if (!ap || skb->len < sizeof(__be16) || skb->len > 1023)
|
||||
goto freeit;
|
||||
|
||||
/* Don't mangle buffer if shared */
|
||||
@ -1519,11 +1515,8 @@ static int ltalk_rcv(struct sk_buff *skb, struct net_device *dev,
|
||||
/*
|
||||
* Not sure about this bit...
|
||||
*/
|
||||
ddp->deh_len = skb->len;
|
||||
ddp->deh_hops = DDP_MAXHOPS; /* Non routable, so force a drop
|
||||
if we slip up later */
|
||||
/* Mend the byte order */
|
||||
*((__u16 *)ddp) = htons(*((__u16 *)ddp));
|
||||
/* Non routable, so force a drop if we slip up later */
|
||||
ddp->deh_len_hops = htons(skb->len + (DDP_MAXHOPS << 10));
|
||||
}
|
||||
skb->h.raw = skb->data;
|
||||
|
||||
@ -1622,16 +1615,7 @@ static int atalk_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr
|
||||
SOCK_DEBUG(sk, "SK %p: Begin build.\n", sk);
|
||||
|
||||
ddp = (struct ddpehdr *)skb_put(skb, sizeof(struct ddpehdr));
|
||||
ddp->deh_pad = 0;
|
||||
ddp->deh_hops = 0;
|
||||
ddp->deh_len = len + sizeof(*ddp);
|
||||
/*
|
||||
* Fix up the length field [Ok this is horrible but otherwise
|
||||
* I end up with unions of bit fields and messy bit field order
|
||||
* compiler/endian dependencies..
|
||||
*/
|
||||
*((__u16 *)ddp) = ntohs(*((__u16 *)ddp));
|
||||
|
||||
ddp->deh_len_hops = htons(len + sizeof(*ddp));
|
||||
ddp->deh_dnet = usat->sat_addr.s_net;
|
||||
ddp->deh_snet = at->src_net;
|
||||
ddp->deh_dnode = usat->sat_addr.s_node;
|
||||
@ -1712,8 +1696,8 @@ static int atalk_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr
|
||||
struct sockaddr_at *sat = (struct sockaddr_at *)msg->msg_name;
|
||||
struct ddpehdr *ddp;
|
||||
int copied = 0;
|
||||
int offset = 0;
|
||||
int err = 0;
|
||||
struct ddpebits ddphv;
|
||||
struct sk_buff *skb = skb_recv_datagram(sk, flags & ~MSG_DONTWAIT,
|
||||
flags & MSG_DONTWAIT, &err);
|
||||
if (!skb)
|
||||
@ -1721,26 +1705,19 @@ static int atalk_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr
|
||||
|
||||
/* FIXME: use skb->cb to be able to use shared skbs */
|
||||
ddp = ddp_hdr(skb);
|
||||
*((__u16 *)&ddphv) = ntohs(*((__u16 *)ddp));
|
||||
copied = ntohs(ddp->deh_len_hops) & 1023;
|
||||
|
||||
if (sk->sk_type == SOCK_RAW) {
|
||||
copied = ddphv.deh_len;
|
||||
if (copied > size) {
|
||||
copied = size;
|
||||
msg->msg_flags |= MSG_TRUNC;
|
||||
}
|
||||
|
||||
err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
|
||||
} else {
|
||||
copied = ddphv.deh_len - sizeof(*ddp);
|
||||
if (copied > size) {
|
||||
copied = size;
|
||||
msg->msg_flags |= MSG_TRUNC;
|
||||
}
|
||||
err = skb_copy_datagram_iovec(skb, sizeof(*ddp),
|
||||
msg->msg_iov, copied);
|
||||
if (sk->sk_type != SOCK_RAW) {
|
||||
offset = sizeof(*ddp);
|
||||
copied -= offset;
|
||||
}
|
||||
|
||||
if (copied > size) {
|
||||
copied = size;
|
||||
msg->msg_flags |= MSG_TRUNC;
|
||||
}
|
||||
err = skb_copy_datagram_iovec(skb, offset, msg->msg_iov, copied);
|
||||
|
||||
if (!err) {
|
||||
if (sat) {
|
||||
sat->sat_family = AF_APPLETALK;
|
||||
|
@ -560,7 +560,6 @@ static int atm_mpoa_vcc_attach(struct atm_vcc *vcc, void __user *arg)
|
||||
struct atmmpc_ioc ioc_data;
|
||||
in_cache_entry *in_entry;
|
||||
uint32_t ipaddr;
|
||||
unsigned char *ip;
|
||||
|
||||
bytes_left = copy_from_user(&ioc_data, arg, sizeof(struct atmmpc_ioc));
|
||||
if (bytes_left != 0) {
|
||||
@ -583,9 +582,8 @@ static int atm_mpoa_vcc_attach(struct atm_vcc *vcc, void __user *arg)
|
||||
if (in_entry != NULL) mpc->in_ops->put(in_entry);
|
||||
return -EINVAL;
|
||||
}
|
||||
ip = (unsigned char*)&in_entry->ctrl_info.in_dst_ip;
|
||||
printk("mpoa: (%s) mpc_vcc_attach: attaching ingress SVC, entry = %u.%u.%u.%u\n",
|
||||
mpc->dev->name, ip[0], ip[1], ip[2], ip[3]);
|
||||
mpc->dev->name, NIPQUAD(in_entry->ctrl_info.in_dst_ip));
|
||||
in_entry->shortcut = vcc;
|
||||
mpc->in_ops->put(in_entry);
|
||||
} else {
|
||||
@ -616,10 +614,8 @@ static void mpc_vcc_close(struct atm_vcc *vcc, struct net_device *dev)
|
||||
dprintk("mpoa: (%s) mpc_vcc_close:\n", dev->name);
|
||||
in_entry = mpc->in_ops->get_by_vcc(vcc, mpc);
|
||||
if (in_entry) {
|
||||
unsigned char *ip __attribute__ ((unused)) =
|
||||
(unsigned char *)&in_entry->ctrl_info.in_dst_ip;
|
||||
dprintk("mpoa: (%s) mpc_vcc_close: ingress SVC closed ip = %u.%u.%u.%u\n",
|
||||
mpc->dev->name, ip[0], ip[1], ip[2], ip[3]);
|
||||
mpc->dev->name, NIPQUAD(in_entry->ctrl_info.in_dst_ip));
|
||||
in_entry->shortcut = NULL;
|
||||
mpc->in_ops->put(in_entry);
|
||||
}
|
||||
@ -1154,18 +1150,17 @@ static void ingress_purge_rcvd(struct k_message *msg, struct mpoa_client *mpc)
|
||||
{
|
||||
uint32_t dst_ip = msg->content.in_info.in_dst_ip;
|
||||
uint32_t mask = msg->ip_mask;
|
||||
unsigned char *ip = (unsigned char *)&dst_ip;
|
||||
in_cache_entry *entry = mpc->in_ops->get_with_mask(dst_ip, mpc, mask);
|
||||
|
||||
if(entry == NULL){
|
||||
printk("mpoa: (%s) ingress_purge_rcvd: purge for a non-existing entry, ", mpc->dev->name);
|
||||
printk("ip = %u.%u.%u.%u\n", ip[0], ip[1], ip[2], ip[3]);
|
||||
printk("ip = %u.%u.%u.%u\n", NIPQUAD(dst_ip));
|
||||
return;
|
||||
}
|
||||
|
||||
do {
|
||||
dprintk("mpoa: (%s) ingress_purge_rcvd: removing an ingress entry, ip = %u.%u.%u.%u\n" ,
|
||||
mpc->dev->name, ip[0], ip[1], ip[2], ip[3]);
|
||||
mpc->dev->name, NIPQUAD(dst_ip));
|
||||
write_lock_bh(&mpc->ingress_lock);
|
||||
mpc->in_ops->remove_entry(entry, mpc);
|
||||
write_unlock_bh(&mpc->ingress_lock);
|
||||
|
@ -87,7 +87,6 @@ static in_cache_entry *in_cache_get_by_vcc(struct atm_vcc *vcc,
|
||||
static in_cache_entry *in_cache_add_entry(uint32_t dst_ip,
|
||||
struct mpoa_client *client)
|
||||
{
|
||||
unsigned char *ip __attribute__ ((unused)) = (unsigned char *)&dst_ip;
|
||||
in_cache_entry* entry = kmalloc(sizeof(in_cache_entry), GFP_KERNEL);
|
||||
|
||||
if (entry == NULL) {
|
||||
@ -95,7 +94,7 @@ static in_cache_entry *in_cache_add_entry(uint32_t dst_ip,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
dprintk("mpoa: mpoa_caches.c: adding an ingress entry, ip = %u.%u.%u.%u\n", ip[0], ip[1], ip[2], ip[3]);
|
||||
dprintk("mpoa: mpoa_caches.c: adding an ingress entry, ip = %u.%u.%u.%u\n", NIPQUAD(dst_ip));
|
||||
memset(entry,0,sizeof(in_cache_entry));
|
||||
|
||||
atomic_set(&entry->use, 1);
|
||||
@ -152,10 +151,7 @@ static int cache_hit(in_cache_entry *entry, struct mpoa_client *mpc)
|
||||
|
||||
if( entry->count > mpc->parameters.mpc_p1 &&
|
||||
entry->entry_state == INGRESS_INVALID){
|
||||
unsigned char *ip __attribute__ ((unused)) =
|
||||
(unsigned char *)&entry->ctrl_info.in_dst_ip;
|
||||
|
||||
dprintk("mpoa: (%s) mpoa_caches.c: threshold exceeded for ip %u.%u.%u.%u, sending MPOA res req\n", mpc->dev->name, ip[0], ip[1], ip[2], ip[3]);
|
||||
dprintk("mpoa: (%s) mpoa_caches.c: threshold exceeded for ip %u.%u.%u.%u, sending MPOA res req\n", mpc->dev->name, NIPQUAD(entry->ctrl_info.in_dst_ip));
|
||||
entry->entry_state = INGRESS_RESOLVING;
|
||||
msg.type = SND_MPOA_RES_RQST;
|
||||
memcpy(msg.MPS_ctrl, mpc->mps_ctrl_addr, ATM_ESA_LEN );
|
||||
@ -187,11 +183,9 @@ static void in_cache_remove_entry(in_cache_entry *entry,
|
||||
{
|
||||
struct atm_vcc *vcc;
|
||||
struct k_message msg;
|
||||
unsigned char *ip;
|
||||
|
||||
vcc = entry->shortcut;
|
||||
ip = (unsigned char *)&entry->ctrl_info.in_dst_ip;
|
||||
dprintk("mpoa: mpoa_caches.c: removing an ingress entry, ip = %u.%u.%u.%u\n",ip[0], ip[1], ip[2], ip[3]);
|
||||
dprintk("mpoa: mpoa_caches.c: removing an ingress entry, ip = %u.%u.%u.%u\n",NIPQUAD(entry->ctrl_info.in_dst_ip));
|
||||
|
||||
if (entry->prev != NULL)
|
||||
entry->prev->next = entry->next;
|
||||
|
@ -276,7 +276,7 @@ int bt_sock_wait_state(struct sock *sk, int state, unsigned long timeo)
|
||||
set_current_state(TASK_INTERRUPTIBLE);
|
||||
|
||||
if (!timeo) {
|
||||
err = -EAGAIN;
|
||||
err = -EINPROGRESS;
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -51,6 +51,7 @@
|
||||
#include <asm/unaligned.h>
|
||||
|
||||
#include <net/bluetooth/bluetooth.h>
|
||||
#include <net/bluetooth/hci_core.h>
|
||||
#include <net/bluetooth/l2cap.h>
|
||||
|
||||
#include "bnep.h"
|
||||
@ -515,6 +516,26 @@ static int bnep_session(void *arg)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct device *bnep_get_device(struct bnep_session *session)
|
||||
{
|
||||
bdaddr_t *src = &bt_sk(session->sock->sk)->src;
|
||||
bdaddr_t *dst = &bt_sk(session->sock->sk)->dst;
|
||||
struct hci_dev *hdev;
|
||||
struct hci_conn *conn;
|
||||
|
||||
hdev = hci_get_route(dst, src);
|
||||
if (!hdev)
|
||||
return NULL;
|
||||
|
||||
conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, dst);
|
||||
if (!conn)
|
||||
return NULL;
|
||||
|
||||
hci_dev_put(hdev);
|
||||
|
||||
return &conn->dev;
|
||||
}
|
||||
|
||||
int bnep_add_connection(struct bnep_connadd_req *req, struct socket *sock)
|
||||
{
|
||||
struct net_device *dev;
|
||||
@ -534,7 +555,6 @@ int bnep_add_connection(struct bnep_connadd_req *req, struct socket *sock)
|
||||
if (!dev)
|
||||
return -ENOMEM;
|
||||
|
||||
|
||||
down_write(&bnep_session_sem);
|
||||
|
||||
ss = __bnep_get_session(dst);
|
||||
@ -551,7 +571,7 @@ int bnep_add_connection(struct bnep_connadd_req *req, struct socket *sock)
|
||||
memcpy(s->eh.h_source, &dst, ETH_ALEN);
|
||||
memcpy(dev->dev_addr, s->eh.h_dest, ETH_ALEN);
|
||||
|
||||
s->dev = dev;
|
||||
s->dev = dev;
|
||||
s->sock = sock;
|
||||
s->role = req->role;
|
||||
s->state = BT_CONNECTED;
|
||||
@ -568,6 +588,8 @@ int bnep_add_connection(struct bnep_connadd_req *req, struct socket *sock)
|
||||
bnep_set_default_proto_filter(s);
|
||||
#endif
|
||||
|
||||
SET_NETDEV_DEV(dev, bnep_get_device(s));
|
||||
|
||||
err = register_netdev(dev);
|
||||
if (err) {
|
||||
goto failed;
|
||||
|
@ -84,6 +84,20 @@ static void hci_acl_connect(struct hci_conn *conn)
|
||||
hci_send_cmd(hdev, OGF_LINK_CTL, OCF_CREATE_CONN, sizeof(cp), &cp);
|
||||
}
|
||||
|
||||
static void hci_acl_connect_cancel(struct hci_conn *conn)
|
||||
{
|
||||
struct hci_cp_create_conn_cancel cp;
|
||||
|
||||
BT_DBG("%p", conn);
|
||||
|
||||
if (conn->hdev->hci_ver < 2)
|
||||
return;
|
||||
|
||||
bacpy(&cp.bdaddr, &conn->dst);
|
||||
hci_send_cmd(conn->hdev, OGF_LINK_CTL,
|
||||
OCF_CREATE_CONN_CANCEL, sizeof(cp), &cp);
|
||||
}
|
||||
|
||||
void hci_acl_disconn(struct hci_conn *conn, __u8 reason)
|
||||
{
|
||||
struct hci_cp_disconnect cp;
|
||||
@ -94,7 +108,8 @@ void hci_acl_disconn(struct hci_conn *conn, __u8 reason)
|
||||
|
||||
cp.handle = __cpu_to_le16(conn->handle);
|
||||
cp.reason = reason;
|
||||
hci_send_cmd(conn->hdev, OGF_LINK_CTL, OCF_DISCONNECT, sizeof(cp), &cp);
|
||||
hci_send_cmd(conn->hdev, OGF_LINK_CTL,
|
||||
OCF_DISCONNECT, sizeof(cp), &cp);
|
||||
}
|
||||
|
||||
void hci_add_sco(struct hci_conn *conn, __u16 handle)
|
||||
@ -124,12 +139,20 @@ static void hci_conn_timeout(unsigned long arg)
|
||||
return;
|
||||
|
||||
hci_dev_lock(hdev);
|
||||
if (conn->state == BT_CONNECTED)
|
||||
|
||||
switch (conn->state) {
|
||||
case BT_CONNECT:
|
||||
hci_acl_connect_cancel(conn);
|
||||
break;
|
||||
case BT_CONNECTED:
|
||||
hci_acl_disconn(conn, 0x13);
|
||||
else
|
||||
break;
|
||||
default:
|
||||
conn->state = BT_CLOSED;
|
||||
break;
|
||||
}
|
||||
|
||||
hci_dev_unlock(hdev);
|
||||
return;
|
||||
}
|
||||
|
||||
static void hci_conn_idle(unsigned long arg)
|
||||
@ -179,6 +202,8 @@ struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type, bdaddr_t *dst)
|
||||
if (hdev->notify)
|
||||
hdev->notify(hdev, HCI_NOTIFY_CONN_ADD);
|
||||
|
||||
hci_conn_add_sysfs(conn);
|
||||
|
||||
tasklet_enable(&hdev->tx_task);
|
||||
|
||||
return conn;
|
||||
@ -211,6 +236,8 @@ int hci_conn_del(struct hci_conn *conn)
|
||||
|
||||
tasklet_disable(&hdev->tx_task);
|
||||
|
||||
hci_conn_del_sysfs(conn);
|
||||
|
||||
hci_conn_hash_del(hdev, conn);
|
||||
if (hdev->notify)
|
||||
hdev->notify(hdev, HCI_NOTIFY_CONN_DEL);
|
||||
@ -221,7 +248,9 @@ int hci_conn_del(struct hci_conn *conn)
|
||||
|
||||
hci_dev_put(hdev);
|
||||
|
||||
kfree(conn);
|
||||
/* will free via device release */
|
||||
put_device(&conn->dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -206,6 +206,9 @@ static void hci_init_req(struct hci_dev *hdev, unsigned long opt)
|
||||
/* Read Local Supported Features */
|
||||
hci_send_cmd(hdev, OGF_INFO_PARAM, OCF_READ_LOCAL_FEATURES, 0, NULL);
|
||||
|
||||
/* Read Local Version */
|
||||
hci_send_cmd(hdev, OGF_INFO_PARAM, OCF_READ_LOCAL_VERSION, 0, NULL);
|
||||
|
||||
/* Read Buffer Size (ACL mtu, max pkt, etc.) */
|
||||
hci_send_cmd(hdev, OGF_INFO_PARAM, OCF_READ_BUFFER_SIZE, 0, NULL);
|
||||
|
||||
|
@ -62,6 +62,7 @@ static void hci_cc_link_ctl(struct hci_dev *hdev, __u16 ocf, struct sk_buff *skb
|
||||
|
||||
switch (ocf) {
|
||||
case OCF_INQUIRY_CANCEL:
|
||||
case OCF_EXIT_PERIODIC_INQ:
|
||||
status = *((__u8 *) skb->data);
|
||||
|
||||
if (status) {
|
||||
@ -297,6 +298,7 @@ static void hci_cc_host_ctl(struct hci_dev *hdev, __u16 ocf, struct sk_buff *skb
|
||||
/* Command Complete OGF INFO_PARAM */
|
||||
static void hci_cc_info_param(struct hci_dev *hdev, __u16 ocf, struct sk_buff *skb)
|
||||
{
|
||||
struct hci_rp_read_loc_version *lv;
|
||||
struct hci_rp_read_local_features *lf;
|
||||
struct hci_rp_read_buffer_size *bs;
|
||||
struct hci_rp_read_bd_addr *ba;
|
||||
@ -304,6 +306,23 @@ static void hci_cc_info_param(struct hci_dev *hdev, __u16 ocf, struct sk_buff *s
|
||||
BT_DBG("%s ocf 0x%x", hdev->name, ocf);
|
||||
|
||||
switch (ocf) {
|
||||
case OCF_READ_LOCAL_VERSION:
|
||||
lv = (struct hci_rp_read_loc_version *) skb->data;
|
||||
|
||||
if (lv->status) {
|
||||
BT_DBG("%s READ_LOCAL_VERSION failed %d", hdev->name, lf->status);
|
||||
break;
|
||||
}
|
||||
|
||||
hdev->hci_ver = lv->hci_ver;
|
||||
hdev->hci_rev = btohs(lv->hci_rev);
|
||||
hdev->manufacturer = btohs(lv->manufacturer);
|
||||
|
||||
BT_DBG("%s: manufacturer %d hci_ver %d hci_rev %d", hdev->name,
|
||||
hdev->manufacturer, hdev->hci_ver, hdev->hci_rev);
|
||||
|
||||
break;
|
||||
|
||||
case OCF_READ_LOCAL_FEATURES:
|
||||
lf = (struct hci_rp_read_local_features *) skb->data;
|
||||
|
||||
@ -328,7 +347,8 @@ static void hci_cc_info_param(struct hci_dev *hdev, __u16 ocf, struct sk_buff *s
|
||||
if (hdev->features[1] & LMP_HV3)
|
||||
hdev->pkt_type |= (HCI_HV3);
|
||||
|
||||
BT_DBG("%s: features 0x%x 0x%x 0x%x", hdev->name, lf->features[0], lf->features[1], lf->features[2]);
|
||||
BT_DBG("%s: features 0x%x 0x%x 0x%x", hdev->name,
|
||||
lf->features[0], lf->features[1], lf->features[2]);
|
||||
|
||||
break;
|
||||
|
||||
@ -757,6 +777,10 @@ static inline void hci_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *s
|
||||
|
||||
hci_send_cmd(hdev, OGF_LINK_CTL,
|
||||
OCF_CHANGE_CONN_PTYPE, sizeof(cp), &cp);
|
||||
} else {
|
||||
/* Update disconnect timer */
|
||||
hci_conn_hold(conn);
|
||||
hci_conn_put(conn);
|
||||
}
|
||||
} else
|
||||
conn->state = BT_CLOSED;
|
||||
|
@ -13,16 +13,32 @@
|
||||
#define BT_DBG(D...)
|
||||
#endif
|
||||
|
||||
static ssize_t show_name(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
static inline char *typetostr(int type)
|
||||
{
|
||||
struct hci_dev *hdev = dev_get_drvdata(dev);
|
||||
return sprintf(buf, "%s\n", hdev->name);
|
||||
switch (type) {
|
||||
case HCI_VIRTUAL:
|
||||
return "VIRTUAL";
|
||||
case HCI_USB:
|
||||
return "USB";
|
||||
case HCI_PCCARD:
|
||||
return "PCCARD";
|
||||
case HCI_UART:
|
||||
return "UART";
|
||||
case HCI_RS232:
|
||||
return "RS232";
|
||||
case HCI_PCI:
|
||||
return "PCI";
|
||||
case HCI_SDIO:
|
||||
return "SDIO";
|
||||
default:
|
||||
return "UNKNOWN";
|
||||
}
|
||||
}
|
||||
|
||||
static ssize_t show_type(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct hci_dev *hdev = dev_get_drvdata(dev);
|
||||
return sprintf(buf, "%d\n", hdev->type);
|
||||
return sprintf(buf, "%s\n", typetostr(hdev->type));
|
||||
}
|
||||
|
||||
static ssize_t show_address(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
@ -33,10 +49,22 @@ static ssize_t show_address(struct device *dev, struct device_attribute *attr, c
|
||||
return sprintf(buf, "%s\n", batostr(&bdaddr));
|
||||
}
|
||||
|
||||
static ssize_t show_flags(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
static ssize_t show_manufacturer(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct hci_dev *hdev = dev_get_drvdata(dev);
|
||||
return sprintf(buf, "0x%lx\n", hdev->flags);
|
||||
return sprintf(buf, "%d\n", hdev->manufacturer);
|
||||
}
|
||||
|
||||
static ssize_t show_hci_version(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct hci_dev *hdev = dev_get_drvdata(dev);
|
||||
return sprintf(buf, "%d\n", hdev->hci_ver);
|
||||
}
|
||||
|
||||
static ssize_t show_hci_revision(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct hci_dev *hdev = dev_get_drvdata(dev);
|
||||
return sprintf(buf, "%d\n", hdev->hci_rev);
|
||||
}
|
||||
|
||||
static ssize_t show_inquiry_cache(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
@ -141,10 +169,11 @@ static ssize_t store_sniff_min_interval(struct device *dev, struct device_attrib
|
||||
return count;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
|
||||
static DEVICE_ATTR(type, S_IRUGO, show_type, NULL);
|
||||
static DEVICE_ATTR(address, S_IRUGO, show_address, NULL);
|
||||
static DEVICE_ATTR(flags, S_IRUGO, show_flags, NULL);
|
||||
static DEVICE_ATTR(manufacturer, S_IRUGO, show_manufacturer, NULL);
|
||||
static DEVICE_ATTR(hci_version, S_IRUGO, show_hci_version, NULL);
|
||||
static DEVICE_ATTR(hci_revision, S_IRUGO, show_hci_revision, NULL);
|
||||
static DEVICE_ATTR(inquiry_cache, S_IRUGO, show_inquiry_cache, NULL);
|
||||
|
||||
static DEVICE_ATTR(idle_timeout, S_IRUGO | S_IWUSR,
|
||||
@ -155,10 +184,11 @@ static DEVICE_ATTR(sniff_min_interval, S_IRUGO | S_IWUSR,
|
||||
show_sniff_min_interval, store_sniff_min_interval);
|
||||
|
||||
static struct device_attribute *bt_attrs[] = {
|
||||
&dev_attr_name,
|
||||
&dev_attr_type,
|
||||
&dev_attr_address,
|
||||
&dev_attr_flags,
|
||||
&dev_attr_manufacturer,
|
||||
&dev_attr_hci_version,
|
||||
&dev_attr_hci_revision,
|
||||
&dev_attr_inquiry_cache,
|
||||
&dev_attr_idle_timeout,
|
||||
&dev_attr_sniff_max_interval,
|
||||
@ -166,6 +196,32 @@ static struct device_attribute *bt_attrs[] = {
|
||||
NULL
|
||||
};
|
||||
|
||||
static ssize_t show_conn_type(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct hci_conn *conn = dev_get_drvdata(dev);
|
||||
return sprintf(buf, "%s\n", conn->type == ACL_LINK ? "ACL" : "SCO");
|
||||
}
|
||||
|
||||
static ssize_t show_conn_address(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct hci_conn *conn = dev_get_drvdata(dev);
|
||||
bdaddr_t bdaddr;
|
||||
baswap(&bdaddr, &conn->dst);
|
||||
return sprintf(buf, "%s\n", batostr(&bdaddr));
|
||||
}
|
||||
|
||||
#define CONN_ATTR(_name,_mode,_show,_store) \
|
||||
struct device_attribute conn_attr_##_name = __ATTR(_name,_mode,_show,_store)
|
||||
|
||||
static CONN_ATTR(type, S_IRUGO, show_conn_type, NULL);
|
||||
static CONN_ATTR(address, S_IRUGO, show_conn_address, NULL);
|
||||
|
||||
static struct device_attribute *conn_attrs[] = {
|
||||
&conn_attr_type,
|
||||
&conn_attr_address,
|
||||
NULL
|
||||
};
|
||||
|
||||
struct class *bt_class = NULL;
|
||||
EXPORT_SYMBOL_GPL(bt_class);
|
||||
|
||||
@ -177,8 +233,57 @@ static struct platform_device *bt_platform;
|
||||
|
||||
static void bt_release(struct device *dev)
|
||||
{
|
||||
struct hci_dev *hdev = dev_get_drvdata(dev);
|
||||
kfree(hdev);
|
||||
void *data = dev_get_drvdata(dev);
|
||||
kfree(data);
|
||||
}
|
||||
|
||||
static void add_conn(void *data)
|
||||
{
|
||||
struct hci_conn *conn = data;
|
||||
int i;
|
||||
|
||||
device_register(&conn->dev);
|
||||
|
||||
for (i = 0; conn_attrs[i]; i++)
|
||||
device_create_file(&conn->dev, conn_attrs[i]);
|
||||
}
|
||||
|
||||
void hci_conn_add_sysfs(struct hci_conn *conn)
|
||||
{
|
||||
struct hci_dev *hdev = conn->hdev;
|
||||
bdaddr_t *ba = &conn->dst;
|
||||
|
||||
BT_DBG("conn %p", conn);
|
||||
|
||||
conn->dev.parent = &hdev->dev;
|
||||
conn->dev.release = bt_release;
|
||||
|
||||
snprintf(conn->dev.bus_id, BUS_ID_SIZE,
|
||||
"%s%2.2X%2.2X%2.2X%2.2X%2.2X%2.2X",
|
||||
conn->type == ACL_LINK ? "acl" : "sco",
|
||||
ba->b[5], ba->b[4], ba->b[3],
|
||||
ba->b[2], ba->b[1], ba->b[0]);
|
||||
|
||||
dev_set_drvdata(&conn->dev, conn);
|
||||
|
||||
INIT_WORK(&conn->work, add_conn, (void *) conn);
|
||||
|
||||
schedule_work(&conn->work);
|
||||
}
|
||||
|
||||
static void del_conn(void *data)
|
||||
{
|
||||
struct hci_conn *conn = data;
|
||||
device_del(&conn->dev);
|
||||
}
|
||||
|
||||
void hci_conn_del_sysfs(struct hci_conn *conn)
|
||||
{
|
||||
BT_DBG("conn %p", conn);
|
||||
|
||||
INIT_WORK(&conn->work, del_conn, (void *) conn);
|
||||
|
||||
schedule_work(&conn->work);
|
||||
}
|
||||
|
||||
int hci_register_sysfs(struct hci_dev *hdev)
|
||||
@ -214,11 +319,9 @@ int hci_register_sysfs(struct hci_dev *hdev)
|
||||
|
||||
void hci_unregister_sysfs(struct hci_dev *hdev)
|
||||
{
|
||||
struct device *dev = &hdev->dev;
|
||||
|
||||
BT_DBG("%p name %s type %d", hdev, hdev->name, hdev->type);
|
||||
|
||||
device_del(dev);
|
||||
device_del(&hdev->dev);
|
||||
}
|
||||
|
||||
int __init bt_sysfs_init(void)
|
||||
@ -245,7 +348,7 @@ int __init bt_sysfs_init(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
void __exit bt_sysfs_cleanup(void)
|
||||
void bt_sysfs_cleanup(void)
|
||||
{
|
||||
class_destroy(bt_class);
|
||||
|
||||
|
@ -40,6 +40,7 @@
|
||||
#include <linux/input.h>
|
||||
|
||||
#include <net/bluetooth/bluetooth.h>
|
||||
#include <net/bluetooth/hci_core.h>
|
||||
#include <net/bluetooth/l2cap.h>
|
||||
|
||||
#include "hidp.h"
|
||||
@ -528,6 +529,26 @@ static int hidp_session(void *arg)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct device *hidp_get_device(struct hidp_session *session)
|
||||
{
|
||||
bdaddr_t *src = &bt_sk(session->ctrl_sock->sk)->src;
|
||||
bdaddr_t *dst = &bt_sk(session->ctrl_sock->sk)->dst;
|
||||
struct hci_dev *hdev;
|
||||
struct hci_conn *conn;
|
||||
|
||||
hdev = hci_get_route(dst, src);
|
||||
if (!hdev)
|
||||
return NULL;
|
||||
|
||||
conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, dst);
|
||||
if (!conn)
|
||||
return NULL;
|
||||
|
||||
hci_dev_put(hdev);
|
||||
|
||||
return &conn->dev;
|
||||
}
|
||||
|
||||
static inline void hidp_setup_input(struct hidp_session *session, struct hidp_connadd_req *req)
|
||||
{
|
||||
struct input_dev *input = session->input;
|
||||
@ -566,6 +587,8 @@ static inline void hidp_setup_input(struct hidp_session *session, struct hidp_co
|
||||
input->relbit[0] |= BIT(REL_WHEEL);
|
||||
}
|
||||
|
||||
input->cdev.dev = hidp_get_device(session);
|
||||
|
||||
input->event = hidp_input_event;
|
||||
|
||||
input_register_device(input);
|
||||
|
@ -644,7 +644,7 @@ static struct rfcomm_session *rfcomm_session_create(bdaddr_t *src, bdaddr_t *dst
|
||||
addr.l2_family = AF_BLUETOOTH;
|
||||
addr.l2_psm = htobs(RFCOMM_PSM);
|
||||
*err = sock->ops->connect(sock, (struct sockaddr *) &addr, sizeof(addr), O_NONBLOCK);
|
||||
if (*err == 0 || *err == -EAGAIN)
|
||||
if (*err == 0 || *err == -EINPROGRESS)
|
||||
return s;
|
||||
|
||||
rfcomm_session_del(s);
|
||||
|
@ -38,6 +38,7 @@
|
||||
#include <linux/skbuff.h>
|
||||
|
||||
#include <net/bluetooth/bluetooth.h>
|
||||
#include <net/bluetooth/hci_core.h>
|
||||
#include <net/bluetooth/rfcomm.h>
|
||||
|
||||
#ifndef CONFIG_BT_RFCOMM_DEBUG
|
||||
@ -161,6 +162,24 @@ static inline struct rfcomm_dev *rfcomm_dev_get(int id)
|
||||
return dev;
|
||||
}
|
||||
|
||||
static struct device *rfcomm_get_device(struct rfcomm_dev *dev)
|
||||
{
|
||||
struct hci_dev *hdev;
|
||||
struct hci_conn *conn;
|
||||
|
||||
hdev = hci_get_route(&dev->dst, &dev->src);
|
||||
if (!hdev)
|
||||
return NULL;
|
||||
|
||||
conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &dev->dst);
|
||||
if (!conn)
|
||||
return NULL;
|
||||
|
||||
hci_dev_put(hdev);
|
||||
|
||||
return &conn->dev;
|
||||
}
|
||||
|
||||
static int rfcomm_dev_add(struct rfcomm_dev_req *req, struct rfcomm_dlc *dlc)
|
||||
{
|
||||
struct rfcomm_dev *dev;
|
||||
@ -244,7 +263,7 @@ static int rfcomm_dev_add(struct rfcomm_dev_req *req, struct rfcomm_dlc *dlc)
|
||||
return err;
|
||||
}
|
||||
|
||||
tty_register_device(rfcomm_tty_driver, dev->id, NULL);
|
||||
tty_register_device(rfcomm_tty_driver, dev->id, rfcomm_get_device(dev));
|
||||
|
||||
return dev->id;
|
||||
}
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user