Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 246978
b: refs/heads/master
c: 345578d
h: refs/heads/master
v: v3
  • Loading branch information
David S. Miller committed Apr 25, 2011
1 parent 7958584 commit 214c300
Show file tree
Hide file tree
Showing 31 changed files with 74 additions and 289 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: cfef6047c4027a8448ec8dafeaf2bb362cc882e4
refs/heads/master: 345578d97c549995ddbcc178f16f710602cc06bb
53 changes: 28 additions & 25 deletions trunk/drivers/net/benet/be_cmds.c
Original file line number Diff line number Diff line change
Expand Up @@ -1214,8 +1214,8 @@ int be_cmd_get_reg_len(struct be_adapter *adapter, u32 *log_size)
if (!status) {
struct be_cmd_resp_get_fat *resp = embedded_payload(wrb);
if (log_size && resp->log_size)
*log_size = le32_to_cpu(resp->log_size -
sizeof(u32));
*log_size = le32_to_cpu(resp->log_size) -
sizeof(u32);
}
err:
spin_unlock_bh(&adapter->mcc_lock);
Expand All @@ -1228,45 +1228,48 @@ void be_cmd_get_regs(struct be_adapter *adapter, u32 buf_len, void *buf)
struct be_mcc_wrb *wrb;
struct be_cmd_req_get_fat *req;
struct be_sge *sge;
u32 offset = 0, total_size, buf_size, log_offset = sizeof(u32);
u32 offset = 0, total_size, buf_size,
log_offset = sizeof(u32), payload_len;
int status;

if (buf_len == 0)
return;

total_size = buf_len;

get_fat_cmd.size = sizeof(struct be_cmd_req_get_fat) + 60*1024;
get_fat_cmd.va = pci_alloc_consistent(adapter->pdev,
get_fat_cmd.size,
&get_fat_cmd.dma);
if (!get_fat_cmd.va) {
status = -ENOMEM;
dev_err(&adapter->pdev->dev,
"Memory allocation failure while retrieving FAT data\n");
return;
}

spin_lock_bh(&adapter->mcc_lock);

wrb = wrb_from_mccq(adapter);
if (!wrb) {
status = -EBUSY;
goto err;
}
while (total_size) {
buf_size = min(total_size, (u32)60*1024);
total_size -= buf_size;

get_fat_cmd.size = sizeof(struct be_cmd_req_get_fat) + buf_size;
get_fat_cmd.va = pci_alloc_consistent(adapter->pdev,
get_fat_cmd.size,
&get_fat_cmd.dma);
if (!get_fat_cmd.va) {
status = -ENOMEM;
dev_err(&adapter->pdev->dev,
"Memory allocation failure while retrieving FAT data\n");
wrb = wrb_from_mccq(adapter);
if (!wrb) {
status = -EBUSY;
goto err;
}
req = get_fat_cmd.va;
sge = nonembedded_sgl(wrb);

be_wrb_hdr_prepare(wrb, get_fat_cmd.size, false, 1,
payload_len = sizeof(struct be_cmd_req_get_fat) + buf_size;
be_wrb_hdr_prepare(wrb, payload_len, false, 1,
OPCODE_COMMON_MANAGE_FAT);

be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
OPCODE_COMMON_MANAGE_FAT, get_fat_cmd.size);
OPCODE_COMMON_MANAGE_FAT, payload_len);

sge->pa_hi = cpu_to_le32(upper_32_bits(get_fat_cmd.size));
sge->pa_hi = cpu_to_le32(upper_32_bits(get_fat_cmd.dma));
sge->pa_lo = cpu_to_le32(get_fat_cmd.dma & 0xFFFFFFFF);
sge->len = cpu_to_le32(get_fat_cmd.size);

Expand All @@ -1281,17 +1284,17 @@ void be_cmd_get_regs(struct be_adapter *adapter, u32 buf_len, void *buf)
memcpy(buf + offset,
resp->data_buffer,
resp->read_log_length);
}
pci_free_consistent(adapter->pdev, get_fat_cmd.size,
get_fat_cmd.va,
get_fat_cmd.dma);
if (status)
} else {
dev_err(&adapter->pdev->dev, "FAT Table Retrieve error\n");

goto err;
}
offset += buf_size;
log_offset += buf_size;
}
err:
pci_free_consistent(adapter->pdev, get_fat_cmd.size,
get_fat_cmd.va,
get_fat_cmd.dma);
spin_unlock_bh(&adapter->mcc_lock);
}

Expand Down
29 changes: 5 additions & 24 deletions trunk/drivers/net/bonding/bond_3ad.c
Original file line number Diff line number Diff line change
Expand Up @@ -2465,35 +2465,16 @@ int bond_3ad_xmit_xor(struct sk_buff *skb, struct net_device *dev)
return NETDEV_TX_OK;
}

int bond_3ad_lacpdu_recv(struct sk_buff *skb, struct net_device *dev, struct packet_type* ptype, struct net_device *orig_dev)
void bond_3ad_lacpdu_recv(struct sk_buff *skb, struct bonding *bond,
struct slave *slave)
{
struct bonding *bond = netdev_priv(dev);
struct slave *slave = NULL;
int ret = NET_RX_DROP;

if (!(dev->flags & IFF_MASTER))
goto out;

skb = skb_share_check(skb, GFP_ATOMIC);
if (!skb)
goto out;
if (skb->protocol != PKT_TYPE_LACPDU)
return;

if (!pskb_may_pull(skb, sizeof(struct lacpdu)))
goto out;
return;

read_lock(&bond->lock);
slave = bond_get_slave_by_dev(netdev_priv(dev), orig_dev);
if (!slave)
goto out_unlock;

bond_3ad_rx_indication((struct lacpdu *) skb->data, slave, skb->len);

ret = NET_RX_SUCCESS;

out_unlock:
read_unlock(&bond->lock);
out:
dev_kfree_skb(skb);

return ret;
}
4 changes: 2 additions & 2 deletions trunk/drivers/net/bonding/bond_3ad.h
Original file line number Diff line number Diff line change
Expand Up @@ -258,7 +258,6 @@ struct ad_bond_info {
* requested
*/
struct timer_list ad_timer;
struct packet_type ad_pkt_type;
};

struct ad_slave_info {
Expand All @@ -280,7 +279,8 @@ void bond_3ad_adapter_duplex_changed(struct slave *slave);
void bond_3ad_handle_link_change(struct slave *slave, char link);
int bond_3ad_get_active_agg_info(struct bonding *bond, struct ad_info *ad_info);
int bond_3ad_xmit_xor(struct sk_buff *skb, struct net_device *dev);
int bond_3ad_lacpdu_recv(struct sk_buff *skb, struct net_device *dev, struct packet_type* ptype, struct net_device *orig_dev);
void bond_3ad_lacpdu_recv(struct sk_buff *skb, struct bonding *bond,
struct slave *slave);
int bond_3ad_set_carrier(struct bonding *bond);
#endif //__BOND_3AD_H__

46 changes: 11 additions & 35 deletions trunk/drivers/net/bonding/bond_alb.c
Original file line number Diff line number Diff line change
Expand Up @@ -308,49 +308,33 @@ static void rlb_update_entry_from_arp(struct bonding *bond, struct arp_pkt *arp)
_unlock_rx_hashtbl(bond);
}

static int rlb_arp_recv(struct sk_buff *skb, struct net_device *bond_dev, struct packet_type *ptype, struct net_device *orig_dev)
static void rlb_arp_recv(struct sk_buff *skb, struct bonding *bond,
struct slave *slave)
{
struct bonding *bond;
struct arp_pkt *arp = (struct arp_pkt *)skb->data;
int res = NET_RX_DROP;
struct arp_pkt *arp;

while (bond_dev->priv_flags & IFF_802_1Q_VLAN)
bond_dev = vlan_dev_real_dev(bond_dev);

if (!(bond_dev->priv_flags & IFF_BONDING) ||
!(bond_dev->flags & IFF_MASTER))
goto out;
if (skb->protocol != cpu_to_be16(ETH_P_ARP))
return;

arp = (struct arp_pkt *) skb->data;
if (!arp) {
pr_debug("Packet has no ARP data\n");
goto out;
return;
}

skb = skb_share_check(skb, GFP_ATOMIC);
if (!skb)
goto out;

if (!pskb_may_pull(skb, arp_hdr_len(bond_dev)))
goto out;
if (!pskb_may_pull(skb, arp_hdr_len(bond->dev)))
return;

if (skb->len < sizeof(struct arp_pkt)) {
pr_debug("Packet is too small to be an ARP\n");
goto out;
return;
}

if (arp->op_code == htons(ARPOP_REPLY)) {
/* update rx hash table for this ARP */
bond = netdev_priv(bond_dev);
rlb_update_entry_from_arp(bond, arp);
pr_debug("Server received an ARP Reply from client\n");
}

res = NET_RX_SUCCESS;

out:
dev_kfree_skb(skb);

return res;
}

/* Caller must hold bond lock for read */
Expand Down Expand Up @@ -759,7 +743,6 @@ static void rlb_init_table_entry(struct rlb_client_info *entry)
static int rlb_initialize(struct bonding *bond)
{
struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond));
struct packet_type *pk_type = &(BOND_ALB_INFO(bond).rlb_pkt_type);
struct rlb_client_info *new_hashtbl;
int size = RLB_HASH_TABLE_SIZE * sizeof(struct rlb_client_info);
int i;
Expand All @@ -784,13 +767,8 @@ static int rlb_initialize(struct bonding *bond)

_unlock_rx_hashtbl(bond);

/*initialize packet type*/
pk_type->type = cpu_to_be16(ETH_P_ARP);
pk_type->dev = bond->dev;
pk_type->func = rlb_arp_recv;

/* register to receive ARPs */
dev_add_pack(pk_type);
bond->recv_probe = rlb_arp_recv;

return 0;
}
Expand All @@ -799,8 +777,6 @@ static void rlb_deinitialize(struct bonding *bond)
{
struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond));

dev_remove_pack(&(bond_info->rlb_pkt_type));

_lock_rx_hashtbl(bond);

kfree(bond_info->rx_hashtbl);
Expand Down
1 change: 0 additions & 1 deletion trunk/drivers/net/bonding/bond_alb.h
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,6 @@ struct alb_bond_info {
int lp_counter;
/* -------- rlb parameters -------- */
int rlb_enabled;
struct packet_type rlb_pkt_type;
struct rlb_client_info *rx_hashtbl; /* Receive hash table */
spinlock_t rx_hashtbl_lock;
u32 rx_hashtbl_head;
Expand Down
Loading

0 comments on commit 214c300

Please sign in to comment.