Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6

* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6: (66 commits)
  be2net: fix some cmds to use mccq instead of mbox
  atl1e: fix 2.6.31-git4 -- ATL1E 0000:03:00.0: DMA-API: device driver frees DMA
  pkt_sched: Fix qstats.qlen updating in dump_stats
  ipv6: Log the affected address when DAD failure occurs
  wl12xx: Fix print_mac() conversion.
  af_iucv: fix race when queueing skbs on the backlog queue
  af_iucv: do not call iucv_sock_kill() twice
  af_iucv: handle non-accepted sockets after resuming from suspend
  af_iucv: fix race in __iucv_sock_wait()
  iucv: use correct output register in iucv_query_maxconn()
  iucv: fix iucv_buffer_cpumask check when calling IUCV functions
  iucv: suspend/resume error msg for left over pathes
  wl12xx: switch to %pM to print the mac address
  b44: the poll handler b44_poll must not enable IRQ unconditionally
  ipv6: Ignore route option with ROUTER_PREF_INVALID
  bonding: make ab_arp select active slaves as other modes
  cfg80211: fix SME connect
  rc80211_minstrel: fix contention window calculation
  ssb/sdio: fix printk format warnings
  p54usb: add Zcomax XG-705A usbid
  ...
This commit is contained in:
Linus Torvalds 2009-09-17 20:53:52 -07:00
commit f205ce83a7
132 changed files with 2012 additions and 808 deletions

View file

@ -377,10 +377,19 @@ struct atl1e_hw {
*/ */
struct atl1e_tx_buffer { struct atl1e_tx_buffer {
struct sk_buff *skb; struct sk_buff *skb;
u16 flags;
#define ATL1E_TX_PCIMAP_SINGLE 0x0001
#define ATL1E_TX_PCIMAP_PAGE 0x0002
#define ATL1E_TX_PCIMAP_TYPE_MASK 0x0003
u16 length; u16 length;
dma_addr_t dma; dma_addr_t dma;
}; };
#define ATL1E_SET_PCIMAP_TYPE(tx_buff, type) do { \
((tx_buff)->flags) &= ~ATL1E_TX_PCIMAP_TYPE_MASK; \
((tx_buff)->flags) |= (type); \
} while (0)
struct atl1e_rx_page { struct atl1e_rx_page {
dma_addr_t dma; /* receive rage DMA address */ dma_addr_t dma; /* receive rage DMA address */
u8 *addr; /* receive rage virtual address */ u8 *addr; /* receive rage virtual address */

View file

@ -635,7 +635,11 @@ static void atl1e_clean_tx_ring(struct atl1e_adapter *adapter)
for (index = 0; index < ring_count; index++) { for (index = 0; index < ring_count; index++) {
tx_buffer = &tx_ring->tx_buffer[index]; tx_buffer = &tx_ring->tx_buffer[index];
if (tx_buffer->dma) { if (tx_buffer->dma) {
pci_unmap_page(pdev, tx_buffer->dma, if (tx_buffer->flags & ATL1E_TX_PCIMAP_SINGLE)
pci_unmap_single(pdev, tx_buffer->dma,
tx_buffer->length, PCI_DMA_TODEVICE);
else if (tx_buffer->flags & ATL1E_TX_PCIMAP_PAGE)
pci_unmap_page(pdev, tx_buffer->dma,
tx_buffer->length, PCI_DMA_TODEVICE); tx_buffer->length, PCI_DMA_TODEVICE);
tx_buffer->dma = 0; tx_buffer->dma = 0;
} }
@ -1220,7 +1224,11 @@ static bool atl1e_clean_tx_irq(struct atl1e_adapter *adapter)
while (next_to_clean != hw_next_to_clean) { while (next_to_clean != hw_next_to_clean) {
tx_buffer = &tx_ring->tx_buffer[next_to_clean]; tx_buffer = &tx_ring->tx_buffer[next_to_clean];
if (tx_buffer->dma) { if (tx_buffer->dma) {
pci_unmap_page(adapter->pdev, tx_buffer->dma, if (tx_buffer->flags & ATL1E_TX_PCIMAP_SINGLE)
pci_unmap_single(adapter->pdev, tx_buffer->dma,
tx_buffer->length, PCI_DMA_TODEVICE);
else if (tx_buffer->flags & ATL1E_TX_PCIMAP_PAGE)
pci_unmap_page(adapter->pdev, tx_buffer->dma,
tx_buffer->length, PCI_DMA_TODEVICE); tx_buffer->length, PCI_DMA_TODEVICE);
tx_buffer->dma = 0; tx_buffer->dma = 0;
} }
@ -1741,6 +1749,7 @@ static void atl1e_tx_map(struct atl1e_adapter *adapter,
tx_buffer->length = map_len; tx_buffer->length = map_len;
tx_buffer->dma = pci_map_single(adapter->pdev, tx_buffer->dma = pci_map_single(adapter->pdev,
skb->data, hdr_len, PCI_DMA_TODEVICE); skb->data, hdr_len, PCI_DMA_TODEVICE);
ATL1E_SET_PCIMAP_TYPE(tx_buffer, ATL1E_TX_PCIMAP_SINGLE);
mapped_len += map_len; mapped_len += map_len;
use_tpd->buffer_addr = cpu_to_le64(tx_buffer->dma); use_tpd->buffer_addr = cpu_to_le64(tx_buffer->dma);
use_tpd->word2 = (use_tpd->word2 & (~TPD_BUFLEN_MASK)) | use_tpd->word2 = (use_tpd->word2 & (~TPD_BUFLEN_MASK)) |
@ -1766,6 +1775,7 @@ static void atl1e_tx_map(struct atl1e_adapter *adapter,
tx_buffer->dma = tx_buffer->dma =
pci_map_single(adapter->pdev, skb->data + mapped_len, pci_map_single(adapter->pdev, skb->data + mapped_len,
map_len, PCI_DMA_TODEVICE); map_len, PCI_DMA_TODEVICE);
ATL1E_SET_PCIMAP_TYPE(tx_buffer, ATL1E_TX_PCIMAP_SINGLE);
mapped_len += map_len; mapped_len += map_len;
use_tpd->buffer_addr = cpu_to_le64(tx_buffer->dma); use_tpd->buffer_addr = cpu_to_le64(tx_buffer->dma);
use_tpd->word2 = (use_tpd->word2 & (~TPD_BUFLEN_MASK)) | use_tpd->word2 = (use_tpd->word2 & (~TPD_BUFLEN_MASK)) |
@ -1801,6 +1811,7 @@ static void atl1e_tx_map(struct atl1e_adapter *adapter,
(i * MAX_TX_BUF_LEN), (i * MAX_TX_BUF_LEN),
tx_buffer->length, tx_buffer->length,
PCI_DMA_TODEVICE); PCI_DMA_TODEVICE);
ATL1E_SET_PCIMAP_TYPE(tx_buffer, ATL1E_TX_PCIMAP_PAGE);
use_tpd->buffer_addr = cpu_to_le64(tx_buffer->dma); use_tpd->buffer_addr = cpu_to_le64(tx_buffer->dma);
use_tpd->word2 = (use_tpd->word2 & (~TPD_BUFLEN_MASK)) | use_tpd->word2 = (use_tpd->word2 & (~TPD_BUFLEN_MASK)) |
((cpu_to_le32(tx_buffer->length) & ((cpu_to_le32(tx_buffer->length) &

View file

@ -847,23 +847,22 @@ static int b44_poll(struct napi_struct *napi, int budget)
{ {
struct b44 *bp = container_of(napi, struct b44, napi); struct b44 *bp = container_of(napi, struct b44, napi);
int work_done; int work_done;
unsigned long flags;
spin_lock_irq(&bp->lock); spin_lock_irqsave(&bp->lock, flags);
if (bp->istat & (ISTAT_TX | ISTAT_TO)) { if (bp->istat & (ISTAT_TX | ISTAT_TO)) {
/* spin_lock(&bp->tx_lock); */ /* spin_lock(&bp->tx_lock); */
b44_tx(bp); b44_tx(bp);
/* spin_unlock(&bp->tx_lock); */ /* spin_unlock(&bp->tx_lock); */
} }
spin_unlock_irq(&bp->lock); spin_unlock_irqrestore(&bp->lock, flags);
work_done = 0; work_done = 0;
if (bp->istat & ISTAT_RX) if (bp->istat & ISTAT_RX)
work_done += b44_rx(bp, budget); work_done += b44_rx(bp, budget);
if (bp->istat & ISTAT_ERRORS) { if (bp->istat & ISTAT_ERRORS) {
unsigned long flags;
spin_lock_irqsave(&bp->lock, flags); spin_lock_irqsave(&bp->lock, flags);
b44_halt(bp); b44_halt(bp);
b44_init_rings(bp); b44_init_rings(bp);

View file

@ -362,5 +362,6 @@ static inline u8 is_udp_pkt(struct sk_buff *skb)
extern void be_cq_notify(struct be_adapter *adapter, u16 qid, bool arm, extern void be_cq_notify(struct be_adapter *adapter, u16 qid, bool arm,
u16 num_popped); u16 num_popped);
extern void be_link_status_update(struct be_adapter *adapter, bool link_up); extern void be_link_status_update(struct be_adapter *adapter, bool link_up);
extern void netdev_stats_update(struct be_adapter *adapter);
extern int be_load_fw(struct be_adapter *adapter, u8 *func); extern int be_load_fw(struct be_adapter *adapter, u8 *func);
#endif /* BE_H */ #endif /* BE_H */

View file

@ -59,15 +59,22 @@ static int be_mcc_compl_process(struct be_adapter *adapter,
compl_status = (compl->status >> CQE_STATUS_COMPL_SHIFT) & compl_status = (compl->status >> CQE_STATUS_COMPL_SHIFT) &
CQE_STATUS_COMPL_MASK; CQE_STATUS_COMPL_MASK;
if (compl_status != MCC_STATUS_SUCCESS) { if (compl_status == MCC_STATUS_SUCCESS) {
if (compl->tag0 == OPCODE_ETH_GET_STATISTICS) {
struct be_cmd_resp_get_stats *resp =
adapter->stats.cmd.va;
be_dws_le_to_cpu(&resp->hw_stats,
sizeof(resp->hw_stats));
netdev_stats_update(adapter);
}
} else if (compl_status != MCC_STATUS_NOT_SUPPORTED) {
extd_status = (compl->status >> CQE_STATUS_EXTD_SHIFT) & extd_status = (compl->status >> CQE_STATUS_EXTD_SHIFT) &
CQE_STATUS_EXTD_MASK; CQE_STATUS_EXTD_MASK;
dev_warn(&adapter->pdev->dev, dev_warn(&adapter->pdev->dev,
"Error in cmd completion: status(compl/extd)=%d/%d\n", "Error in cmd completion: status(compl/extd)=%d/%d\n",
compl_status, extd_status); compl_status, extd_status);
return -1;
} }
return 0; return compl_status;
} }
/* Link state evt is a string of bytes; no need for endian swapping */ /* Link state evt is a string of bytes; no need for endian swapping */
@ -97,10 +104,10 @@ static struct be_mcc_compl *be_mcc_compl_get(struct be_adapter *adapter)
return NULL; return NULL;
} }
void be_process_mcc(struct be_adapter *adapter) int be_process_mcc(struct be_adapter *adapter)
{ {
struct be_mcc_compl *compl; struct be_mcc_compl *compl;
int num = 0; int num = 0, status = 0;
spin_lock_bh(&adapter->mcc_cq_lock); spin_lock_bh(&adapter->mcc_cq_lock);
while ((compl = be_mcc_compl_get(adapter))) { while ((compl = be_mcc_compl_get(adapter))) {
@ -111,38 +118,47 @@ void be_process_mcc(struct be_adapter *adapter)
/* Interpret compl as a async link evt */ /* Interpret compl as a async link evt */
be_async_link_state_process(adapter, be_async_link_state_process(adapter,
(struct be_async_event_link_state *) compl); (struct be_async_event_link_state *) compl);
} else { } else if (compl->flags & CQE_FLAGS_COMPLETED_MASK) {
be_mcc_compl_process(adapter, compl); status = be_mcc_compl_process(adapter, compl);
atomic_dec(&adapter->mcc_obj.q.used); atomic_dec(&adapter->mcc_obj.q.used);
} }
be_mcc_compl_use(compl); be_mcc_compl_use(compl);
num++; num++;
} }
if (num) if (num)
be_cq_notify(adapter, adapter->mcc_obj.cq.id, true, num); be_cq_notify(adapter, adapter->mcc_obj.cq.id, true, num);
spin_unlock_bh(&adapter->mcc_cq_lock); spin_unlock_bh(&adapter->mcc_cq_lock);
return status;
} }
/* Wait till no more pending mcc requests are present */ /* Wait till no more pending mcc requests are present */
static void be_mcc_wait_compl(struct be_adapter *adapter) static int be_mcc_wait_compl(struct be_adapter *adapter)
{ {
#define mcc_timeout 50000 /* 5s timeout */ #define mcc_timeout 120000 /* 12s timeout */
int i; int i, status;
for (i = 0; i < mcc_timeout; i++) { for (i = 0; i < mcc_timeout; i++) {
be_process_mcc(adapter); status = be_process_mcc(adapter);
if (status)
return status;
if (atomic_read(&adapter->mcc_obj.q.used) == 0) if (atomic_read(&adapter->mcc_obj.q.used) == 0)
break; break;
udelay(100); udelay(100);
} }
if (i == mcc_timeout) if (i == mcc_timeout) {
dev_err(&adapter->pdev->dev, "mccq poll timed out\n"); dev_err(&adapter->pdev->dev, "mccq poll timed out\n");
return -1;
}
return 0;
} }
/* Notify MCC requests and wait for completion */ /* Notify MCC requests and wait for completion */
static void be_mcc_notify_wait(struct be_adapter *adapter) static int be_mcc_notify_wait(struct be_adapter *adapter)
{ {
be_mcc_notify(adapter); be_mcc_notify(adapter);
be_mcc_wait_compl(adapter); return be_mcc_wait_compl(adapter);
} }
static int be_mbox_db_ready_wait(struct be_adapter *adapter, void __iomem *db) static int be_mbox_db_ready_wait(struct be_adapter *adapter, void __iomem *db)
@ -173,7 +189,7 @@ static int be_mbox_db_ready_wait(struct be_adapter *adapter, void __iomem *db)
* Insert the mailbox address into the doorbell in two steps * Insert the mailbox address into the doorbell in two steps
* Polls on the mbox doorbell till a command completion (or a timeout) occurs * Polls on the mbox doorbell till a command completion (or a timeout) occurs
*/ */
static int be_mbox_notify(struct be_adapter *adapter) static int be_mbox_notify_wait(struct be_adapter *adapter)
{ {
int status; int status;
u32 val = 0; u32 val = 0;
@ -182,8 +198,6 @@ static int be_mbox_notify(struct be_adapter *adapter)
struct be_mcc_mailbox *mbox = mbox_mem->va; struct be_mcc_mailbox *mbox = mbox_mem->va;
struct be_mcc_compl *compl = &mbox->compl; struct be_mcc_compl *compl = &mbox->compl;
memset(compl, 0, sizeof(*compl));
val |= MPU_MAILBOX_DB_HI_MASK; val |= MPU_MAILBOX_DB_HI_MASK;
/* at bits 2 - 31 place mbox dma addr msb bits 34 - 63 */ /* at bits 2 - 31 place mbox dma addr msb bits 34 - 63 */
val |= (upper_32_bits(mbox_mem->dma) >> 2) << 2; val |= (upper_32_bits(mbox_mem->dma) >> 2) << 2;
@ -310,34 +324,40 @@ static u32 eq_delay_to_mult(u32 usec_delay)
return multiplier; return multiplier;
} }
static inline struct be_mcc_wrb *wrb_from_mbox(struct be_dma_mem *mbox_mem) static inline struct be_mcc_wrb *wrb_from_mbox(struct be_adapter *adapter)
{ {
return &((struct be_mcc_mailbox *)(mbox_mem->va))->wrb; struct be_dma_mem *mbox_mem = &adapter->mbox_mem;
struct be_mcc_wrb *wrb
= &((struct be_mcc_mailbox *)(mbox_mem->va))->wrb;
memset(wrb, 0, sizeof(*wrb));
return wrb;
} }
static inline struct be_mcc_wrb *wrb_from_mcc(struct be_queue_info *mccq) static struct be_mcc_wrb *wrb_from_mccq(struct be_adapter *adapter)
{ {
struct be_mcc_wrb *wrb = NULL; struct be_queue_info *mccq = &adapter->mcc_obj.q;
if (atomic_read(&mccq->used) < mccq->len) { struct be_mcc_wrb *wrb;
wrb = queue_head_node(mccq);
queue_head_inc(mccq); BUG_ON(atomic_read(&mccq->used) >= mccq->len);
atomic_inc(&mccq->used); wrb = queue_head_node(mccq);
memset(wrb, 0, sizeof(*wrb)); queue_head_inc(mccq);
} atomic_inc(&mccq->used);
memset(wrb, 0, sizeof(*wrb));
return wrb; return wrb;
} }
int be_cmd_eq_create(struct be_adapter *adapter, int be_cmd_eq_create(struct be_adapter *adapter,
struct be_queue_info *eq, int eq_delay) struct be_queue_info *eq, int eq_delay)
{ {
struct be_mcc_wrb *wrb = wrb_from_mbox(&adapter->mbox_mem); struct be_mcc_wrb *wrb;
struct be_cmd_req_eq_create *req = embedded_payload(wrb); struct be_cmd_req_eq_create *req;
struct be_cmd_resp_eq_create *resp = embedded_payload(wrb);
struct be_dma_mem *q_mem = &eq->dma_mem; struct be_dma_mem *q_mem = &eq->dma_mem;
int status; int status;
spin_lock(&adapter->mbox_lock); spin_lock(&adapter->mbox_lock);
memset(wrb, 0, sizeof(*wrb));
wrb = wrb_from_mbox(adapter);
req = embedded_payload(wrb);
be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
@ -359,25 +379,29 @@ int be_cmd_eq_create(struct be_adapter *adapter,
be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem); be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem);
status = be_mbox_notify(adapter); status = be_mbox_notify_wait(adapter);
if (!status) { if (!status) {
struct be_cmd_resp_eq_create *resp = embedded_payload(wrb);
eq->id = le16_to_cpu(resp->eq_id); eq->id = le16_to_cpu(resp->eq_id);
eq->created = true; eq->created = true;
} }
spin_unlock(&adapter->mbox_lock); spin_unlock(&adapter->mbox_lock);
return status; return status;
} }
/* Uses mbox */
int be_cmd_mac_addr_query(struct be_adapter *adapter, u8 *mac_addr, int be_cmd_mac_addr_query(struct be_adapter *adapter, u8 *mac_addr,
u8 type, bool permanent, u32 if_handle) u8 type, bool permanent, u32 if_handle)
{ {
struct be_mcc_wrb *wrb = wrb_from_mbox(&adapter->mbox_mem); struct be_mcc_wrb *wrb;
struct be_cmd_req_mac_query *req = embedded_payload(wrb); struct be_cmd_req_mac_query *req;
struct be_cmd_resp_mac_query *resp = embedded_payload(wrb);
int status; int status;
spin_lock(&adapter->mbox_lock); spin_lock(&adapter->mbox_lock);
memset(wrb, 0, sizeof(*wrb));
wrb = wrb_from_mbox(adapter);
req = embedded_payload(wrb);
be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
@ -388,27 +412,32 @@ int be_cmd_mac_addr_query(struct be_adapter *adapter, u8 *mac_addr,
if (permanent) { if (permanent) {
req->permanent = 1; req->permanent = 1;
} else { } else {
req->if_id = cpu_to_le16((u16)if_handle); req->if_id = cpu_to_le16((u16) if_handle);
req->permanent = 0; req->permanent = 0;
} }
status = be_mbox_notify(adapter); status = be_mbox_notify_wait(adapter);
if (!status) if (!status) {
struct be_cmd_resp_mac_query *resp = embedded_payload(wrb);
memcpy(mac_addr, resp->mac.addr, ETH_ALEN); memcpy(mac_addr, resp->mac.addr, ETH_ALEN);
}
spin_unlock(&adapter->mbox_lock); spin_unlock(&adapter->mbox_lock);
return status; return status;
} }
/* Uses synchronous MCCQ */
int be_cmd_pmac_add(struct be_adapter *adapter, u8 *mac_addr, int be_cmd_pmac_add(struct be_adapter *adapter, u8 *mac_addr,
u32 if_id, u32 *pmac_id) u32 if_id, u32 *pmac_id)
{ {
struct be_mcc_wrb *wrb = wrb_from_mbox(&adapter->mbox_mem); struct be_mcc_wrb *wrb;
struct be_cmd_req_pmac_add *req = embedded_payload(wrb); struct be_cmd_req_pmac_add *req;
int status; int status;
spin_lock(&adapter->mbox_lock); spin_lock_bh(&adapter->mcc_lock);
memset(wrb, 0, sizeof(*wrb));
wrb = wrb_from_mccq(adapter);
req = embedded_payload(wrb);
be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
@ -418,24 +447,27 @@ int be_cmd_pmac_add(struct be_adapter *adapter, u8 *mac_addr,
req->if_id = cpu_to_le32(if_id); req->if_id = cpu_to_le32(if_id);
memcpy(req->mac_address, mac_addr, ETH_ALEN); memcpy(req->mac_address, mac_addr, ETH_ALEN);
status = be_mbox_notify(adapter); status = be_mcc_notify_wait(adapter);
if (!status) { if (!status) {
struct be_cmd_resp_pmac_add *resp = embedded_payload(wrb); struct be_cmd_resp_pmac_add *resp = embedded_payload(wrb);
*pmac_id = le32_to_cpu(resp->pmac_id); *pmac_id = le32_to_cpu(resp->pmac_id);
} }
spin_unlock(&adapter->mbox_lock); spin_unlock_bh(&adapter->mcc_lock);
return status; return status;
} }
/* Uses synchronous MCCQ */
int be_cmd_pmac_del(struct be_adapter *adapter, u32 if_id, u32 pmac_id) int be_cmd_pmac_del(struct be_adapter *adapter, u32 if_id, u32 pmac_id)
{ {
struct be_mcc_wrb *wrb = wrb_from_mbox(&adapter->mbox_mem); struct be_mcc_wrb *wrb;
struct be_cmd_req_pmac_del *req = embedded_payload(wrb); struct be_cmd_req_pmac_del *req;
int status; int status;
spin_lock(&adapter->mbox_lock); spin_lock_bh(&adapter->mcc_lock);
memset(wrb, 0, sizeof(*wrb));
wrb = wrb_from_mccq(adapter);
req = embedded_payload(wrb);
be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
@ -445,25 +477,29 @@ int be_cmd_pmac_del(struct be_adapter *adapter, u32 if_id, u32 pmac_id)
req->if_id = cpu_to_le32(if_id); req->if_id = cpu_to_le32(if_id);
req->pmac_id = cpu_to_le32(pmac_id); req->pmac_id = cpu_to_le32(pmac_id);
status = be_mbox_notify(adapter); status = be_mcc_notify_wait(adapter);
spin_unlock(&adapter->mbox_lock);
spin_unlock_bh(&adapter->mcc_lock);
return status; return status;
} }
/* Uses Mbox */
int be_cmd_cq_create(struct be_adapter *adapter, int be_cmd_cq_create(struct be_adapter *adapter,
struct be_queue_info *cq, struct be_queue_info *eq, struct be_queue_info *cq, struct be_queue_info *eq,
bool sol_evts, bool no_delay, int coalesce_wm) bool sol_evts, bool no_delay, int coalesce_wm)
{ {
struct be_mcc_wrb *wrb = wrb_from_mbox(&adapter->mbox_mem); struct be_mcc_wrb *wrb;
struct be_cmd_req_cq_create *req = embedded_payload(wrb); struct be_cmd_req_cq_create *req;
struct be_cmd_resp_cq_create *resp = embedded_payload(wrb);
struct be_dma_mem *q_mem = &cq->dma_mem; struct be_dma_mem *q_mem = &cq->dma_mem;
void *ctxt = &req->context; void *ctxt;
int status; int status;
spin_lock(&adapter->mbox_lock); spin_lock(&adapter->mbox_lock);
memset(wrb, 0, sizeof(*wrb));
wrb = wrb_from_mbox(adapter);
req = embedded_payload(wrb);
ctxt = &req->context;
be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
@ -486,11 +522,13 @@ int be_cmd_cq_create(struct be_adapter *adapter,
be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem); be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem);
status = be_mbox_notify(adapter); status = be_mbox_notify_wait(adapter);
if (!status) { if (!status) {
struct be_cmd_resp_cq_create *resp = embedded_payload(wrb);
cq->id = le16_to_cpu(resp->cq_id); cq->id = le16_to_cpu(resp->cq_id);
cq->created = true; cq->created = true;
} }
spin_unlock(&adapter->mbox_lock); spin_unlock(&adapter->mbox_lock);
return status; return status;
@ -508,14 +546,17 @@ int be_cmd_mccq_create(struct be_adapter *adapter,
struct be_queue_info *mccq, struct be_queue_info *mccq,
struct be_queue_info *cq) struct be_queue_info *cq)
{ {
struct be_mcc_wrb *wrb = wrb_from_mbox(&adapter->mbox_mem); struct be_mcc_wrb *wrb;
struct be_cmd_req_mcc_create *req = embedded_payload(wrb); struct be_cmd_req_mcc_create *req;
struct be_dma_mem *q_mem = &mccq->dma_mem; struct be_dma_mem *q_mem = &mccq->dma_mem;
void *ctxt = &req->context; void *ctxt;
int status; int status;
spin_lock(&adapter->mbox_lock); spin_lock(&adapter->mbox_lock);
memset(wrb, 0, sizeof(*wrb));
wrb = wrb_from_mbox(adapter);
req = embedded_payload(wrb);
ctxt = &req->context;
be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
@ -534,7 +575,7 @@ int be_cmd_mccq_create(struct be_adapter *adapter,
be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem); be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem);
status = be_mbox_notify(adapter); status = be_mbox_notify_wait(adapter);
if (!status) { if (!status) {
struct be_cmd_resp_mcc_create *resp = embedded_payload(wrb); struct be_cmd_resp_mcc_create *resp = embedded_payload(wrb);
mccq->id = le16_to_cpu(resp->id); mccq->id = le16_to_cpu(resp->id);
@ -549,15 +590,17 @@ int be_cmd_txq_create(struct be_adapter *adapter,
struct be_queue_info *txq, struct be_queue_info *txq,
struct be_queue_info *cq) struct be_queue_info *cq)
{ {
struct be_mcc_wrb *wrb = wrb_from_mbox(&adapter->mbox_mem); struct be_mcc_wrb *wrb;
struct be_cmd_req_eth_tx_create *req = embedded_payload(wrb); struct be_cmd_req_eth_tx_create *req;
struct be_dma_mem *q_mem = &txq->dma_mem; struct be_dma_mem *q_mem = &txq->dma_mem;
void *ctxt = &req->context; void *ctxt;
int status; int status;
u32 len_encoded;
spin_lock(&adapter->mbox_lock); spin_lock(&adapter->mbox_lock);
memset(wrb, 0, sizeof(*wrb));
wrb = wrb_from_mbox(adapter);
req = embedded_payload(wrb);
ctxt = &req->context;
be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
@ -568,10 +611,8 @@ int be_cmd_txq_create(struct be_adapter *adapter,
req->ulp_num = BE_ULP1_NUM; req->ulp_num = BE_ULP1_NUM;
req->type = BE_ETH_TX_RING_TYPE_STANDARD; req->type = BE_ETH_TX_RING_TYPE_STANDARD;
len_encoded = fls(txq->len); /* log2(len) + 1 */ AMAP_SET_BITS(struct amap_tx_context, tx_ring_size, ctxt,
if (len_encoded == 16) be_encoded_q_len(txq->len));
len_encoded = 0;
AMAP_SET_BITS(struct amap_tx_context, tx_ring_size, ctxt, len_encoded);
AMAP_SET_BITS(struct amap_tx_context, pci_func_id, ctxt, AMAP_SET_BITS(struct amap_tx_context, pci_func_id, ctxt,
be_pci_func(adapter)); be_pci_func(adapter));
AMAP_SET_BITS(struct amap_tx_context, ctx_valid, ctxt, 1); AMAP_SET_BITS(struct amap_tx_context, ctx_valid, ctxt, 1);
@ -581,28 +622,32 @@ int be_cmd_txq_create(struct be_adapter *adapter,
be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem); be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem);
status = be_mbox_notify(adapter); status = be_mbox_notify_wait(adapter);
if (!status) { if (!status) {
struct be_cmd_resp_eth_tx_create *resp = embedded_payload(wrb); struct be_cmd_resp_eth_tx_create *resp = embedded_payload(wrb);
txq->id = le16_to_cpu(resp->cid); txq->id = le16_to_cpu(resp->cid);
txq->created = true; txq->created = true;
} }
spin_unlock(&adapter->mbox_lock); spin_unlock(&adapter->mbox_lock);
return status; return status;
} }
/* Uses mbox */
int be_cmd_rxq_create(struct be_adapter *adapter, int be_cmd_rxq_create(struct be_adapter *adapter,
struct be_queue_info *rxq, u16 cq_id, u16 frag_size, struct be_queue_info *rxq, u16 cq_id, u16 frag_size,
u16 max_frame_size, u32 if_id, u32 rss) u16 max_frame_size, u32 if_id, u32 rss)
{ {
struct be_mcc_wrb *wrb = wrb_from_mbox(&adapter->mbox_mem); struct be_mcc_wrb *wrb;
struct be_cmd_req_eth_rx_create *req = embedded_payload(wrb); struct be_cmd_req_eth_rx_create *req;
struct be_dma_mem *q_mem = &rxq->dma_mem; struct be_dma_mem *q_mem = &rxq->dma_mem;
int status; int status;
spin_lock(&adapter->mbox_lock); spin_lock(&adapter->mbox_lock);
memset(wrb, 0, sizeof(*wrb));
wrb = wrb_from_mbox(adapter);
req = embedded_payload(wrb);
be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
@ -617,29 +662,34 @@ int be_cmd_rxq_create(struct be_adapter *adapter,
req->max_frame_size = cpu_to_le16(max_frame_size); req->max_frame_size = cpu_to_le16(max_frame_size);
req->rss_queue = cpu_to_le32(rss); req->rss_queue = cpu_to_le32(rss);
status = be_mbox_notify(adapter); status = be_mbox_notify_wait(adapter);
if (!status) { if (!status) {
struct be_cmd_resp_eth_rx_create *resp = embedded_payload(wrb); struct be_cmd_resp_eth_rx_create *resp = embedded_payload(wrb);
rxq->id = le16_to_cpu(resp->id); rxq->id = le16_to_cpu(resp->id);
rxq->created = true; rxq->created = true;
} }
spin_unlock(&adapter->mbox_lock); spin_unlock(&adapter->mbox_lock);
return status; return status;
} }
/* Generic destroyer function for all types of queues */ /* Generic destroyer function for all types of queues
* Uses Mbox
*/
int be_cmd_q_destroy(struct be_adapter *adapter, struct be_queue_info *q, int be_cmd_q_destroy(struct be_adapter *adapter, struct be_queue_info *q,
int queue_type) int queue_type)
{ {
struct be_mcc_wrb *wrb = wrb_from_mbox(&adapter->mbox_mem); struct be_mcc_wrb *wrb;
struct be_cmd_req_q_destroy *req = embedded_payload(wrb); struct be_cmd_req_q_destroy *req;
u8 subsys = 0, opcode = 0; u8 subsys = 0, opcode = 0;
int status; int status;
spin_lock(&adapter->mbox_lock); spin_lock(&adapter->mbox_lock);
memset(wrb, 0, sizeof(*wrb)); wrb = wrb_from_mbox(adapter);
req = embedded_payload(wrb);
be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
switch (queue_type) { switch (queue_type) {
@ -669,23 +719,27 @@ int be_cmd_q_destroy(struct be_adapter *adapter, struct be_queue_info *q,
be_cmd_hdr_prepare(&req->hdr, subsys, opcode, sizeof(*req)); be_cmd_hdr_prepare(&req->hdr, subsys, opcode, sizeof(*req));
req->id = cpu_to_le16(q->id); req->id = cpu_to_le16(q->id);
status = be_mbox_notify(adapter); status = be_mbox_notify_wait(adapter);
spin_unlock(&adapter->mbox_lock); spin_unlock(&adapter->mbox_lock);
return status; return status;
} }
/* Create an rx filtering policy configuration on an i/f */ /* Create an rx filtering policy configuration on an i/f
* Uses mbox
*/
int be_cmd_if_create(struct be_adapter *adapter, u32 flags, u8 *mac, int be_cmd_if_create(struct be_adapter *adapter, u32 flags, u8 *mac,
bool pmac_invalid, u32 *if_handle, u32 *pmac_id) bool pmac_invalid, u32 *if_handle, u32 *pmac_id)
{ {
struct be_mcc_wrb *wrb = wrb_from_mbox(&adapter->mbox_mem); struct be_mcc_wrb *wrb;
struct be_cmd_req_if_create *req = embedded_payload(wrb); struct be_cmd_req_if_create *req;
int status; int status;
spin_lock(&adapter->mbox_lock); spin_lock(&adapter->mbox_lock);
memset(wrb, 0, sizeof(*wrb));
wrb = wrb_from_mbox(adapter);
req = embedded_payload(wrb);
be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
@ -694,10 +748,11 @@ int be_cmd_if_create(struct be_adapter *adapter, u32 flags, u8 *mac,
req->capability_flags = cpu_to_le32(flags); req->capability_flags = cpu_to_le32(flags);
req->enable_flags = cpu_to_le32(flags); req->enable_flags = cpu_to_le32(flags);
req->pmac_invalid = pmac_invalid;
if (!pmac_invalid) if (!pmac_invalid)
memcpy(req->mac_addr, mac, ETH_ALEN); memcpy(req->mac_addr, mac, ETH_ALEN);
status = be_mbox_notify(adapter); status = be_mbox_notify_wait(adapter);
if (!status) { if (!status) {
struct be_cmd_resp_if_create *resp = embedded_payload(wrb); struct be_cmd_resp_if_create *resp = embedded_payload(wrb);
*if_handle = le32_to_cpu(resp->interface_id); *if_handle = le32_to_cpu(resp->interface_id);
@ -709,14 +764,17 @@ int be_cmd_if_create(struct be_adapter *adapter, u32 flags, u8 *mac,
return status; return status;
} }
/* Uses mbox */
int be_cmd_if_destroy(struct be_adapter *adapter, u32 interface_id) int be_cmd_if_destroy(struct be_adapter *adapter, u32 interface_id)
{ {
struct be_mcc_wrb *wrb = wrb_from_mbox(&adapter->mbox_mem); struct be_mcc_wrb *wrb;
struct be_cmd_req_if_destroy *req = embedded_payload(wrb); struct be_cmd_req_if_destroy *req;
int status; int status;
spin_lock(&adapter->mbox_lock); spin_lock(&adapter->mbox_lock);
memset(wrb, 0, sizeof(*wrb));
wrb = wrb_from_mbox(adapter);
req = embedded_payload(wrb);
be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
@ -724,7 +782,8 @@ int be_cmd_if_destroy(struct be_adapter *adapter, u32 interface_id)
OPCODE_COMMON_NTWK_INTERFACE_DESTROY, sizeof(*req)); OPCODE_COMMON_NTWK_INTERFACE_DESTROY, sizeof(*req));
req->interface_id = cpu_to_le32(interface_id); req->interface_id = cpu_to_le32(interface_id);
status = be_mbox_notify(adapter);
status = be_mbox_notify_wait(adapter);
spin_unlock(&adapter->mbox_lock); spin_unlock(&adapter->mbox_lock);
@ -733,20 +792,22 @@ int be_cmd_if_destroy(struct be_adapter *adapter, u32 interface_id)
/* Get stats is a non embedded command: the request is not embedded inside /* Get stats is a non embedded command: the request is not embedded inside
* WRB but is a separate dma memory block * WRB but is a separate dma memory block
* Uses asynchronous MCC
*/ */
int be_cmd_get_stats(struct be_adapter *adapter, struct be_dma_mem *nonemb_cmd) int be_cmd_get_stats(struct be_adapter *adapter, struct be_dma_mem *nonemb_cmd)
{ {
struct be_mcc_wrb *wrb = wrb_from_mbox(&adapter->mbox_mem); struct be_mcc_wrb *wrb;
struct be_cmd_req_get_stats *req = nonemb_cmd->va; struct be_cmd_req_get_stats *req;
struct be_sge *sge = nonembedded_sgl(wrb); struct be_sge *sge;
int status;
spin_lock(&adapter->mbox_lock); spin_lock_bh(&adapter->mcc_lock);
memset(wrb, 0, sizeof(*wrb));
memset(req, 0, sizeof(*req)); wrb = wrb_from_mccq(adapter);
req = nonemb_cmd->va;
sge = nonembedded_sgl(wrb);
be_wrb_hdr_prepare(wrb, sizeof(*req), false, 1); be_wrb_hdr_prepare(wrb, sizeof(*req), false, 1);
wrb->tag0 = OPCODE_ETH_GET_STATISTICS;
be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ETH, be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ETH,
OPCODE_ETH_GET_STATISTICS, sizeof(*req)); OPCODE_ETH_GET_STATISTICS, sizeof(*req));
@ -754,59 +815,61 @@ int be_cmd_get_stats(struct be_adapter *adapter, struct be_dma_mem *nonemb_cmd)
sge->pa_lo = cpu_to_le32(nonemb_cmd->dma & 0xFFFFFFFF); sge->pa_lo = cpu_to_le32(nonemb_cmd->dma & 0xFFFFFFFF);
sge->len = cpu_to_le32(nonemb_cmd->size); sge->len = cpu_to_le32(nonemb_cmd->size);
status = be_mbox_notify(adapter); be_mcc_notify(adapter);
if (!status) {
struct be_cmd_resp_get_stats *resp = nonemb_cmd->va;
be_dws_le_to_cpu(&resp->hw_stats, sizeof(resp->hw_stats));
}
spin_unlock(&adapter->mbox_lock); spin_unlock_bh(&adapter->mcc_lock);
return status; return 0;
} }
/* Uses synchronous mcc */
int be_cmd_link_status_query(struct be_adapter *adapter, int be_cmd_link_status_query(struct be_adapter *adapter,
bool *link_up) bool *link_up)
{ {
struct be_mcc_wrb *wrb = wrb_from_mbox(&adapter->mbox_mem); struct be_mcc_wrb *wrb;
struct be_cmd_req_link_status *req = embedded_payload(wrb); struct be_cmd_req_link_status *req;
int status; int status;
spin_lock(&adapter->mbox_lock); spin_lock_bh(&adapter->mcc_lock);
wrb = wrb_from_mccq(adapter);
req = embedded_payload(wrb);
*link_up = false; *link_up = false;
memset(wrb, 0, sizeof(*wrb));
be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
OPCODE_COMMON_NTWK_LINK_STATUS_QUERY, sizeof(*req)); OPCODE_COMMON_NTWK_LINK_STATUS_QUERY, sizeof(*req));
status = be_mbox_notify(adapter); status = be_mcc_notify_wait(adapter);
if (!status) { if (!status) {
struct be_cmd_resp_link_status *resp = embedded_payload(wrb); struct be_cmd_resp_link_status *resp = embedded_payload(wrb);
if (resp->mac_speed != PHY_LINK_SPEED_ZERO) if (resp->mac_speed != PHY_LINK_SPEED_ZERO)
*link_up = true; *link_up = true;
} }
spin_unlock(&adapter->mbox_lock); spin_unlock_bh(&adapter->mcc_lock);
return status; return status;
} }
/* Uses Mbox */
int be_cmd_get_fw_ver(struct be_adapter *adapter, char *fw_ver) int be_cmd_get_fw_ver(struct be_adapter *adapter, char *fw_ver)
{ {
struct be_mcc_wrb *wrb = wrb_from_mbox(&adapter->mbox_mem); struct be_mcc_wrb *wrb;
struct be_cmd_req_get_fw_version *req = embedded_payload(wrb); struct be_cmd_req_get_fw_version *req;
int status; int status;
spin_lock(&adapter->mbox_lock); spin_lock(&adapter->mbox_lock);
memset(wrb, 0, sizeof(*wrb));
wrb = wrb_from_mbox(adapter);
req = embedded_payload(wrb);
be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
OPCODE_COMMON_GET_FW_VERSION, sizeof(*req)); OPCODE_COMMON_GET_FW_VERSION, sizeof(*req));
status = be_mbox_notify(adapter); status = be_mbox_notify_wait(adapter);
if (!status) { if (!status) {
struct be_cmd_resp_get_fw_version *resp = embedded_payload(wrb); struct be_cmd_resp_get_fw_version *resp = embedded_payload(wrb);
strncpy(fw_ver, resp->firmware_version_string, FW_VER_LEN); strncpy(fw_ver, resp->firmware_version_string, FW_VER_LEN);
@ -816,15 +879,18 @@ int be_cmd_get_fw_ver(struct be_adapter *adapter, char *fw_ver)
return status; return status;
} }
/* set the EQ delay interval of an EQ to specified value */ /* set the EQ delay interval of an EQ to specified value
* Uses async mcc
*/
int be_cmd_modify_eqd(struct be_adapter *adapter, u32 eq_id, u32 eqd) int be_cmd_modify_eqd(struct be_adapter *adapter, u32 eq_id, u32 eqd)
{ {
struct be_mcc_wrb *wrb = wrb_from_mbox(&adapter->mbox_mem); struct be_mcc_wrb *wrb;
struct be_cmd_req_modify_eq_delay *req = embedded_payload(wrb); struct be_cmd_req_modify_eq_delay *req;
int status;
spin_lock(&adapter->mbox_lock); spin_lock_bh(&adapter->mcc_lock);
memset(wrb, 0, sizeof(*wrb));
wrb = wrb_from_mccq(adapter);
req = embedded_payload(wrb);
be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
@ -836,21 +902,24 @@ int be_cmd_modify_eqd(struct be_adapter *adapter, u32 eq_id, u32 eqd)
req->delay[0].phase = 0; req->delay[0].phase = 0;
req->delay[0].delay_multiplier = cpu_to_le32(eqd); req->delay[0].delay_multiplier = cpu_to_le32(eqd);
status = be_mbox_notify(adapter); be_mcc_notify(adapter);
spin_unlock(&adapter->mbox_lock); spin_unlock_bh(&adapter->mcc_lock);
return status; return 0;
} }
/* Uses sycnhronous mcc */
int be_cmd_vlan_config(struct be_adapter *adapter, u32 if_id, u16 *vtag_array, int be_cmd_vlan_config(struct be_adapter *adapter, u32 if_id, u16 *vtag_array,
u32 num, bool untagged, bool promiscuous) u32 num, bool untagged, bool promiscuous)
{ {
struct be_mcc_wrb *wrb = wrb_from_mbox(&adapter->mbox_mem); struct be_mcc_wrb *wrb;
struct be_cmd_req_vlan_config *req = embedded_payload(wrb); struct be_cmd_req_vlan_config *req;
int status; int status;
spin_lock(&adapter->mbox_lock); spin_lock_bh(&adapter->mcc_lock);
memset(wrb, 0, sizeof(*wrb));
wrb = wrb_from_mccq(adapter);
req = embedded_payload(wrb);
be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
@ -866,23 +935,24 @@ int be_cmd_vlan_config(struct be_adapter *adapter, u32 if_id, u16 *vtag_array,
req->num_vlan * sizeof(vtag_array[0])); req->num_vlan * sizeof(vtag_array[0]));
} }
status = be_mbox_notify(adapter); status = be_mcc_notify_wait(adapter);
spin_unlock(&adapter->mbox_lock); spin_unlock_bh(&adapter->mcc_lock);
return status; return status;
} }
/* Use MCC for this command as it may be called in BH context */ /* Uses MCC for this command as it may be called in BH context
* Uses synchronous mcc
*/
int be_cmd_promiscuous_config(struct be_adapter *adapter, u8 port_num, bool en) int be_cmd_promiscuous_config(struct be_adapter *adapter, u8 port_num, bool en)
{ {
struct be_mcc_wrb *wrb; struct be_mcc_wrb *wrb;
struct be_cmd_req_promiscuous_config *req; struct be_cmd_req_promiscuous_config *req;
int status;
spin_lock_bh(&adapter->mcc_lock); spin_lock_bh(&adapter->mcc_lock);
wrb = wrb_from_mcc(&adapter->mcc_obj.q); wrb = wrb_from_mccq(adapter);
BUG_ON(!wrb);
req = embedded_payload(wrb); req = embedded_payload(wrb);
be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
@ -895,14 +965,14 @@ int be_cmd_promiscuous_config(struct be_adapter *adapter, u8 port_num, bool en)
else else
req->port0_promiscuous = en; req->port0_promiscuous = en;
be_mcc_notify_wait(adapter); status = be_mcc_notify_wait(adapter);
spin_unlock_bh(&adapter->mcc_lock); spin_unlock_bh(&adapter->mcc_lock);
return 0; return status;
} }
/* /*
* Use MCC for this command as it may be called in BH context * Uses MCC for this command as it may be called in BH context
* (mc == NULL) => multicast promiscous * (mc == NULL) => multicast promiscous
*/ */
int be_cmd_multicast_set(struct be_adapter *adapter, u32 if_id, int be_cmd_multicast_set(struct be_adapter *adapter, u32 if_id,
@ -914,9 +984,7 @@ int be_cmd_multicast_set(struct be_adapter *adapter, u32 if_id,
spin_lock_bh(&adapter->mcc_lock); spin_lock_bh(&adapter->mcc_lock);
wrb = wrb_from_mcc(&adapter->mcc_obj.q); wrb = wrb_from_mccq(adapter);
BUG_ON(!wrb);
req = embedded_payload(wrb); req = embedded_payload(wrb);
be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
@ -944,15 +1012,17 @@ int be_cmd_multicast_set(struct be_adapter *adapter, u32 if_id,
return 0; return 0;
} }
/* Uses synchrounous mcc */
int be_cmd_set_flow_control(struct be_adapter *adapter, u32 tx_fc, u32 rx_fc) int be_cmd_set_flow_control(struct be_adapter *adapter, u32 tx_fc, u32 rx_fc)
{ {
struct be_mcc_wrb *wrb = wrb_from_mbox(&adapter->mbox_mem); struct be_mcc_wrb *wrb;
struct be_cmd_req_set_flow_control *req = embedded_payload(wrb); struct be_cmd_req_set_flow_control *req;
int status; int status;
spin_lock(&adapter->mbox_lock); spin_lock_bh(&adapter->mcc_lock);
memset(wrb, 0, sizeof(*wrb)); wrb = wrb_from_mccq(adapter);
req = embedded_payload(wrb);
be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
@ -962,28 +1032,30 @@ int be_cmd_set_flow_control(struct be_adapter *adapter, u32 tx_fc, u32 rx_fc)
req->tx_flow_control = cpu_to_le16((u16)tx_fc); req->tx_flow_control = cpu_to_le16((u16)tx_fc);
req->rx_flow_control = cpu_to_le16((u16)rx_fc); req->rx_flow_control = cpu_to_le16((u16)rx_fc);
status = be_mbox_notify(adapter); status = be_mcc_notify_wait(adapter);
spin_unlock(&adapter->mbox_lock); spin_unlock_bh(&adapter->mcc_lock);
return status; return status;
} }
/* Uses sycn mcc */
int be_cmd_get_flow_control(struct be_adapter *adapter, u32 *tx_fc, u32 *rx_fc) int be_cmd_get_flow_control(struct be_adapter *adapter, u32 *tx_fc, u32 *rx_fc)
{ {
struct be_mcc_wrb *wrb = wrb_from_mbox(&adapter->mbox_mem); struct be_mcc_wrb *wrb;
struct be_cmd_req_get_flow_control *req = embedded_payload(wrb); struct be_cmd_req_get_flow_control *req;
int status; int status;
spin_lock(&adapter->mbox_lock); spin_lock_bh(&adapter->mcc_lock);
memset(wrb, 0, sizeof(*wrb)); wrb = wrb_from_mccq(adapter);
req = embedded_payload(wrb);
be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
OPCODE_COMMON_GET_FLOW_CONTROL, sizeof(*req)); OPCODE_COMMON_GET_FLOW_CONTROL, sizeof(*req));
status = be_mbox_notify(adapter); status = be_mcc_notify_wait(adapter);
if (!status) { if (!status) {
struct be_cmd_resp_get_flow_control *resp = struct be_cmd_resp_get_flow_control *resp =
embedded_payload(wrb); embedded_payload(wrb);
@ -991,26 +1063,28 @@ int be_cmd_get_flow_control(struct be_adapter *adapter, u32 *tx_fc, u32 *rx_fc)
*rx_fc = le16_to_cpu(resp->rx_flow_control); *rx_fc = le16_to_cpu(resp->rx_flow_control);
} }
spin_unlock(&adapter->mbox_lock); spin_unlock_bh(&adapter->mcc_lock);
return status; return status;
} }
/* Uses mbox */
int be_cmd_query_fw_cfg(struct be_adapter *adapter, u32 *port_num) int be_cmd_query_fw_cfg(struct be_adapter *adapter, u32 *port_num)
{ {
struct be_mcc_wrb *wrb = wrb_from_mbox(&adapter->mbox_mem); struct be_mcc_wrb *wrb;
struct be_cmd_req_query_fw_cfg *req = embedded_payload(wrb); struct be_cmd_req_query_fw_cfg *req;
int status; int status;
spin_lock(&adapter->mbox_lock); spin_lock(&adapter->mbox_lock);
memset(wrb, 0, sizeof(*wrb)); wrb = wrb_from_mbox(adapter);
req = embedded_payload(wrb);
be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
OPCODE_COMMON_QUERY_FIRMWARE_CONFIG, sizeof(*req)); OPCODE_COMMON_QUERY_FIRMWARE_CONFIG, sizeof(*req));
status = be_mbox_notify(adapter); status = be_mbox_notify_wait(adapter);
if (!status) { if (!status) {
struct be_cmd_resp_query_fw_cfg *resp = embedded_payload(wrb); struct be_cmd_resp_query_fw_cfg *resp = embedded_payload(wrb);
*port_num = le32_to_cpu(resp->phys_port); *port_num = le32_to_cpu(resp->phys_port);
@ -1020,22 +1094,24 @@ int be_cmd_query_fw_cfg(struct be_adapter *adapter, u32 *port_num)
return status; return status;
} }
/* Uses mbox */
int be_cmd_reset_function(struct be_adapter *adapter) int be_cmd_reset_function(struct be_adapter *adapter)
{ {
struct be_mcc_wrb *wrb = wrb_from_mbox(&adapter->mbox_mem); struct be_mcc_wrb *wrb;
struct be_cmd_req_hdr *req = embedded_payload(wrb); struct be_cmd_req_hdr *req;
int status; int status;
spin_lock(&adapter->mbox_lock); spin_lock(&adapter->mbox_lock);
memset(wrb, 0, sizeof(*wrb)); wrb = wrb_from_mbox(adapter);
req = embedded_payload(wrb);
be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
be_cmd_hdr_prepare(req, CMD_SUBSYSTEM_COMMON, be_cmd_hdr_prepare(req, CMD_SUBSYSTEM_COMMON,
OPCODE_COMMON_FUNCTION_RESET, sizeof(*req)); OPCODE_COMMON_FUNCTION_RESET, sizeof(*req));
status = be_mbox_notify(adapter); status = be_mbox_notify_wait(adapter);
spin_unlock(&adapter->mbox_lock); spin_unlock(&adapter->mbox_lock);
return status; return status;
@ -1044,13 +1120,17 @@ int be_cmd_reset_function(struct be_adapter *adapter)
int be_cmd_write_flashrom(struct be_adapter *adapter, struct be_dma_mem *cmd, int be_cmd_write_flashrom(struct be_adapter *adapter, struct be_dma_mem *cmd,
u32 flash_type, u32 flash_opcode, u32 buf_size) u32 flash_type, u32 flash_opcode, u32 buf_size)
{ {
struct be_mcc_wrb *wrb = wrb_from_mbox(&adapter->mbox_mem); struct be_mcc_wrb *wrb;
struct be_cmd_write_flashrom *req = cmd->va; struct be_cmd_write_flashrom *req = cmd->va;
struct be_sge *sge = nonembedded_sgl(wrb); struct be_sge *sge;
int status; int status;
spin_lock(&adapter->mbox_lock); spin_lock_bh(&adapter->mcc_lock);
memset(wrb, 0, sizeof(*wrb));
wrb = wrb_from_mccq(adapter);
req = embedded_payload(wrb);
sge = nonembedded_sgl(wrb);
be_wrb_hdr_prepare(wrb, cmd->size, false, 1); be_wrb_hdr_prepare(wrb, cmd->size, false, 1);
be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
@ -1063,8 +1143,8 @@ int be_cmd_write_flashrom(struct be_adapter *adapter, struct be_dma_mem *cmd,
req->params.op_code = cpu_to_le32(flash_opcode); req->params.op_code = cpu_to_le32(flash_opcode);
req->params.data_buf_size = cpu_to_le32(buf_size); req->params.data_buf_size = cpu_to_le32(buf_size);
status = be_mbox_notify(adapter); status = be_mcc_notify_wait(adapter);
spin_unlock(&adapter->mbox_lock); spin_unlock_bh(&adapter->mcc_lock);
return status; return status;
} }

View file

@ -61,7 +61,8 @@ enum {
/* The command is completing because the queue was getting flushed */ /* The command is completing because the queue was getting flushed */
MCC_STATUS_QUEUE_FLUSHING = 0x4, MCC_STATUS_QUEUE_FLUSHING = 0x4,
/* The command is completing with a DMA error */ /* The command is completing with a DMA error */
MCC_STATUS_DMA_FAILED = 0x5 MCC_STATUS_DMA_FAILED = 0x5,
MCC_STATUS_NOT_SUPPORTED = 0x66
}; };
#define CQE_STATUS_COMPL_MASK 0xFFFF #define CQE_STATUS_COMPL_MASK 0xFFFF
@ -761,7 +762,7 @@ extern int be_cmd_get_flow_control(struct be_adapter *adapter,
u32 *tx_fc, u32 *rx_fc); u32 *tx_fc, u32 *rx_fc);
extern int be_cmd_query_fw_cfg(struct be_adapter *adapter, u32 *port_num); extern int be_cmd_query_fw_cfg(struct be_adapter *adapter, u32 *port_num);
extern int be_cmd_reset_function(struct be_adapter *adapter); extern int be_cmd_reset_function(struct be_adapter *adapter);
extern void be_process_mcc(struct be_adapter *adapter); extern int be_process_mcc(struct be_adapter *adapter);
extern int be_cmd_write_flashrom(struct be_adapter *adapter, extern int be_cmd_write_flashrom(struct be_adapter *adapter,
struct be_dma_mem *cmd, u32 flash_oper, struct be_dma_mem *cmd, u32 flash_oper,
u32 flash_opcode, u32 buf_size); u32 flash_opcode, u32 buf_size);

View file

@ -135,7 +135,7 @@ static int be_mac_addr_set(struct net_device *netdev, void *p)
return status; return status;
} }
static void netdev_stats_update(struct be_adapter *adapter) void netdev_stats_update(struct be_adapter *adapter)
{ {
struct be_hw_stats *hw_stats = hw_stats_from_cmd(adapter->stats.cmd.va); struct be_hw_stats *hw_stats = hw_stats_from_cmd(adapter->stats.cmd.va);
struct be_rxf_stats *rxf_stats = &hw_stats->rxf; struct be_rxf_stats *rxf_stats = &hw_stats->rxf;
@ -431,8 +431,7 @@ static int make_tx_wrbs(struct be_adapter *adapter,
} }
static netdev_tx_t be_xmit(struct sk_buff *skb, static netdev_tx_t be_xmit(struct sk_buff *skb,
struct net_device *netdev) struct net_device *netdev)
{ {
struct be_adapter *adapter = netdev_priv(netdev); struct be_adapter *adapter = netdev_priv(netdev);
struct be_tx_obj *tx_obj = &adapter->tx_obj; struct be_tx_obj *tx_obj = &adapter->tx_obj;
@ -490,11 +489,11 @@ static int be_change_mtu(struct net_device *netdev, int new_mtu)
* program them in BE. If more than BE_NUM_VLANS_SUPPORTED are configured, * program them in BE. If more than BE_NUM_VLANS_SUPPORTED are configured,
* set the BE in promiscuous VLAN mode. * set the BE in promiscuous VLAN mode.
*/ */
static void be_vid_config(struct net_device *netdev) static int be_vid_config(struct be_adapter *adapter)
{ {
struct be_adapter *adapter = netdev_priv(netdev);
u16 vtag[BE_NUM_VLANS_SUPPORTED]; u16 vtag[BE_NUM_VLANS_SUPPORTED];
u16 ntags = 0, i; u16 ntags = 0, i;
int status;
if (adapter->num_vlans <= BE_NUM_VLANS_SUPPORTED) { if (adapter->num_vlans <= BE_NUM_VLANS_SUPPORTED) {
/* Construct VLAN Table to give to HW */ /* Construct VLAN Table to give to HW */
@ -504,12 +503,13 @@ static void be_vid_config(struct net_device *netdev)
ntags++; ntags++;
} }
} }
be_cmd_vlan_config(adapter, adapter->if_handle, status = be_cmd_vlan_config(adapter, adapter->if_handle,
vtag, ntags, 1, 0); vtag, ntags, 1, 0);
} else { } else {
be_cmd_vlan_config(adapter, adapter->if_handle, status = be_cmd_vlan_config(adapter, adapter->if_handle,
NULL, 0, 1, 1); NULL, 0, 1, 1);
} }
return status;
} }
static void be_vlan_register(struct net_device *netdev, struct vlan_group *grp) static void be_vlan_register(struct net_device *netdev, struct vlan_group *grp)
@ -532,7 +532,7 @@ static void be_vlan_add_vid(struct net_device *netdev, u16 vid)
adapter->num_vlans++; adapter->num_vlans++;
adapter->vlan_tag[vid] = 1; adapter->vlan_tag[vid] = 1;
be_vid_config(netdev); be_vid_config(adapter);
} }
static void be_vlan_rem_vid(struct net_device *netdev, u16 vid) static void be_vlan_rem_vid(struct net_device *netdev, u16 vid)
@ -543,7 +543,7 @@ static void be_vlan_rem_vid(struct net_device *netdev, u16 vid)
adapter->vlan_tag[vid] = 0; adapter->vlan_tag[vid] = 0;
vlan_group_set_device(adapter->vlan_grp, vid, NULL); vlan_group_set_device(adapter->vlan_grp, vid, NULL);
be_vid_config(netdev); be_vid_config(adapter);
} }
static void be_set_multicast_list(struct net_device *netdev) static void be_set_multicast_list(struct net_device *netdev)
@ -1444,12 +1444,8 @@ static void be_worker(struct work_struct *work)
{ {
struct be_adapter *adapter = struct be_adapter *adapter =
container_of(work, struct be_adapter, work.work); container_of(work, struct be_adapter, work.work);
int status;
/* Get Stats */ be_cmd_get_stats(adapter, &adapter->stats.cmd);
status = be_cmd_get_stats(adapter, &adapter->stats.cmd);
if (!status)
netdev_stats_update(adapter);
/* Set EQ delay */ /* Set EQ delay */
be_rx_eqd_update(adapter); be_rx_eqd_update(adapter);
@ -1622,11 +1618,6 @@ static int be_setup(struct be_adapter *adapter)
if (status != 0) if (status != 0)
goto do_none; goto do_none;
be_vid_config(netdev);
status = be_cmd_set_flow_control(adapter, true, true);
if (status != 0)
goto if_destroy;
status = be_tx_queues_create(adapter); status = be_tx_queues_create(adapter);
if (status != 0) if (status != 0)
@ -1640,8 +1631,17 @@ static int be_setup(struct be_adapter *adapter)
if (status != 0) if (status != 0)
goto rx_qs_destroy; goto rx_qs_destroy;
status = be_vid_config(adapter);
if (status != 0)
goto mccqs_destroy;
status = be_cmd_set_flow_control(adapter, true, true);
if (status != 0)
goto mccqs_destroy;
return 0; return 0;
mccqs_destroy:
be_mcc_queues_destroy(adapter);
rx_qs_destroy: rx_qs_destroy:
be_rx_queues_destroy(adapter); be_rx_queues_destroy(adapter);
tx_qs_destroy: tx_qs_destroy:

View file

@ -1093,15 +1093,8 @@ static struct slave *bond_find_best_slave(struct bonding *bond)
return NULL; /* still no slave, return NULL */ return NULL; /* still no slave, return NULL */
} }
/*
* first try the primary link; if arping, a link must tx/rx
* traffic before it can be considered the curr_active_slave.
* also, we would skip slaves between the curr_active_slave
* and primary_slave that may be up and able to arp
*/
if ((bond->primary_slave) && if ((bond->primary_slave) &&
(!bond->params.arp_interval) && bond->primary_slave->link == BOND_LINK_UP) {
(IS_UP(bond->primary_slave->dev))) {
new_active = bond->primary_slave; new_active = bond->primary_slave;
} }
@ -1109,15 +1102,14 @@ static struct slave *bond_find_best_slave(struct bonding *bond)
old_active = new_active; old_active = new_active;
bond_for_each_slave_from(bond, new_active, i, old_active) { bond_for_each_slave_from(bond, new_active, i, old_active) {
if (IS_UP(new_active->dev)) { if (new_active->link == BOND_LINK_UP) {
if (new_active->link == BOND_LINK_UP) { return new_active;
return new_active; } else if (new_active->link == BOND_LINK_BACK &&
} else if (new_active->link == BOND_LINK_BACK) { IS_UP(new_active->dev)) {
/* link up, but waiting for stabilization */ /* link up, but waiting for stabilization */
if (new_active->delay < mintime) { if (new_active->delay < mintime) {
mintime = new_active->delay; mintime = new_active->delay;
bestslave = new_active; bestslave = new_active;
}
} }
} }
} }
@ -1211,7 +1203,7 @@ void bond_change_active_slave(struct bonding *bond, struct slave *new_active)
write_unlock_bh(&bond->curr_slave_lock); write_unlock_bh(&bond->curr_slave_lock);
read_unlock(&bond->lock); read_unlock(&bond->lock);
netdev_bonding_change(bond->dev); netdev_bonding_change(bond->dev, NETDEV_BONDING_FAILOVER);
read_lock(&bond->lock); read_lock(&bond->lock);
write_lock_bh(&bond->curr_slave_lock); write_lock_bh(&bond->curr_slave_lock);
@ -1469,14 +1461,17 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)
*/ */
if (bond->slave_cnt == 0) { if (bond->slave_cnt == 0) {
if (bond_dev->type != slave_dev->type) { if (bond_dev->type != slave_dev->type) {
dev_close(bond_dev);
pr_debug("%s: change device type from %d to %d\n", pr_debug("%s: change device type from %d to %d\n",
bond_dev->name, bond_dev->type, slave_dev->type); bond_dev->name, bond_dev->type, slave_dev->type);
netdev_bonding_change(bond_dev, NETDEV_BONDING_OLDTYPE);
if (slave_dev->type != ARPHRD_ETHER) if (slave_dev->type != ARPHRD_ETHER)
bond_setup_by_slave(bond_dev, slave_dev); bond_setup_by_slave(bond_dev, slave_dev);
else else
ether_setup(bond_dev); ether_setup(bond_dev);
dev_open(bond_dev);
netdev_bonding_change(bond_dev, NETDEV_BONDING_NEWTYPE);
} }
} else if (bond_dev->type != slave_dev->type) { } else if (bond_dev->type != slave_dev->type) {
pr_err(DRV_NAME ": %s ether type (%d) is different " pr_err(DRV_NAME ": %s ether type (%d) is different "
@ -2929,18 +2924,6 @@ static int bond_ab_arp_inspect(struct bonding *bond, int delta_in_ticks)
} }
} }
read_lock(&bond->curr_slave_lock);
/*
* Trigger a commit if the primary option setting has changed.
*/
if (bond->primary_slave &&
(bond->primary_slave != bond->curr_active_slave) &&
(bond->primary_slave->link == BOND_LINK_UP))
commit++;
read_unlock(&bond->curr_slave_lock);
return commit; return commit;
} }
@ -2961,90 +2944,58 @@ static void bond_ab_arp_commit(struct bonding *bond, int delta_in_ticks)
continue; continue;
case BOND_LINK_UP: case BOND_LINK_UP:
write_lock_bh(&bond->curr_slave_lock); if ((!bond->curr_active_slave &&
time_before_eq(jiffies,
if (!bond->curr_active_slave && dev_trans_start(slave->dev) +
time_before_eq(jiffies, dev_trans_start(slave->dev) + delta_in_ticks)) ||
delta_in_ticks)) { bond->curr_active_slave != slave) {
slave->link = BOND_LINK_UP; slave->link = BOND_LINK_UP;
bond_change_active_slave(bond, slave);
bond->current_arp_slave = NULL; bond->current_arp_slave = NULL;
pr_info(DRV_NAME pr_info(DRV_NAME
": %s: %s is up and now the " ": %s: link status definitely "
"active interface\n", "up for interface %s.\n",
bond->dev->name, slave->dev->name); bond->dev->name, slave->dev->name);
} else if (bond->curr_active_slave != slave) { if (!bond->curr_active_slave ||
/* this slave has just come up but we (slave == bond->primary_slave))
* already have a current slave; this can goto do_failover;
* also happen if bond_enslave adds a new
* slave that is up while we are searching
* for a new slave
*/
slave->link = BOND_LINK_UP;
bond_set_slave_inactive_flags(slave);
bond->current_arp_slave = NULL;
pr_info(DRV_NAME
": %s: backup interface %s is now up\n",
bond->dev->name, slave->dev->name);
} }
write_unlock_bh(&bond->curr_slave_lock); continue;
break;
case BOND_LINK_DOWN: case BOND_LINK_DOWN:
if (slave->link_failure_count < UINT_MAX) if (slave->link_failure_count < UINT_MAX)
slave->link_failure_count++; slave->link_failure_count++;
slave->link = BOND_LINK_DOWN; slave->link = BOND_LINK_DOWN;
bond_set_slave_inactive_flags(slave);
pr_info(DRV_NAME
": %s: link status definitely down for "
"interface %s, disabling it\n",
bond->dev->name, slave->dev->name);
if (slave == bond->curr_active_slave) { if (slave == bond->curr_active_slave) {
pr_info(DRV_NAME
": %s: link status down for active "
"interface %s, disabling it\n",
bond->dev->name, slave->dev->name);
bond_set_slave_inactive_flags(slave);
write_lock_bh(&bond->curr_slave_lock);
bond_select_active_slave(bond);
if (bond->curr_active_slave)
bond->curr_active_slave->jiffies =
jiffies;
write_unlock_bh(&bond->curr_slave_lock);
bond->current_arp_slave = NULL; bond->current_arp_slave = NULL;
goto do_failover;
} else if (slave->state == BOND_STATE_BACKUP) {
pr_info(DRV_NAME
": %s: backup interface %s is now down\n",
bond->dev->name, slave->dev->name);
bond_set_slave_inactive_flags(slave);
} }
break;
continue;
default: default:
pr_err(DRV_NAME pr_err(DRV_NAME
": %s: impossible: new_link %d on slave %s\n", ": %s: impossible: new_link %d on slave %s\n",
bond->dev->name, slave->new_link, bond->dev->name, slave->new_link,
slave->dev->name); slave->dev->name);
continue;
} }
}
/* do_failover:
* No race with changes to primary via sysfs, as we hold rtnl. ASSERT_RTNL();
*/
if (bond->primary_slave &&
(bond->primary_slave != bond->curr_active_slave) &&
(bond->primary_slave->link == BOND_LINK_UP)) {
write_lock_bh(&bond->curr_slave_lock); write_lock_bh(&bond->curr_slave_lock);
bond_change_active_slave(bond, bond->primary_slave); bond_select_active_slave(bond);
write_unlock_bh(&bond->curr_slave_lock); write_unlock_bh(&bond->curr_slave_lock);
} }

View file

@ -80,7 +80,7 @@ static void vcan_rx(struct sk_buff *skb, struct net_device *dev)
skb->dev = dev; skb->dev = dev;
skb->ip_summed = CHECKSUM_UNNECESSARY; skb->ip_summed = CHECKSUM_UNNECESSARY;
netif_rx(skb); netif_rx_ni(skb);
} }
static netdev_tx_t vcan_tx(struct sk_buff *skb, struct net_device *dev) static netdev_tx_t vcan_tx(struct sk_buff *skb, struct net_device *dev)

View file

@ -49,11 +49,10 @@ static s32 igb_read_phy_reg_sgmii_82575(struct e1000_hw *, u32, u16 *);
static s32 igb_reset_hw_82575(struct e1000_hw *); static s32 igb_reset_hw_82575(struct e1000_hw *);
static s32 igb_set_d0_lplu_state_82575(struct e1000_hw *, bool); static s32 igb_set_d0_lplu_state_82575(struct e1000_hw *, bool);
static s32 igb_setup_copper_link_82575(struct e1000_hw *); static s32 igb_setup_copper_link_82575(struct e1000_hw *);
static s32 igb_setup_fiber_serdes_link_82575(struct e1000_hw *); static s32 igb_setup_serdes_link_82575(struct e1000_hw *);
static s32 igb_write_phy_reg_sgmii_82575(struct e1000_hw *, u32, u16); static s32 igb_write_phy_reg_sgmii_82575(struct e1000_hw *, u32, u16);
static void igb_clear_hw_cntrs_82575(struct e1000_hw *); static void igb_clear_hw_cntrs_82575(struct e1000_hw *);
static s32 igb_acquire_swfw_sync_82575(struct e1000_hw *, u16); static s32 igb_acquire_swfw_sync_82575(struct e1000_hw *, u16);
static void igb_configure_pcs_link_82575(struct e1000_hw *);
static s32 igb_get_pcs_speed_and_duplex_82575(struct e1000_hw *, u16 *, static s32 igb_get_pcs_speed_and_duplex_82575(struct e1000_hw *, u16 *,
u16 *); u16 *);
static s32 igb_get_phy_id_82575(struct e1000_hw *); static s32 igb_get_phy_id_82575(struct e1000_hw *);
@ -105,16 +104,20 @@ static s32 igb_get_invariants_82575(struct e1000_hw *hw)
dev_spec->sgmii_active = false; dev_spec->sgmii_active = false;
ctrl_ext = rd32(E1000_CTRL_EXT); ctrl_ext = rd32(E1000_CTRL_EXT);
if ((ctrl_ext & E1000_CTRL_EXT_LINK_MODE_MASK) == switch (ctrl_ext & E1000_CTRL_EXT_LINK_MODE_MASK) {
E1000_CTRL_EXT_LINK_MODE_PCIE_SERDES) { case E1000_CTRL_EXT_LINK_MODE_SGMII:
hw->phy.media_type = e1000_media_type_internal_serdes;
ctrl_ext |= E1000_CTRL_I2C_ENA;
} else if (ctrl_ext & E1000_CTRL_EXT_LINK_MODE_SGMII) {
dev_spec->sgmii_active = true; dev_spec->sgmii_active = true;
ctrl_ext |= E1000_CTRL_I2C_ENA; ctrl_ext |= E1000_CTRL_I2C_ENA;
} else { break;
case E1000_CTRL_EXT_LINK_MODE_PCIE_SERDES:
hw->phy.media_type = e1000_media_type_internal_serdes;
ctrl_ext |= E1000_CTRL_I2C_ENA;
break;
default:
ctrl_ext &= ~E1000_CTRL_I2C_ENA; ctrl_ext &= ~E1000_CTRL_I2C_ENA;
break;
} }
wr32(E1000_CTRL_EXT, ctrl_ext); wr32(E1000_CTRL_EXT, ctrl_ext);
/* Set mta register count */ /* Set mta register count */
@ -134,7 +137,7 @@ static s32 igb_get_invariants_82575(struct e1000_hw *hw)
mac->ops.setup_physical_interface = mac->ops.setup_physical_interface =
(hw->phy.media_type == e1000_media_type_copper) (hw->phy.media_type == e1000_media_type_copper)
? igb_setup_copper_link_82575 ? igb_setup_copper_link_82575
: igb_setup_fiber_serdes_link_82575; : igb_setup_serdes_link_82575;
/* NVM initialization */ /* NVM initialization */
eecd = rd32(E1000_EECD); eecd = rd32(E1000_EECD);
@ -379,6 +382,7 @@ static s32 igb_get_phy_id_82575(struct e1000_hw *hw)
struct e1000_phy_info *phy = &hw->phy; struct e1000_phy_info *phy = &hw->phy;
s32 ret_val = 0; s32 ret_val = 0;
u16 phy_id; u16 phy_id;
u32 ctrl_ext;
/* /*
* For SGMII PHYs, we try the list of possible addresses until * For SGMII PHYs, we try the list of possible addresses until
@ -393,6 +397,12 @@ static s32 igb_get_phy_id_82575(struct e1000_hw *hw)
goto out; goto out;
} }
/* Power on sgmii phy if it is disabled */
ctrl_ext = rd32(E1000_CTRL_EXT);
wr32(E1000_CTRL_EXT, ctrl_ext & ~E1000_CTRL_EXT_SDP3_DATA);
wrfl();
msleep(300);
/* /*
* The address field in the I2CCMD register is 3 bits and 0 is invalid. * The address field in the I2CCMD register is 3 bits and 0 is invalid.
* Therefore, we need to test 1-7 * Therefore, we need to test 1-7
@ -418,9 +428,12 @@ static s32 igb_get_phy_id_82575(struct e1000_hw *hw)
phy->addr = 0; phy->addr = 0;
ret_val = -E1000_ERR_PHY; ret_val = -E1000_ERR_PHY;
goto out; goto out;
} else {
ret_val = igb_get_phy_id(hw);
} }
ret_val = igb_get_phy_id(hw); /* restore previous sfp cage power state */
wr32(E1000_CTRL_EXT, ctrl_ext);
out: out:
return ret_val; return ret_val;
@ -766,17 +779,18 @@ static s32 igb_get_pcs_speed_and_duplex_82575(struct e1000_hw *hw, u16 *speed,
} }
/** /**
* igb_shutdown_fiber_serdes_link_82575 - Remove link during power down * igb_shutdown_serdes_link_82575 - Remove link during power down
* @hw: pointer to the HW structure * @hw: pointer to the HW structure
* *
* In the case of fiber serdes, shut down optics and PCS on driver unload * In the case of fiber serdes, shut down optics and PCS on driver unload
* when management pass thru is not enabled. * when management pass thru is not enabled.
**/ **/
void igb_shutdown_fiber_serdes_link_82575(struct e1000_hw *hw) void igb_shutdown_serdes_link_82575(struct e1000_hw *hw)
{ {
u32 reg; u32 reg;
if (hw->phy.media_type != e1000_media_type_internal_serdes) if (hw->phy.media_type != e1000_media_type_internal_serdes ||
igb_sgmii_active_82575(hw))
return; return;
/* if the management interface is not enabled, then power down */ /* if the management interface is not enabled, then power down */
@ -788,7 +802,7 @@ void igb_shutdown_fiber_serdes_link_82575(struct e1000_hw *hw)
/* shutdown the laser */ /* shutdown the laser */
reg = rd32(E1000_CTRL_EXT); reg = rd32(E1000_CTRL_EXT);
reg |= E1000_CTRL_EXT_SDP7_DATA; reg |= E1000_CTRL_EXT_SDP3_DATA;
wr32(E1000_CTRL_EXT, reg); wr32(E1000_CTRL_EXT, reg);
/* flush the write to verify completion */ /* flush the write to verify completion */
@ -927,6 +941,17 @@ static s32 igb_setup_copper_link_82575(struct e1000_hw *hw)
ctrl &= ~(E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX); ctrl &= ~(E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX);
wr32(E1000_CTRL, ctrl); wr32(E1000_CTRL, ctrl);
ret_val = igb_setup_serdes_link_82575(hw);
if (ret_val)
goto out;
if (igb_sgmii_active_82575(hw) && !hw->phy.reset_disable) {
ret_val = hw->phy.ops.reset(hw);
if (ret_val) {
hw_dbg("Error resetting the PHY.\n");
goto out;
}
}
switch (hw->phy.type) { switch (hw->phy.type) {
case e1000_phy_m88: case e1000_phy_m88:
ret_val = igb_copper_link_setup_m88(hw); ret_val = igb_copper_link_setup_m88(hw);
@ -963,8 +988,6 @@ static s32 igb_setup_copper_link_82575(struct e1000_hw *hw)
} }
} }
igb_configure_pcs_link_82575(hw);
/* /*
* Check link status. Wait up to 100 microseconds for link to become * Check link status. Wait up to 100 microseconds for link to become
* valid. * valid.
@ -987,14 +1010,18 @@ out:
} }
/** /**
* igb_setup_fiber_serdes_link_82575 - Setup link for fiber/serdes * igb_setup_serdes_link_82575 - Setup link for fiber/serdes
* @hw: pointer to the HW structure * @hw: pointer to the HW structure
* *
* Configures speed and duplex for fiber and serdes links. * Configures speed and duplex for fiber and serdes links.
**/ **/
static s32 igb_setup_fiber_serdes_link_82575(struct e1000_hw *hw) static s32 igb_setup_serdes_link_82575(struct e1000_hw *hw)
{ {
u32 reg; u32 ctrl_reg, reg;
if ((hw->phy.media_type != e1000_media_type_internal_serdes) &&
!igb_sgmii_active_82575(hw))
return 0;
/* /*
* On the 82575, SerDes loopback mode persists until it is * On the 82575, SerDes loopback mode persists until it is
@ -1004,26 +1031,38 @@ static s32 igb_setup_fiber_serdes_link_82575(struct e1000_hw *hw)
*/ */
wr32(E1000_SCTL, E1000_SCTL_DISABLE_SERDES_LOOPBACK); wr32(E1000_SCTL, E1000_SCTL_DISABLE_SERDES_LOOPBACK);
/* Force link up, set 1gb, set both sw defined pins */ /* power on the sfp cage if present */
reg = rd32(E1000_CTRL); reg = rd32(E1000_CTRL_EXT);
reg |= E1000_CTRL_SLU | reg &= ~E1000_CTRL_EXT_SDP3_DATA;
E1000_CTRL_SPD_1000 | wr32(E1000_CTRL_EXT, reg);
E1000_CTRL_FRCSPD |
E1000_CTRL_SWDPIN0 |
E1000_CTRL_SWDPIN1;
wr32(E1000_CTRL, reg);
/* Power on phy for 82576 fiber adapters */ ctrl_reg = rd32(E1000_CTRL);
if (hw->mac.type == e1000_82576) { ctrl_reg |= E1000_CTRL_SLU;
reg = rd32(E1000_CTRL_EXT);
reg &= ~E1000_CTRL_EXT_SDP7_DATA; if (hw->mac.type == e1000_82575 || hw->mac.type == e1000_82576) {
wr32(E1000_CTRL_EXT, reg); /* set both sw defined pins */
ctrl_reg |= E1000_CTRL_SWDPIN0 | E1000_CTRL_SWDPIN1;
/* Set switch control to serdes energy detect */
reg = rd32(E1000_CONNSW);
reg |= E1000_CONNSW_ENRGSRC;
wr32(E1000_CONNSW, reg);
} }
/* Set switch control to serdes energy detect */ reg = rd32(E1000_PCS_LCTL);
reg = rd32(E1000_CONNSW);
reg |= E1000_CONNSW_ENRGSRC; if (igb_sgmii_active_82575(hw)) {
wr32(E1000_CONNSW, reg); /* allow time for SFP cage to power up phy */
msleep(300);
/* AN time out should be disabled for SGMII mode */
reg &= ~(E1000_PCS_LCTL_AN_TIMEOUT);
} else {
ctrl_reg |= E1000_CTRL_SPD_1000 | E1000_CTRL_FRCSPD |
E1000_CTRL_FD | E1000_CTRL_FRCDPX;
}
wr32(E1000_CTRL, ctrl_reg);
/* /*
* New SerDes mode allows for forcing speed or autonegotiating speed * New SerDes mode allows for forcing speed or autonegotiating speed
@ -1031,12 +1070,21 @@ static s32 igb_setup_fiber_serdes_link_82575(struct e1000_hw *hw)
* mode that will be compatible with older link partners and switches. * mode that will be compatible with older link partners and switches.
* However, both are supported by the hardware and some drivers/tools. * However, both are supported by the hardware and some drivers/tools.
*/ */
reg = rd32(E1000_PCS_LCTL);
reg &= ~(E1000_PCS_LCTL_AN_ENABLE | E1000_PCS_LCTL_FLV_LINK_UP | reg &= ~(E1000_PCS_LCTL_AN_ENABLE | E1000_PCS_LCTL_FLV_LINK_UP |
E1000_PCS_LCTL_FSD | E1000_PCS_LCTL_FORCE_LINK); E1000_PCS_LCTL_FSD | E1000_PCS_LCTL_FORCE_LINK);
if (hw->mac.autoneg) { /*
* We force flow control to prevent the CTRL register values from being
* overwritten by the autonegotiated flow control values
*/
reg |= E1000_PCS_LCTL_FORCE_FCTRL;
/*
* we always set sgmii to autoneg since it is the phy that will be
* forcing the link and the serdes is just a go-between
*/
if (hw->mac.autoneg || igb_sgmii_active_82575(hw)) {
/* Set PCS register for autoneg */ /* Set PCS register for autoneg */
reg |= E1000_PCS_LCTL_FSV_1000 | /* Force 1000 */ reg |= E1000_PCS_LCTL_FSV_1000 | /* Force 1000 */
E1000_PCS_LCTL_FDV_FULL | /* SerDes Full duplex */ E1000_PCS_LCTL_FDV_FULL | /* SerDes Full duplex */
@ -1053,77 +1101,14 @@ static s32 igb_setup_fiber_serdes_link_82575(struct e1000_hw *hw)
hw_dbg("Configuring Forced Link; PCS_LCTL = 0x%08X\n", reg); hw_dbg("Configuring Forced Link; PCS_LCTL = 0x%08X\n", reg);
} }
if (hw->mac.type == e1000_82576) {
reg |= E1000_PCS_LCTL_FORCE_FCTRL;
igb_force_mac_fc(hw);
}
wr32(E1000_PCS_LCTL, reg); wr32(E1000_PCS_LCTL, reg);
if (!igb_sgmii_active_82575(hw))
igb_force_mac_fc(hw);
return 0; return 0;
} }
/**
* igb_configure_pcs_link_82575 - Configure PCS link
* @hw: pointer to the HW structure
*
* Configure the physical coding sub-layer (PCS) link. The PCS link is
* only used on copper connections where the serialized gigabit media
* independent interface (sgmii) is being used. Configures the link
* for auto-negotiation or forces speed/duplex.
**/
static void igb_configure_pcs_link_82575(struct e1000_hw *hw)
{
struct e1000_mac_info *mac = &hw->mac;
u32 reg = 0;
if (hw->phy.media_type != e1000_media_type_copper ||
!(igb_sgmii_active_82575(hw)))
return;
/* For SGMII, we need to issue a PCS autoneg restart */
reg = rd32(E1000_PCS_LCTL);
/* AN time out should be disabled for SGMII mode */
reg &= ~(E1000_PCS_LCTL_AN_TIMEOUT);
if (mac->autoneg) {
/* Make sure forced speed and force link are not set */
reg &= ~(E1000_PCS_LCTL_FSD | E1000_PCS_LCTL_FORCE_LINK);
/*
* The PHY should be setup prior to calling this function.
* All we need to do is restart autoneg and enable autoneg.
*/
reg |= E1000_PCS_LCTL_AN_RESTART | E1000_PCS_LCTL_AN_ENABLE;
} else {
/* Set PCS register for forced speed */
/* Turn off bits for full duplex, speed, and autoneg */
reg &= ~(E1000_PCS_LCTL_FSV_1000 |
E1000_PCS_LCTL_FSV_100 |
E1000_PCS_LCTL_FDV_FULL |
E1000_PCS_LCTL_AN_ENABLE);
/* Check for duplex first */
if (mac->forced_speed_duplex & E1000_ALL_FULL_DUPLEX)
reg |= E1000_PCS_LCTL_FDV_FULL;
/* Now set speed */
if (mac->forced_speed_duplex & E1000_ALL_100_SPEED)
reg |= E1000_PCS_LCTL_FSV_100;
/* Force speed and force link */
reg |= E1000_PCS_LCTL_FSD |
E1000_PCS_LCTL_FORCE_LINK |
E1000_PCS_LCTL_FLV_LINK_UP;
hw_dbg("Wrote 0x%08X to PCS_LCTL to configure forced link\n",
reg);
}
wr32(E1000_PCS_LCTL, reg);
}
/** /**
* igb_sgmii_active_82575 - Return sgmii state * igb_sgmii_active_82575 - Return sgmii state
* @hw: pointer to the HW structure * @hw: pointer to the HW structure
@ -1248,7 +1233,8 @@ static void igb_clear_hw_cntrs_82575(struct e1000_hw *hw)
temp = rd32(E1000_LENERRS); temp = rd32(E1000_LENERRS);
/* This register should not be read in copper configurations */ /* This register should not be read in copper configurations */
if (hw->phy.media_type == e1000_media_type_internal_serdes) if (hw->phy.media_type == e1000_media_type_internal_serdes ||
igb_sgmii_active_82575(hw))
temp = rd32(E1000_SCVPC); temp = rd32(E1000_SCVPC);
} }

View file

@ -28,7 +28,7 @@
#ifndef _E1000_82575_H_ #ifndef _E1000_82575_H_
#define _E1000_82575_H_ #define _E1000_82575_H_
extern void igb_shutdown_fiber_serdes_link_82575(struct e1000_hw *hw); extern void igb_shutdown_serdes_link_82575(struct e1000_hw *hw);
extern void igb_rx_fifo_flush_82575(struct e1000_hw *hw); extern void igb_rx_fifo_flush_82575(struct e1000_hw *hw);
#define ID_LED_DEFAULT_82575_SERDES ((ID_LED_DEF1_DEF2 << 12) | \ #define ID_LED_DEFAULT_82575_SERDES ((ID_LED_DEF1_DEF2 << 12) | \

View file

@ -44,7 +44,7 @@
#define E1000_WUFC_BC 0x00000010 /* Broadcast Wakeup Enable */ #define E1000_WUFC_BC 0x00000010 /* Broadcast Wakeup Enable */
/* Extended Device Control */ /* Extended Device Control */
#define E1000_CTRL_EXT_SDP7_DATA 0x00000080 /* Value of SW Defineable Pin 7 */ #define E1000_CTRL_EXT_SDP3_DATA 0x00000080 /* Value of SW Defineable Pin 3 */
/* Physical Func Reset Done Indication */ /* Physical Func Reset Done Indication */
#define E1000_CTRL_EXT_PFRSTD 0x00004000 #define E1000_CTRL_EXT_PFRSTD 0x00004000
#define E1000_CTRL_EXT_LINK_MODE_MASK 0x00C00000 #define E1000_CTRL_EXT_LINK_MODE_MASK 0x00C00000

View file

@ -1565,9 +1565,12 @@ out:
**/ **/
s32 igb_phy_sw_reset(struct e1000_hw *hw) s32 igb_phy_sw_reset(struct e1000_hw *hw)
{ {
s32 ret_val; s32 ret_val = 0;
u16 phy_ctrl; u16 phy_ctrl;
if (!(hw->phy.ops.read_reg))
goto out;
ret_val = hw->phy.ops.read_reg(hw, PHY_CONTROL, &phy_ctrl); ret_val = hw->phy.ops.read_reg(hw, PHY_CONTROL, &phy_ctrl);
if (ret_val) if (ret_val)
goto out; goto out;

View file

@ -5320,7 +5320,7 @@ static int __igb_shutdown(struct pci_dev *pdev, bool *enable_wake)
*enable_wake = wufc || adapter->en_mng_pt; *enable_wake = wufc || adapter->en_mng_pt;
if (!*enable_wake) if (!*enable_wake)
igb_shutdown_fiber_serdes_link_82575(hw); igb_shutdown_serdes_link_82575(hw);
/* Release control of h/w to f/w. If f/w is AMT enabled, this /* Release control of h/w to f/w. If f/w is AMT enabled, this
* would have already happened in close and is redundant. */ * would have already happened in close and is redundant. */

View file

@ -322,14 +322,16 @@ static enum ixgbe_media_type ixgbe_get_media_type_82598(struct ixgbe_hw *hw)
break; break;
case IXGBE_DEV_ID_82598AF_DUAL_PORT: case IXGBE_DEV_ID_82598AF_DUAL_PORT:
case IXGBE_DEV_ID_82598AF_SINGLE_PORT: case IXGBE_DEV_ID_82598AF_SINGLE_PORT:
case IXGBE_DEV_ID_82598EB_CX4:
case IXGBE_DEV_ID_82598_CX4_DUAL_PORT:
case IXGBE_DEV_ID_82598_DA_DUAL_PORT: case IXGBE_DEV_ID_82598_DA_DUAL_PORT:
case IXGBE_DEV_ID_82598_SR_DUAL_PORT_EM: case IXGBE_DEV_ID_82598_SR_DUAL_PORT_EM:
case IXGBE_DEV_ID_82598EB_XF_LR: case IXGBE_DEV_ID_82598EB_XF_LR:
case IXGBE_DEV_ID_82598EB_SFP_LOM: case IXGBE_DEV_ID_82598EB_SFP_LOM:
media_type = ixgbe_media_type_fiber; media_type = ixgbe_media_type_fiber;
break; break;
case IXGBE_DEV_ID_82598EB_CX4:
case IXGBE_DEV_ID_82598_CX4_DUAL_PORT:
media_type = ixgbe_media_type_cx4;
break;
case IXGBE_DEV_ID_82598AT: case IXGBE_DEV_ID_82598AT:
case IXGBE_DEV_ID_82598AT2: case IXGBE_DEV_ID_82598AT2:
media_type = ixgbe_media_type_copper; media_type = ixgbe_media_type_copper;

View file

@ -337,6 +337,9 @@ static enum ixgbe_media_type ixgbe_get_media_type_82599(struct ixgbe_hw *hw)
case IXGBE_DEV_ID_82599_SFP: case IXGBE_DEV_ID_82599_SFP:
media_type = ixgbe_media_type_fiber; media_type = ixgbe_media_type_fiber;
break; break;
case IXGBE_DEV_ID_82599_CX4:
media_type = ixgbe_media_type_cx4;
break;
default: default:
media_type = ixgbe_media_type_unknown; media_type = ixgbe_media_type_unknown;
break; break;

View file

@ -97,6 +97,8 @@ static struct pci_device_id ixgbe_pci_tbl[] = {
board_82599 }, board_82599 },
{PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599_SFP), {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599_SFP),
board_82599 }, board_82599 },
{PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599_CX4),
board_82599 },
/* required last entry */ /* required last entry */
{0, } {0, }
@ -2055,6 +2057,8 @@ static void ixgbe_configure_rx(struct ixgbe_adapter *adapter)
if (adapter->flags & IXGBE_FLAG_RX_PS_ENABLED) if (adapter->flags & IXGBE_FLAG_RX_PS_ENABLED)
rx_ring->flags |= IXGBE_RING_RX_PS_ENABLED; rx_ring->flags |= IXGBE_RING_RX_PS_ENABLED;
else
rx_ring->flags &= ~IXGBE_RING_RX_PS_ENABLED;
#ifdef IXGBE_FCOE #ifdef IXGBE_FCOE
if (netdev->features & NETIF_F_FCOE_MTU) { if (netdev->features & NETIF_F_FCOE_MTU) {

View file

@ -49,6 +49,7 @@
#define IXGBE_DEV_ID_82598_SR_DUAL_PORT_EM 0x10E1 #define IXGBE_DEV_ID_82598_SR_DUAL_PORT_EM 0x10E1
#define IXGBE_DEV_ID_82598EB_XF_LR 0x10F4 #define IXGBE_DEV_ID_82598EB_XF_LR 0x10F4
#define IXGBE_DEV_ID_82599_KX4 0x10F7 #define IXGBE_DEV_ID_82599_KX4 0x10F7
#define IXGBE_DEV_ID_82599_CX4 0x10F9
#define IXGBE_DEV_ID_82599_SFP 0x10FB #define IXGBE_DEV_ID_82599_SFP 0x10FB
#define IXGBE_DEV_ID_82599_XAUI_LOM 0x10FC #define IXGBE_DEV_ID_82599_XAUI_LOM 0x10FC
@ -2143,6 +2144,7 @@ enum ixgbe_media_type {
ixgbe_media_type_fiber, ixgbe_media_type_fiber,
ixgbe_media_type_copper, ixgbe_media_type_copper,
ixgbe_media_type_backplane, ixgbe_media_type_backplane,
ixgbe_media_type_cx4,
ixgbe_media_type_virtual ixgbe_media_type_virtual
}; };

View file

@ -96,12 +96,17 @@ static void catas_reset(struct work_struct *work)
spin_unlock_irq(&catas_lock); spin_unlock_irq(&catas_lock);
list_for_each_entry_safe(priv, tmppriv, &tlist, catas_err.list) { list_for_each_entry_safe(priv, tmppriv, &tlist, catas_err.list) {
struct pci_dev *pdev = priv->dev.pdev;
ret = mlx4_restart_one(priv->dev.pdev); ret = mlx4_restart_one(priv->dev.pdev);
dev = &priv->dev; /* 'priv' now is not valid */
if (ret) if (ret)
mlx4_err(dev, "Reset failed (%d)\n", ret); printk(KERN_ERR "mlx4 %s: Reset failed (%d)\n",
else pci_name(pdev), ret);
else {
dev = pci_get_drvdata(pdev);
mlx4_dbg(dev, "Reset succeeded\n"); mlx4_dbg(dev, "Reset succeeded\n");
}
} }
} }

View file

@ -1750,11 +1750,11 @@ static struct pcmcia_device_id pcnet_ids[] = {
PCMCIA_DEVICE_PROD_ID2("EN-6200P2", 0xa996d078), PCMCIA_DEVICE_PROD_ID2("EN-6200P2", 0xa996d078),
/* too generic! */ /* too generic! */
/* PCMCIA_DEVICE_PROD_ID12("PCMCIA", "10/100 Ethernet Card", 0x281f1c5d, 0x11b0ffc0), */ /* PCMCIA_DEVICE_PROD_ID12("PCMCIA", "10/100 Ethernet Card", 0x281f1c5d, 0x11b0ffc0), */
PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "PCMCIA", "EN2218-LAN/MODEM", 0x281f1c5d, 0x570f348e, "PCMLM28.cis"), PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "PCMCIA", "EN2218-LAN/MODEM", 0x281f1c5d, 0x570f348e, "cis/PCMLM28.cis"),
PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "PCMCIA", "UE2218-LAN/MODEM", 0x281f1c5d, 0x6fdcacee, "PCMLM28.cis"), PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "PCMCIA", "UE2218-LAN/MODEM", 0x281f1c5d, 0x6fdcacee, "cis/PCMLM28.cis"),
PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "Psion Dacom", "Gold Card V34 Ethernet", 0xf5f025c2, 0x338e8155, "PCMLM28.cis"), PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "Psion Dacom", "Gold Card V34 Ethernet", 0xf5f025c2, 0x338e8155, "cis/PCMLM28.cis"),
PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "Psion Dacom", "Gold Card V34 Ethernet GSM", 0xf5f025c2, 0x4ae85d35, "PCMLM28.cis"), PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "Psion Dacom", "Gold Card V34 Ethernet GSM", 0xf5f025c2, 0x4ae85d35, "cis/PCMLM28.cis"),
PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "LINKSYS", "PCMLM28", 0xf7cb0b07, 0x66881874, "PCMLM28.cis"), PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "LINKSYS", "PCMLM28", 0xf7cb0b07, 0x66881874, "cis/PCMLM28.cis"),
PCMCIA_MFC_DEVICE_CIS_PROD_ID12(0, "DAYNA COMMUNICATIONS", "LAN AND MODEM MULTIFUNCTION", 0x8fdf8f89, 0xdd5ed9e8, "DP83903.cis"), PCMCIA_MFC_DEVICE_CIS_PROD_ID12(0, "DAYNA COMMUNICATIONS", "LAN AND MODEM MULTIFUNCTION", 0x8fdf8f89, 0xdd5ed9e8, "DP83903.cis"),
PCMCIA_MFC_DEVICE_CIS_PROD_ID4(0, "NSC MF LAN/Modem", 0x58fc6056, "DP83903.cis"), PCMCIA_MFC_DEVICE_CIS_PROD_ID4(0, "NSC MF LAN/Modem", 0x58fc6056, "DP83903.cis"),
PCMCIA_MFC_DEVICE_CIS_MANF_CARD(0, 0x0175, 0x0000, "DP83903.cis"), PCMCIA_MFC_DEVICE_CIS_MANF_CARD(0, 0x0175, 0x0000, "DP83903.cis"),

View file

@ -229,7 +229,7 @@ static void pppol2tp_tunnel_free(struct pppol2tp_tunnel *tunnel);
static atomic_t pppol2tp_tunnel_count; static atomic_t pppol2tp_tunnel_count;
static atomic_t pppol2tp_session_count; static atomic_t pppol2tp_session_count;
static struct ppp_channel_ops pppol2tp_chan_ops = { pppol2tp_xmit , NULL }; static struct ppp_channel_ops pppol2tp_chan_ops = { pppol2tp_xmit , NULL };
static struct proto_ops pppol2tp_ops; static const struct proto_ops pppol2tp_ops;
/* per-net private data for this module */ /* per-net private data for this module */
static int pppol2tp_net_id; static int pppol2tp_net_id;
@ -2574,7 +2574,7 @@ static const struct file_operations pppol2tp_proc_fops = {
* Init and cleanup * Init and cleanup
*****************************************************************************/ *****************************************************************************/
static struct proto_ops pppol2tp_ops = { static const struct proto_ops pppol2tp_ops = {
.family = AF_PPPOX, .family = AF_PPPOX,
.owner = THIS_MODULE, .owner = THIS_MODULE,
.release = pppol2tp_release, .release = pppol2tp_release,

View file

@ -65,8 +65,8 @@
#define RX_DEF_PENDING RX_MAX_PENDING #define RX_DEF_PENDING RX_MAX_PENDING
/* This is the worst case number of transmit list elements for a single skb: /* This is the worst case number of transmit list elements for a single skb:
VLAN + TSO + CKSUM + Data + skb_frags * DMA */ VLAN:GSO + CKSUM + Data + skb_frags * DMA */
#define MAX_SKB_TX_LE (4 + (sizeof(dma_addr_t)/sizeof(u32))*MAX_SKB_FRAGS) #define MAX_SKB_TX_LE (2 + (sizeof(dma_addr_t)/sizeof(u32))*(MAX_SKB_FRAGS+1))
#define TX_MIN_PENDING (MAX_SKB_TX_LE+1) #define TX_MIN_PENDING (MAX_SKB_TX_LE+1)
#define TX_MAX_PENDING 4096 #define TX_MAX_PENDING 4096
#define TX_DEF_PENDING 127 #define TX_DEF_PENDING 127
@ -1567,11 +1567,13 @@ static unsigned tx_le_req(const struct sk_buff *skb)
{ {
unsigned count; unsigned count;
count = sizeof(dma_addr_t) / sizeof(u32); count = (skb_shinfo(skb)->nr_frags + 1)
count += skb_shinfo(skb)->nr_frags * count; * (sizeof(dma_addr_t) / sizeof(u32));
if (skb_is_gso(skb)) if (skb_is_gso(skb))
++count; ++count;
else if (sizeof(dma_addr_t) == sizeof(u32))
++count; /* possible vlan */
if (skb->ip_summed == CHECKSUM_PARTIAL) if (skb->ip_summed == CHECKSUM_PARTIAL)
++count; ++count;
@ -4548,16 +4550,18 @@ static int __devinit sky2_probe(struct pci_dev *pdev,
if (hw->ports > 1) { if (hw->ports > 1) {
struct net_device *dev1; struct net_device *dev1;
err = -ENOMEM;
dev1 = sky2_init_netdev(hw, 1, using_dac, wol_default); dev1 = sky2_init_netdev(hw, 1, using_dac, wol_default);
if (!dev1) if (dev1 && (err = register_netdev(dev1)) == 0)
dev_warn(&pdev->dev, "allocation for second device failed\n"); sky2_show_addr(dev1);
else if ((err = register_netdev(dev1))) { else {
dev_warn(&pdev->dev, dev_warn(&pdev->dev,
"register of second port failed (%d)\n", err); "register of second port failed (%d)\n", err);
hw->dev[1] = NULL; hw->dev[1] = NULL;
free_netdev(dev1); hw->ports = 1;
} else if (dev1)
sky2_show_addr(dev1); free_netdev(dev1);
}
} }
setup_timer(&hw->watchdog_timer, sky2_watchdog, (unsigned long) hw); setup_timer(&hw->watchdog_timer, sky2_watchdog, (unsigned long) hw);

View file

@ -83,34 +83,6 @@ static inline void SMC_outw(u16 val, void __iomem *ioaddr, int reg)
} }
} }
#elif defined(CONFIG_BLACKFIN)
#define SMC_IRQ_FLAGS IRQF_TRIGGER_HIGH
#define RPC_LSA_DEFAULT RPC_LED_100_10
#define RPC_LSB_DEFAULT RPC_LED_TX_RX
#define SMC_CAN_USE_8BIT 0
#define SMC_CAN_USE_16BIT 1
# if defined(CONFIG_BF561)
#define SMC_CAN_USE_32BIT 1
# else
#define SMC_CAN_USE_32BIT 0
# endif
#define SMC_IO_SHIFT 0
#define SMC_NOWAIT 1
#define SMC_USE_BFIN_DMA 0
#define SMC_inw(a, r) readw((a) + (r))
#define SMC_outw(v, a, r) writew(v, (a) + (r))
#define SMC_insw(a, r, p, l) readsw((a) + (r), p, l)
#define SMC_outsw(a, r, p, l) writesw((a) + (r), p, l)
# if SMC_CAN_USE_32BIT
#define SMC_inl(a, r) readl((a) + (r))
#define SMC_outl(v, a, r) writel(v, (a) + (r))
#define SMC_insl(a, r, p, l) readsl((a) + (r), p, l)
#define SMC_outsl(a, r, p, l) writesl((a) + (r), p, l)
# endif
#elif defined(CONFIG_REDWOOD_5) || defined(CONFIG_REDWOOD_6) #elif defined(CONFIG_REDWOOD_5) || defined(CONFIG_REDWOOD_6)
/* We can only do 16-bit reads and writes in the static memory space. */ /* We can only do 16-bit reads and writes in the static memory space. */

View file

@ -264,7 +264,6 @@ static int usbpn_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
switch (cmd) { switch (cmd) {
case SIOCPNGAUTOCONF: case SIOCPNGAUTOCONF:
req->ifr_phonet_autoconf.device = PN_DEV_PC; req->ifr_phonet_autoconf.device = PN_DEV_PC;
printk(KERN_CRIT"device is PN_DEV_PC\n");
return 0; return 0;
} }
return -ENOIOCTLCMD; return -ENOIOCTLCMD;

View file

@ -5,6 +5,7 @@
menuconfig WLAN menuconfig WLAN
bool "Wireless LAN" bool "Wireless LAN"
depends on !S390 depends on !S390
default y
---help--- ---help---
This section contains all the pre 802.11 and 802.11 wireless This section contains all the pre 802.11 and 802.11 wireless
device drivers. For a complete list of drivers and documentation device drivers. For a complete list of drivers and documentation

View file

@ -327,7 +327,8 @@ static void ath9k_hw_ani_ofdm_err_trigger(struct ath_hw *ah)
aniState->firstepLevel + 1); aniState->firstepLevel + 1);
return; return;
} else { } else {
if (conf->channel->band == IEEE80211_BAND_2GHZ) { if ((conf->channel->band == IEEE80211_BAND_2GHZ) &&
!conf_is_ht(conf)) {
if (!aniState->ofdmWeakSigDetectOff) if (!aniState->ofdmWeakSigDetectOff)
ath9k_hw_ani_control(ah, ath9k_hw_ani_control(ah,
ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION, ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION,
@ -369,7 +370,8 @@ static void ath9k_hw_ani_cck_err_trigger(struct ath_hw *ah)
ath9k_hw_ani_control(ah, ATH9K_ANI_FIRSTEP_LEVEL, ath9k_hw_ani_control(ah, ATH9K_ANI_FIRSTEP_LEVEL,
aniState->firstepLevel + 1); aniState->firstepLevel + 1);
} else { } else {
if (conf->channel->band == IEEE80211_BAND_2GHZ) { if ((conf->channel->band == IEEE80211_BAND_2GHZ) &&
!conf_is_ht(conf)) {
if (aniState->firstepLevel > 0) if (aniState->firstepLevel > 0)
ath9k_hw_ani_control(ah, ath9k_hw_ani_control(ah,
ATH9K_ANI_FIRSTEP_LEVEL, 0); ATH9K_ANI_FIRSTEP_LEVEL, 0);

View file

@ -2289,11 +2289,7 @@ static int b43_upload_microcode(struct b43_wldev *dev)
err = -ENODEV; err = -ENODEV;
goto error; goto error;
} }
msleep_interruptible(50); msleep(50);
if (signal_pending(current)) {
err = -EINTR;
goto error;
}
} }
b43_read32(dev, B43_MMIO_GEN_IRQ_REASON); /* dummy read */ b43_read32(dev, B43_MMIO_GEN_IRQ_REASON); /* dummy read */
@ -4287,6 +4283,8 @@ static int b43_wireless_core_init(struct b43_wldev *dev)
if (!dev->suspend_in_progress) if (!dev->suspend_in_progress)
b43_rng_init(wl); b43_rng_init(wl);
ieee80211_wake_queues(dev->wl->hw);
b43_set_status(dev, B43_STAT_INITIALIZED); b43_set_status(dev, B43_STAT_INITIALIZED);
if (!dev->suspend_in_progress) if (!dev->suspend_in_progress)

View file

@ -875,15 +875,16 @@ void hostap_setup_dev(struct net_device *dev, local_info_t *local,
switch(type) { switch(type) {
case HOSTAP_INTERFACE_AP: case HOSTAP_INTERFACE_AP:
dev->tx_queue_len = 0; /* use main radio device queue */
dev->netdev_ops = &hostap_mgmt_netdev_ops; dev->netdev_ops = &hostap_mgmt_netdev_ops;
dev->type = ARPHRD_IEEE80211; dev->type = ARPHRD_IEEE80211;
dev->header_ops = &hostap_80211_ops; dev->header_ops = &hostap_80211_ops;
break; break;
case HOSTAP_INTERFACE_MASTER: case HOSTAP_INTERFACE_MASTER:
dev->tx_queue_len = 0; /* use main radio device queue */
dev->netdev_ops = &hostap_master_ops; dev->netdev_ops = &hostap_master_ops;
break; break;
default: default:
dev->tx_queue_len = 0; /* use main radio device queue */
dev->netdev_ops = &hostap_netdev_ops; dev->netdev_ops = &hostap_netdev_ops;
} }

View file

@ -2346,6 +2346,7 @@ struct iwl_cfg iwl4965_agn_cfg = {
.mod_params = &iwl4965_mod_params, .mod_params = &iwl4965_mod_params,
.use_isr_legacy = true, .use_isr_legacy = true,
.ht_greenfield_support = false, .ht_greenfield_support = false,
.broken_powersave = true,
}; };
/* Module firmware */ /* Module firmware */

View file

@ -760,6 +760,7 @@ static u32 rs_get_lower_rate(struct iwl_lq_sta *lq_sta,
u16 high_low; u16 high_low;
u8 switch_to_legacy = 0; u8 switch_to_legacy = 0;
u8 is_green = lq_sta->is_green; u8 is_green = lq_sta->is_green;
struct iwl_priv *priv = lq_sta->drv;
/* check if we need to switch from HT to legacy rates. /* check if we need to switch from HT to legacy rates.
* assumption is that mandatory rates (1Mbps or 6Mbps) * assumption is that mandatory rates (1Mbps or 6Mbps)
@ -773,7 +774,8 @@ static u32 rs_get_lower_rate(struct iwl_lq_sta *lq_sta,
tbl->lq_type = LQ_G; tbl->lq_type = LQ_G;
if (num_of_ant(tbl->ant_type) > 1) if (num_of_ant(tbl->ant_type) > 1)
tbl->ant_type = ANT_A;/*FIXME:RS*/ tbl->ant_type =
first_antenna(priv->hw_params.valid_tx_ant);
tbl->is_ht40 = 0; tbl->is_ht40 = 0;
tbl->is_SGI = 0; tbl->is_SGI = 0;
@ -883,6 +885,12 @@ static void rs_tx_status(void *priv_r, struct ieee80211_supported_band *sband,
mac_index &= RATE_MCS_CODE_MSK; /* Remove # of streams */ mac_index &= RATE_MCS_CODE_MSK; /* Remove # of streams */
if (mac_index >= (IWL_RATE_9M_INDEX - IWL_FIRST_OFDM_RATE)) if (mac_index >= (IWL_RATE_9M_INDEX - IWL_FIRST_OFDM_RATE))
mac_index++; mac_index++;
/*
* mac80211 HT index is always zero-indexed; we need to move
* HT OFDM rates after CCK rates in 2.4 GHz band
*/
if (priv->band == IEEE80211_BAND_2GHZ)
mac_index += IWL_FIRST_OFDM_RATE;
} }
if ((mac_index < 0) || if ((mac_index < 0) ||

View file

@ -1585,9 +1585,12 @@ int iwl_setup_mac(struct iwl_priv *priv)
hw->flags = IEEE80211_HW_SIGNAL_DBM | hw->flags = IEEE80211_HW_SIGNAL_DBM |
IEEE80211_HW_NOISE_DBM | IEEE80211_HW_NOISE_DBM |
IEEE80211_HW_AMPDU_AGGREGATION | IEEE80211_HW_AMPDU_AGGREGATION |
IEEE80211_HW_SPECTRUM_MGMT | IEEE80211_HW_SPECTRUM_MGMT;
IEEE80211_HW_SUPPORTS_PS |
IEEE80211_HW_SUPPORTS_DYNAMIC_PS; if (!priv->cfg->broken_powersave)
hw->flags |= IEEE80211_HW_SUPPORTS_PS |
IEEE80211_HW_SUPPORTS_DYNAMIC_PS;
hw->wiphy->interface_modes = hw->wiphy->interface_modes =
BIT(NL80211_IFTYPE_STATION) | BIT(NL80211_IFTYPE_STATION) |
BIT(NL80211_IFTYPE_ADHOC); BIT(NL80211_IFTYPE_ADHOC);

View file

@ -252,6 +252,7 @@ struct iwl_cfg {
const u16 max_ll_items; const u16 max_ll_items;
const bool shadow_ram_support; const bool shadow_ram_support;
const bool ht_greenfield_support; const bool ht_greenfield_support;
const bool broken_powersave;
}; };
/*************************** /***************************

View file

@ -292,8 +292,9 @@ int iwl_power_update_mode(struct iwl_priv *priv, bool force)
else else
dtimper = 1; dtimper = 1;
/* TT power setting overwrites everything */ if (priv->cfg->broken_powersave)
if (tt->state >= IWL_TI_1) iwl_power_sleep_cam_cmd(priv, &cmd);
else if (tt->state >= IWL_TI_1)
iwl_static_sleep_cmd(priv, &cmd, tt->tt_power_mode, dtimper); iwl_static_sleep_cmd(priv, &cmd, tt->tt_power_mode, dtimper);
else if (!enabled) else if (!enabled)
iwl_power_sleep_cam_cmd(priv, &cmd); iwl_power_sleep_cam_cmd(priv, &cmd);

View file

@ -239,13 +239,34 @@ void iwl_rx_allocate(struct iwl_priv *priv, gfp_t priority)
struct iwl_rx_queue *rxq = &priv->rxq; struct iwl_rx_queue *rxq = &priv->rxq;
struct list_head *element; struct list_head *element;
struct iwl_rx_mem_buffer *rxb; struct iwl_rx_mem_buffer *rxb;
struct sk_buff *skb;
unsigned long flags; unsigned long flags;
while (1) { while (1) {
spin_lock_irqsave(&rxq->lock, flags);
if (list_empty(&rxq->rx_used)) {
spin_unlock_irqrestore(&rxq->lock, flags);
return;
}
spin_unlock_irqrestore(&rxq->lock, flags);
/* Alloc a new receive buffer */
skb = alloc_skb(priv->hw_params.rx_buf_size + 256,
priority);
if (!skb) {
IWL_CRIT(priv, "Can not allocate SKB buffers\n");
/* We don't reschedule replenish work here -- we will
* call the restock method and if it still needs
* more buffers it will schedule replenish */
break;
}
spin_lock_irqsave(&rxq->lock, flags); spin_lock_irqsave(&rxq->lock, flags);
if (list_empty(&rxq->rx_used)) { if (list_empty(&rxq->rx_used)) {
spin_unlock_irqrestore(&rxq->lock, flags); spin_unlock_irqrestore(&rxq->lock, flags);
dev_kfree_skb_any(skb);
return; return;
} }
element = rxq->rx_used.next; element = rxq->rx_used.next;
@ -254,18 +275,7 @@ void iwl_rx_allocate(struct iwl_priv *priv, gfp_t priority)
spin_unlock_irqrestore(&rxq->lock, flags); spin_unlock_irqrestore(&rxq->lock, flags);
/* Alloc a new receive buffer */ rxb->skb = skb;
rxb->skb = alloc_skb(priv->hw_params.rx_buf_size + 256,
priority);
if (!rxb->skb) {
IWL_CRIT(priv, "Can not allocate SKB buffers\n");
/* We don't reschedule replenish work here -- we will
* call the restock method and if it still needs
* more buffers it will schedule replenish */
break;
}
/* Get physical address of RB/SKB */ /* Get physical address of RB/SKB */
rxb->real_dma_addr = pci_map_single( rxb->real_dma_addr = pci_map_single(
priv->pci_dev, priv->pci_dev,

View file

@ -1134,6 +1134,7 @@ static void iwl3945_rx_allocate(struct iwl_priv *priv, gfp_t priority)
struct iwl_rx_queue *rxq = &priv->rxq; struct iwl_rx_queue *rxq = &priv->rxq;
struct list_head *element; struct list_head *element;
struct iwl_rx_mem_buffer *rxb; struct iwl_rx_mem_buffer *rxb;
struct sk_buff *skb;
unsigned long flags; unsigned long flags;
while (1) { while (1) {
@ -1143,17 +1144,11 @@ static void iwl3945_rx_allocate(struct iwl_priv *priv, gfp_t priority)
spin_unlock_irqrestore(&rxq->lock, flags); spin_unlock_irqrestore(&rxq->lock, flags);
return; return;
} }
element = rxq->rx_used.next;
rxb = list_entry(element, struct iwl_rx_mem_buffer, list);
list_del(element);
spin_unlock_irqrestore(&rxq->lock, flags); spin_unlock_irqrestore(&rxq->lock, flags);
/* Alloc a new receive buffer */ /* Alloc a new receive buffer */
rxb->skb = skb = alloc_skb(priv->hw_params.rx_buf_size, priority);
alloc_skb(priv->hw_params.rx_buf_size, if (!skb) {
priority);
if (!rxb->skb) {
if (net_ratelimit()) if (net_ratelimit())
IWL_CRIT(priv, ": Can not allocate SKB buffers\n"); IWL_CRIT(priv, ": Can not allocate SKB buffers\n");
/* We don't reschedule replenish work here -- we will /* We don't reschedule replenish work here -- we will
@ -1162,6 +1157,19 @@ static void iwl3945_rx_allocate(struct iwl_priv *priv, gfp_t priority)
break; break;
} }
spin_lock_irqsave(&rxq->lock, flags);
if (list_empty(&rxq->rx_used)) {
spin_unlock_irqrestore(&rxq->lock, flags);
dev_kfree_skb_any(skb);
return;
}
element = rxq->rx_used.next;
rxb = list_entry(element, struct iwl_rx_mem_buffer, list);
list_del(element);
spin_unlock_irqrestore(&rxq->lock, flags);
rxb->skb = skb;
/* If radiotap head is required, reserve some headroom here. /* If radiotap head is required, reserve some headroom here.
* The physical head count is a variable rx_stats->phy_count. * The physical head count is a variable rx_stats->phy_count.
* We reserve 4 bytes here. Plus these extra bytes, the * We reserve 4 bytes here. Plus these extra bytes, the

View file

@ -67,6 +67,7 @@ static struct usb_device_id p54u_table[] __devinitdata = {
{USB_DEVICE(0x0bf8, 0x1009)}, /* FUJITSU E-5400 USB D1700*/ {USB_DEVICE(0x0bf8, 0x1009)}, /* FUJITSU E-5400 USB D1700*/
{USB_DEVICE(0x0cde, 0x0006)}, /* Medion MD40900 */ {USB_DEVICE(0x0cde, 0x0006)}, /* Medion MD40900 */
{USB_DEVICE(0x0cde, 0x0008)}, /* Sagem XG703A */ {USB_DEVICE(0x0cde, 0x0008)}, /* Sagem XG703A */
{USB_DEVICE(0x0cde, 0x0015)}, /* Zcomax XG-705A */
{USB_DEVICE(0x0d8e, 0x3762)}, /* DLink DWL-G120 Cohiba */ {USB_DEVICE(0x0d8e, 0x3762)}, /* DLink DWL-G120 Cohiba */
{USB_DEVICE(0x124a, 0x4025)}, /* IOGear GWU513 (GW3887IK chip) */ {USB_DEVICE(0x124a, 0x4025)}, /* IOGear GWU513 (GW3887IK chip) */
{USB_DEVICE(0x1260, 0xee22)}, /* SMC 2862W-G version 2 */ {USB_DEVICE(0x1260, 0xee22)}, /* SMC 2862W-G version 2 */

View file

@ -644,11 +644,10 @@ static int wl1271_op_config_interface(struct ieee80211_hw *hw,
{ {
struct wl1271 *wl = hw->priv; struct wl1271 *wl = hw->priv;
struct sk_buff *beacon; struct sk_buff *beacon;
DECLARE_MAC_BUF(mac);
int ret; int ret;
wl1271_debug(DEBUG_MAC80211, "mac80211 config_interface bssid %s", wl1271_debug(DEBUG_MAC80211, "mac80211 config_interface bssid %pM",
print_mac(mac, conf->bssid)); conf->bssid);
wl1271_dump_ascii(DEBUG_MAC80211, "ssid: ", conf->ssid, wl1271_dump_ascii(DEBUG_MAC80211, "ssid: ", conf->ssid,
conf->ssid_len); conf->ssid_len);

View file

@ -868,11 +868,11 @@ static struct pcmcia_device_id serial_ids[] = {
PCMCIA_DEVICE_PROD_ID12("PCMCIA ", "C336MX ", 0x99bcafe9, 0xaa25bcab), PCMCIA_DEVICE_PROD_ID12("PCMCIA ", "C336MX ", 0x99bcafe9, 0xaa25bcab),
PCMCIA_DEVICE_PROD_ID12("Quatech Inc", "PCMCIA Dual RS-232 Serial Port Card", 0xc4420b35, 0x92abc92f), PCMCIA_DEVICE_PROD_ID12("Quatech Inc", "PCMCIA Dual RS-232 Serial Port Card", 0xc4420b35, 0x92abc92f),
PCMCIA_DEVICE_PROD_ID12("Quatech Inc", "Dual RS-232 Serial Port PC Card", 0xc4420b35, 0x031a380d), PCMCIA_DEVICE_PROD_ID12("Quatech Inc", "Dual RS-232 Serial Port PC Card", 0xc4420b35, 0x031a380d),
PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "PCMCIA", "EN2218-LAN/MODEM", 0x281f1c5d, 0x570f348e, "PCMLM28.cis"), PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "PCMCIA", "EN2218-LAN/MODEM", 0x281f1c5d, 0x570f348e, "cis/PCMLM28.cis"),
PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "PCMCIA", "UE2218-LAN/MODEM", 0x281f1c5d, 0x6fdcacee, "PCMLM28.cis"), PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "PCMCIA", "UE2218-LAN/MODEM", 0x281f1c5d, 0x6fdcacee, "cis/PCMLM28.cis"),
PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "Psion Dacom", "Gold Card V34 Ethernet", 0xf5f025c2, 0x338e8155, "PCMLM28.cis"), PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "Psion Dacom", "Gold Card V34 Ethernet", 0xf5f025c2, 0x338e8155, "cis/PCMLM28.cis"),
PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "Psion Dacom", "Gold Card V34 Ethernet GSM", 0xf5f025c2, 0x4ae85d35, "PCMLM28.cis"), PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "Psion Dacom", "Gold Card V34 Ethernet GSM", 0xf5f025c2, 0x4ae85d35, "cis/PCMLM28.cis"),
PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "LINKSYS", "PCMLM28", 0xf7cb0b07, 0x66881874, "PCMLM28.cis"), PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "LINKSYS", "PCMLM28", 0xf7cb0b07, 0x66881874, "cis/PCMLM28.cis"),
PCMCIA_MFC_DEVICE_CIS_PROD_ID12(1, "DAYNA COMMUNICATIONS", "LAN AND MODEM MULTIFUNCTION", 0x8fdf8f89, 0xdd5ed9e8, "DP83903.cis"), PCMCIA_MFC_DEVICE_CIS_PROD_ID12(1, "DAYNA COMMUNICATIONS", "LAN AND MODEM MULTIFUNCTION", 0x8fdf8f89, 0xdd5ed9e8, "DP83903.cis"),
PCMCIA_MFC_DEVICE_CIS_PROD_ID4(1, "NSC MF LAN/Modem", 0x58fc6056, "DP83903.cis"), PCMCIA_MFC_DEVICE_CIS_PROD_ID4(1, "NSC MF LAN/Modem", 0x58fc6056, "DP83903.cis"),
PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0101, 0x0556, "cis/3CCFEM556.cis"), PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0101, 0x0556, "cis/3CCFEM556.cis"),
@ -883,10 +883,10 @@ static struct pcmcia_device_id serial_ids[] = {
PCMCIA_DEVICE_CIS_MANF_CARD(0x0192, 0x0710, "SW_7xx_SER.cis"), /* Sierra Wireless AC710/AC750 GPRS Network Adapter R1 */ PCMCIA_DEVICE_CIS_MANF_CARD(0x0192, 0x0710, "SW_7xx_SER.cis"), /* Sierra Wireless AC710/AC750 GPRS Network Adapter R1 */
PCMCIA_DEVICE_CIS_MANF_CARD(0x0192, 0xa555, "SW_555_SER.cis"), /* Sierra Aircard 555 CDMA 1xrtt Modem -- pre update */ PCMCIA_DEVICE_CIS_MANF_CARD(0x0192, 0xa555, "SW_555_SER.cis"), /* Sierra Aircard 555 CDMA 1xrtt Modem -- pre update */
PCMCIA_DEVICE_CIS_MANF_CARD(0x013f, 0xa555, "SW_555_SER.cis"), /* Sierra Aircard 555 CDMA 1xrtt Modem -- post update */ PCMCIA_DEVICE_CIS_MANF_CARD(0x013f, 0xa555, "SW_555_SER.cis"), /* Sierra Aircard 555 CDMA 1xrtt Modem -- post update */
PCMCIA_DEVICE_CIS_PROD_ID12("MultiTech", "PCMCIA 56K DataFax", 0x842047ee, 0xc2efcf03, "MT5634ZLX.cis"), PCMCIA_DEVICE_CIS_PROD_ID12("MultiTech", "PCMCIA 56K DataFax", 0x842047ee, 0xc2efcf03, "cis/MT5634ZLX.cis"),
PCMCIA_DEVICE_CIS_PROD_ID12("ADVANTECH", "COMpad-32/85B-4", 0x96913a85, 0xcec8f102, "COMpad4.cis"), PCMCIA_DEVICE_CIS_PROD_ID12("ADVANTECH", "COMpad-32/85B-4", 0x96913a85, 0xcec8f102, "COMpad4.cis"),
PCMCIA_DEVICE_CIS_PROD_ID123("ADVANTECH", "COMpad-32/85", "1.0", 0x96913a85, 0x8fbe92ae, 0x0877b627, "COMpad2.cis"), PCMCIA_DEVICE_CIS_PROD_ID123("ADVANTECH", "COMpad-32/85", "1.0", 0x96913a85, 0x8fbe92ae, 0x0877b627, "COMpad2.cis"),
PCMCIA_DEVICE_CIS_PROD_ID2("RS-COM 2P", 0xad20b156, "RS-COM-2P.cis"), PCMCIA_DEVICE_CIS_PROD_ID2("RS-COM 2P", 0xad20b156, "cis/RS-COM-2P.cis"),
PCMCIA_DEVICE_CIS_MANF_CARD(0x0013, 0x0000, "GLOBETROTTER.cis"), PCMCIA_DEVICE_CIS_MANF_CARD(0x0013, 0x0000, "GLOBETROTTER.cis"),
PCMCIA_DEVICE_PROD_ID12("ELAN DIGITAL SYSTEMS LTD, c1997.","SERIAL CARD: SL100 1.00.",0x19ca78af,0xf964f42b), PCMCIA_DEVICE_PROD_ID12("ELAN DIGITAL SYSTEMS LTD, c1997.","SERIAL CARD: SL100 1.00.",0x19ca78af,0xf964f42b),
PCMCIA_DEVICE_PROD_ID12("ELAN DIGITAL SYSTEMS LTD, c1997.","SERIAL CARD: SL100",0x19ca78af,0x71d98e83), PCMCIA_DEVICE_PROD_ID12("ELAN DIGITAL SYSTEMS LTD, c1997.","SERIAL CARD: SL100",0x19ca78af,0x71d98e83),

View file

@ -600,6 +600,7 @@ static int sprom_extract(struct ssb_bus *bus, struct ssb_sprom *out,
ssb_printk(KERN_WARNING PFX "Unsupported SPROM" ssb_printk(KERN_WARNING PFX "Unsupported SPROM"
" revision %d detected. Will extract" " revision %d detected. Will extract"
" v1\n", out->revision); " v1\n", out->revision);
out->revision = 1;
sprom_extract_r123(out, in); sprom_extract_r123(out, in);
} }
} }

View file

@ -21,7 +21,7 @@
#include "ssb_private.h" #include "ssb_private.h"
/* Define the following to 1 to enable a printk on each coreswitch. */ /* Define the following to 1 to enable a printk on each coreswitch. */
#define SSB_VERBOSE_SDIOCORESWITCH_DEBUG 1 #define SSB_VERBOSE_SDIOCORESWITCH_DEBUG 0
/* Hardware invariants CIS tuples */ /* Hardware invariants CIS tuples */
@ -333,7 +333,7 @@ static void ssb_sdio_block_read(struct ssb_device *dev, void *buffer,
goto out; goto out;
err_out: err_out:
dev_dbg(ssb_sdio_dev(bus), "%04X:%04X (width=%u, len=%u), error %d\n", dev_dbg(ssb_sdio_dev(bus), "%04X:%04X (width=%u, len=%zu), error %d\n",
bus->sdio_sbaddr >> 16, offset, reg_width, saved_count, error); bus->sdio_sbaddr >> 16, offset, reg_width, saved_count, error);
out: out:
sdio_release_host(bus->host_sdio); sdio_release_host(bus->host_sdio);
@ -440,7 +440,7 @@ static void ssb_sdio_block_write(struct ssb_device *dev, const void *buffer,
goto out; goto out;
err_out: err_out:
dev_dbg(ssb_sdio_dev(bus), "%04X:%04X (width=%u, len=%u), error %d\n", dev_dbg(ssb_sdio_dev(bus), "%04X:%04X (width=%u, len=%zu), error %d\n",
bus->sdio_sbaddr >> 16, offset, reg_width, saved_count, error); bus->sdio_sbaddr >> 16, offset, reg_width, saved_count, error);
out: out:
sdio_release_host(bus->host_sdio); sdio_release_host(bus->host_sdio);

View file

@ -51,9 +51,10 @@ fw-shipped-$(CONFIG_DVB_TTUSB_BUDGET) += ttusb-budget/dspbootcode.bin
fw-shipped-$(CONFIG_E100) += e100/d101m_ucode.bin e100/d101s_ucode.bin \ fw-shipped-$(CONFIG_E100) += e100/d101m_ucode.bin e100/d101s_ucode.bin \
e100/d102e_ucode.bin e100/d102e_ucode.bin
fw-shipped-$(CONFIG_MYRI_SBUS) += myricom/lanai.bin fw-shipped-$(CONFIG_MYRI_SBUS) += myricom/lanai.bin
fw-shipped-$(CONFIG_PCMCIA_PCNET) += cis/LA-PCM.cis fw-shipped-$(CONFIG_PCMCIA_PCNET) += cis/LA-PCM.cis cis/PCMLM28.cis
fw-shipped-$(CONFIG_PCMCIA_3C589) += cis/3CXEM556.cis fw-shipped-$(CONFIG_PCMCIA_3C589) += cis/3CXEM556.cis
fw-shipped-$(CONFIG_PCMCIA_3C574) += cis/3CCFEM556.cis fw-shipped-$(CONFIG_PCMCIA_3C574) += cis/3CCFEM556.cis
fw-shipped-$(CONFIG_SERIAL_8250_CS) += cis/MT5634ZLX.cis cis/RS-COM-2P.cis
fw-shipped-$(CONFIG_PCMCIA_SMC91C92) += ositech/Xilinx7OD.bin fw-shipped-$(CONFIG_PCMCIA_SMC91C92) += ositech/Xilinx7OD.bin
fw-shipped-$(CONFIG_SCSI_ADVANSYS) += advansys/mcode.bin advansys/38C1600.bin \ fw-shipped-$(CONFIG_SCSI_ADVANSYS) += advansys/mcode.bin advansys/38C1600.bin \
advansys/3550.bin advansys/38C0800.bin advansys/3550.bin advansys/38C0800.bin

View file

@ -596,6 +596,7 @@ Found in hex form in kernel source.
Driver: PCMCIA_PCNET - NE2000 compatible PCMCIA adapter Driver: PCMCIA_PCNET - NE2000 compatible PCMCIA adapter
File: cis/LA-PCM.cis File: cis/LA-PCM.cis
cis/PCMLM28.cis
Licence: GPL Licence: GPL
@ -623,6 +624,17 @@ Originally developed by the pcmcia-cs project
-------------------------------------------------------------------------- --------------------------------------------------------------------------
Driver: SERIAL_8250_CS - Serial PCMCIA adapter
File: cis/MT5634ZLX.cis
cis/RS-COM-2P.cis
Licence: GPL
Originally developed by the pcmcia-cs project
--------------------------------------------------------------------------
Driver: PCMCIA_SMC91C92 - SMC 91Cxx PCMCIA Driver: PCMCIA_SMC91C92 - SMC 91Cxx PCMCIA
File: ositech/Xilinx7OD.bin File: ositech/Xilinx7OD.bin

View file

@ -0,0 +1,11 @@
:100000000101FF152204014D756C74695465636824
:100010000050434D4349412035364B2044617461C3
:10002000466178000000FF20040002010021020266
:10003000001A05012780FF671B0FCF418B01550177
:10004000550155AA60F80307281B08970108AA6004
:10005000F802071B089F0108AA60E803071B08A70E
:0B0060000108AA60E802071400FF007E
:00000001FF
#
# Replacement CIS for Multitech MT5634ZLX modems
#

View file

@ -0,0 +1,18 @@
:1000000001030000FF151504014C494E4B53595391
:100010000050434D4C4D3238000000FF2004430196
:10002000ABC0210200001A05012FF803031B10E4E6
:1000300001190155E06100031FF8020730FFFF1BA3
:100040000BA50108E06120031FF802071B0BA601A6
:1000500008E06140031FF802071B0BA70108E061DD
:1000600060031FF802071B0BA80108E06100031FD3
:10007000E803071B0BA90108E06120031FE8030741
:100080001B0BAA0108E06140031FE803071B0BAB31
:100090000108E06160031FE803071B0BAC0108E0E7
:1000A0006100031FE802071B0BAD0108E06120039C
:1000B0001FE802071B0BAE0108E06140031FE802C6
:1000C000071B0BAF0108E06160031FE80207140083
:0200D000FF002F
:00000001FF
#
# The on-card CIS says it is MFC-compliant, but it is not
#

View file

@ -0,0 +1,10 @@
:1000000001030000FF1516040150434D4349410010
:1000100052532D434F4D203250000000FF21020269
:10002000011A0501030001011B0EC18118AA61E834
:100030000307E8020730B89E1B0B820108AA615033
:1000400002075802071B0B830108AA6160020768B8
:0600500002071400FF008E
:00000001FF
#
# Replacement CIS for dual-serial-port IO card
#

View file

@ -21,4 +21,111 @@ extern struct key_type key_type_rxrpc;
extern struct key *rxrpc_get_null_key(const char *); extern struct key *rxrpc_get_null_key(const char *);
/*
* RxRPC key for Kerberos IV (type-2 security)
*/
struct rxkad_key {
u32 vice_id;
u32 start; /* time at which ticket starts */
u32 expiry; /* time at which ticket expires */
u32 kvno; /* key version number */
u8 primary_flag; /* T if key for primary cell for this user */
u16 ticket_len; /* length of ticket[] */
u8 session_key[8]; /* DES session key */
u8 ticket[0]; /* the encrypted ticket */
};
/*
* Kerberos 5 principal
* name/name/name@realm
*/
struct krb5_principal {
u8 n_name_parts; /* N of parts of the name part of the principal */
char **name_parts; /* parts of the name part of the principal */
char *realm; /* parts of the realm part of the principal */
};
/*
* Kerberos 5 tagged data
*/
struct krb5_tagged_data {
/* for tag value, see /usr/include/krb5/krb5.h
* - KRB5_AUTHDATA_* for auth data
* -
*/
s32 tag;
u32 data_len;
u8 *data;
};
/*
* RxRPC key for Kerberos V (type-5 security)
*/
struct rxk5_key {
u64 authtime; /* time at which auth token generated */
u64 starttime; /* time at which auth token starts */
u64 endtime; /* time at which auth token expired */
u64 renew_till; /* time to which auth token can be renewed */
s32 is_skey; /* T if ticket is encrypted in another ticket's
* skey */
s32 flags; /* mask of TKT_FLG_* bits (krb5/krb5.h) */
struct krb5_principal client; /* client principal name */
struct krb5_principal server; /* server principal name */
u16 ticket_len; /* length of ticket */
u16 ticket2_len; /* length of second ticket */
u8 n_authdata; /* number of authorisation data elements */
u8 n_addresses; /* number of addresses */
struct krb5_tagged_data session; /* session data; tag is enctype */
struct krb5_tagged_data *addresses; /* addresses */
u8 *ticket; /* krb5 ticket */
u8 *ticket2; /* second krb5 ticket, if related to ticket (via
* DUPLICATE-SKEY or ENC-TKT-IN-SKEY) */
struct krb5_tagged_data *authdata; /* authorisation data */
};
/*
* list of tokens attached to an rxrpc key
*/
struct rxrpc_key_token {
u16 security_index; /* RxRPC header security index */
struct rxrpc_key_token *next; /* the next token in the list */
union {
struct rxkad_key *kad;
struct rxk5_key *k5;
};
};
/*
* structure of raw payloads passed to add_key() or instantiate key
*/
struct rxrpc_key_data_v1 {
u32 kif_version; /* 1 */
u16 security_index;
u16 ticket_length;
u32 expiry; /* time_t */
u32 kvno;
u8 session_key[8];
u8 ticket[0];
};
/*
* AF_RXRPC key payload derived from XDR format
* - based on openafs-1.4.10/src/auth/afs_token.xg
*/
#define AFSTOKEN_LENGTH_MAX 16384 /* max payload size */
#define AFSTOKEN_STRING_MAX 256 /* max small string length */
#define AFSTOKEN_DATA_MAX 64 /* max small data length */
#define AFSTOKEN_CELL_MAX 64 /* max cellname length */
#define AFSTOKEN_MAX 8 /* max tokens per payload */
#define AFSTOKEN_BDATALN_MAX 16384 /* max big data length */
#define AFSTOKEN_RK_TIX_MAX 12000 /* max RxKAD ticket size */
#define AFSTOKEN_GK_KEY_MAX 64 /* max GSSAPI key size */
#define AFSTOKEN_GK_TOKEN_MAX 16384 /* max GSSAPI token size */
#define AFSTOKEN_K5_COMPONENTS_MAX 16 /* max K5 components */
#define AFSTOKEN_K5_NAME_MAX 128 /* max K5 name length */
#define AFSTOKEN_K5_REALM_MAX 64 /* max K5 realm name length */
#define AFSTOKEN_K5_TIX_MAX 16384 /* max K5 ticket size */
#define AFSTOKEN_K5_ADDRESSES_MAX 16 /* max K5 addresses */
#define AFSTOKEN_K5_AUTHDATA_MAX 16 /* max K5 pieces of auth data */
#endif /* _KEYS_RXRPC_TYPE_H */ #endif /* _KEYS_RXRPC_TYPE_H */

View file

@ -233,6 +233,8 @@ extern void ip_mc_init_dev(struct in_device *);
extern void ip_mc_destroy_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_up(struct in_device *);
extern void ip_mc_down(struct in_device *); extern void ip_mc_down(struct in_device *);
extern void ip_mc_unmap(struct in_device *);
extern void ip_mc_remap(struct in_device *);
extern void ip_mc_dec_group(struct in_device *in_dev, __be32 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); extern void ip_mc_inc_group(struct in_device *in_dev, __be32 addr);
extern void ip_mc_rejoin_group(struct ip_mc_list *im); extern void ip_mc_rejoin_group(struct ip_mc_list *im);

View file

@ -57,6 +57,7 @@ typedef enum {
#include <linux/random.h> #include <linux/random.h>
#include <linux/wait.h> #include <linux/wait.h>
#include <linux/fcntl.h> /* For O_CLOEXEC and O_NONBLOCK */ #include <linux/fcntl.h> /* For O_CLOEXEC and O_NONBLOCK */
#include <linux/kmemcheck.h>
struct poll_table_struct; struct poll_table_struct;
struct pipe_inode_info; struct pipe_inode_info;
@ -127,7 +128,11 @@ enum sock_shutdown_cmd {
*/ */
struct socket { struct socket {
socket_state state; socket_state state;
kmemcheck_bitfield_begin(type);
short type; short type;
kmemcheck_bitfield_end(type);
unsigned long flags; unsigned long flags;
/* /*
* Please keep fasync_list & wait fields in the same cache line * Please keep fasync_list & wait fields in the same cache line

View file

@ -1873,7 +1873,8 @@ extern void __dev_addr_unsync(struct dev_addr_list **to, int *to_count, struct
extern int dev_set_promiscuity(struct net_device *dev, int inc); extern int dev_set_promiscuity(struct net_device *dev, int inc);
extern int dev_set_allmulti(struct net_device *dev, int inc); extern int dev_set_allmulti(struct net_device *dev, int inc);
extern void netdev_state_change(struct net_device *dev); extern void netdev_state_change(struct net_device *dev);
extern void netdev_bonding_change(struct net_device *dev); extern void netdev_bonding_change(struct net_device *dev,
unsigned long event);
extern void netdev_features_change(struct net_device *dev); extern void netdev_features_change(struct net_device *dev);
/* Load a device via the kmod */ /* Load a device via the kmod */
extern void dev_load(struct net *net, const char *name); extern void dev_load(struct net *net, const char *name);

View file

@ -176,12 +176,16 @@ struct netlink_skb_parms
#define NETLINK_CREDS(skb) (&NETLINK_CB((skb)).creds) #define NETLINK_CREDS(skb) (&NETLINK_CB((skb)).creds)
extern void netlink_table_grab(void);
extern void netlink_table_ungrab(void);
extern struct sock *netlink_kernel_create(struct net *net, extern struct sock *netlink_kernel_create(struct net *net,
int unit,unsigned int groups, int unit,unsigned int groups,
void (*input)(struct sk_buff *skb), void (*input)(struct sk_buff *skb),
struct mutex *cb_mutex, struct mutex *cb_mutex,
struct module *module); struct module *module);
extern void netlink_kernel_release(struct sock *sk); extern void netlink_kernel_release(struct sock *sk);
extern int __netlink_change_ngroups(struct sock *sk, unsigned int groups);
extern int netlink_change_ngroups(struct sock *sk, unsigned int groups); extern int netlink_change_ngroups(struct sock *sk, unsigned int groups);
extern void netlink_clear_multicast_users(struct sock *sk, unsigned int group); extern void netlink_clear_multicast_users(struct sock *sk, unsigned int group);
extern void netlink_ack(struct sk_buff *in_skb, struct nlmsghdr *nlh, int err); extern void netlink_ack(struct sk_buff *in_skb, struct nlmsghdr *nlh, int err);

View file

@ -199,6 +199,8 @@ static inline int notifier_to_errno(int ret)
#define NETDEV_FEAT_CHANGE 0x000B #define NETDEV_FEAT_CHANGE 0x000B
#define NETDEV_BONDING_FAILOVER 0x000C #define NETDEV_BONDING_FAILOVER 0x000C
#define NETDEV_PRE_UP 0x000D #define NETDEV_PRE_UP 0x000D
#define NETDEV_BONDING_OLDTYPE 0x000E
#define NETDEV_BONDING_NEWTYPE 0x000F
#define SYS_DOWN 0x0001 /* Notify of system down */ #define SYS_DOWN 0x0001 /* Notify of system down */
#define SYS_RESTART SYS_DOWN #define SYS_RESTART SYS_DOWN

View file

@ -58,5 +58,12 @@ struct sockaddr_rxrpc {
#define RXRPC_SECURITY_AUTH 1 /* authenticated packets */ #define RXRPC_SECURITY_AUTH 1 /* authenticated packets */
#define RXRPC_SECURITY_ENCRYPT 2 /* encrypted packets */ #define RXRPC_SECURITY_ENCRYPT 2 /* encrypted packets */
/*
* RxRPC security indices
*/
#define RXRPC_SECURITY_NONE 0 /* no security protocol */
#define RXRPC_SECURITY_RXKAD 2 /* kaserver or kerberos 4 */
#define RXRPC_SECURITY_RXGK 4 /* gssapi-based */
#define RXRPC_SECURITY_RXK5 5 /* kerberos 5 */
#endif /* _LINUX_RXRPC_H */ #endif /* _LINUX_RXRPC_H */

View file

@ -143,6 +143,8 @@ extern int __ipv6_dev_mc_dec(struct inet6_dev *idev, const struct in6_addr *addr
extern int ipv6_dev_mc_dec(struct net_device *dev, const struct in6_addr *addr); extern int ipv6_dev_mc_dec(struct net_device *dev, const struct in6_addr *addr);
extern void ipv6_mc_up(struct inet6_dev *idev); extern void ipv6_mc_up(struct inet6_dev *idev);
extern void ipv6_mc_down(struct inet6_dev *idev); extern void ipv6_mc_down(struct inet6_dev *idev);
extern void ipv6_mc_unmap(struct inet6_dev *idev);
extern void ipv6_mc_remap(struct inet6_dev *idev);
extern void ipv6_mc_init_dev(struct inet6_dev *idev); extern void ipv6_mc_init_dev(struct inet6_dev *idev);
extern void ipv6_mc_destroy_dev(struct inet6_dev *idev); extern void ipv6_mc_destroy_dev(struct inet6_dev *idev);
extern void addrconf_dad_failure(struct inet6_ifaddr *ifp); extern void addrconf_dad_failure(struct inet6_ifaddr *ifp);

View file

@ -94,21 +94,20 @@ struct inet_protosw {
#define INET_PROTOSW_PERMANENT 0x02 /* Permanent protocols are unremovable. */ #define INET_PROTOSW_PERMANENT 0x02 /* Permanent protocols are unremovable. */
#define INET_PROTOSW_ICSK 0x04 /* Is this an inet_connection_sock? */ #define INET_PROTOSW_ICSK 0x04 /* Is this an inet_connection_sock? */
extern struct net_protocol *inet_protocol_base; extern const struct net_protocol *inet_protos[MAX_INET_PROTOS];
extern struct net_protocol *inet_protos[MAX_INET_PROTOS];
#if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE) #if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)
extern struct inet6_protocol *inet6_protos[MAX_INET_PROTOS]; extern const struct inet6_protocol *inet6_protos[MAX_INET_PROTOS];
#endif #endif
extern int inet_add_protocol(struct net_protocol *prot, unsigned char num); extern int inet_add_protocol(const struct net_protocol *prot, unsigned char num);
extern int inet_del_protocol(struct net_protocol *prot, unsigned char num); extern int inet_del_protocol(const struct net_protocol *prot, unsigned char num);
extern void inet_register_protosw(struct inet_protosw *p); extern void inet_register_protosw(struct inet_protosw *p);
extern void inet_unregister_protosw(struct inet_protosw *p); extern void inet_unregister_protosw(struct inet_protosw *p);
#if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE) #if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)
extern int inet6_add_protocol(struct inet6_protocol *prot, unsigned char num); extern int inet6_add_protocol(const struct inet6_protocol *prot, unsigned char num);
extern int inet6_del_protocol(struct inet6_protocol *prot, unsigned char num); extern int inet6_del_protocol(const struct inet6_protocol *prot, unsigned char num);
extern int inet6_register_protosw(struct inet_protosw *p); extern int inet6_register_protosw(struct inet_protosw *p);
extern void inet6_unregister_protosw(struct inet_protosw *p); extern void inet6_unregister_protosw(struct inet_protosw *p);
#endif #endif

View file

@ -81,7 +81,7 @@ struct Qdisc
struct Qdisc_class_ops struct Qdisc_class_ops
{ {
/* Child qdisc manipulation */ /* Child qdisc manipulation */
unsigned int (*select_queue)(struct Qdisc *, struct tcmsg *); struct netdev_queue * (*select_queue)(struct Qdisc *, struct tcmsg *);
int (*graft)(struct Qdisc *, unsigned long cl, int (*graft)(struct Qdisc *, unsigned long cl,
struct Qdisc *, struct Qdisc **); struct Qdisc *, struct Qdisc **);
struct Qdisc * (*leaf)(struct Qdisc *, unsigned long cl); struct Qdisc * (*leaf)(struct Qdisc *, unsigned long cl);

View file

@ -793,6 +793,13 @@ static inline unsigned int tcp_packets_in_flight(const struct tcp_sock *tp)
return tp->packets_out - tcp_left_out(tp) + tp->retrans_out; return tp->packets_out - tcp_left_out(tp) + tp->retrans_out;
} }
#define TCP_INFINITE_SSTHRESH 0x7fffffff
static inline bool tcp_in_initial_slowstart(const struct tcp_sock *tp)
{
return tp->snd_ssthresh >= TCP_INFINITE_SSTHRESH;
}
/* If cwnd > ssthresh, we may raise ssthresh to be half-way to cwnd. /* If cwnd > ssthresh, we may raise ssthresh to be half-way to cwnd.
* The exception is rate halving phase, when cwnd is decreasing towards * The exception is rate halving phase, when cwnd is decreasing towards
* ssthresh. * ssthresh.

View file

@ -1372,7 +1372,7 @@ static int atalk_route_packet(struct sk_buff *skb, struct net_device *dev,
if (aarp_send_ddp(rt->dev, skb, &ta, NULL) == NET_XMIT_DROP) if (aarp_send_ddp(rt->dev, skb, &ta, NULL) == NET_XMIT_DROP)
return NET_RX_DROP; return NET_RX_DROP;
return NET_XMIT_SUCCESS; return NET_RX_SUCCESS;
free_it: free_it:
kfree_skb(skb); kfree_skb(skb);
drop: drop:

View file

@ -199,6 +199,8 @@ static int can_create(struct net *net, struct socket *sock, int protocol)
* @skb: pointer to socket buffer with CAN frame in data section * @skb: pointer to socket buffer with CAN frame in data section
* @loop: loopback for listeners on local CAN sockets (recommended default!) * @loop: loopback for listeners on local CAN sockets (recommended default!)
* *
* Due to the loopback this routine must not be called from hardirq context.
*
* Return: * Return:
* 0 on success * 0 on success
* -ENETDOWN when the selected interface is down * -ENETDOWN when the selected interface is down
@ -278,7 +280,7 @@ int can_send(struct sk_buff *skb, int loop)
} }
if (newskb) if (newskb)
netif_rx(newskb); netif_rx_ni(newskb);
/* update statistics */ /* update statistics */
can_stats.tx_frames++; can_stats.tx_frames++;

View file

@ -1017,9 +1017,9 @@ void netdev_state_change(struct net_device *dev)
} }
EXPORT_SYMBOL(netdev_state_change); EXPORT_SYMBOL(netdev_state_change);
void netdev_bonding_change(struct net_device *dev) void netdev_bonding_change(struct net_device *dev, unsigned long event)
{ {
call_netdevice_notifiers(NETDEV_BONDING_FAILOVER, dev); call_netdevice_notifiers(event, dev);
} }
EXPORT_SYMBOL(netdev_bonding_change); EXPORT_SYMBOL(netdev_bonding_change);

View file

@ -66,9 +66,9 @@ config IP_DCCP_CCID3_RTO
A value of 0 disables this feature by enforcing the value specified A value of 0 disables this feature by enforcing the value specified
in RFC 3448. The following values have been suggested as bounds for in RFC 3448. The following values have been suggested as bounds for
experimental use: experimental use:
* 16-20ms to match the typical multimedia inter-frame interval * 16-20ms to match the typical multimedia inter-frame interval
* 100ms as a reasonable compromise [default] * 100ms as a reasonable compromise [default]
* 1000ms corresponds to the lower TCP RTO bound (RFC 2988, 2.4) * 1000ms corresponds to the lower TCP RTO bound (RFC 2988, 2.4)
The default of 100ms is a compromise between a large value for The default of 100ms is a compromise between a large value for
efficient DCCP implementations, and a small value to avoid disrupting efficient DCCP implementations, and a small value to avoid disrupting

View file

@ -1,6 +1,4 @@
/* /*
* net/dccp/ccids/ccid2.c
*
* Copyright (c) 2005, 2006 Andrea Bittau <a.bittau@cs.ucl.ac.uk> * Copyright (c) 2005, 2006 Andrea Bittau <a.bittau@cs.ucl.ac.uk>
* *
* Changes to meet Linux coding standards, and DCCP infrastructure fixes. * Changes to meet Linux coding standards, and DCCP infrastructure fixes.

View file

@ -1,6 +1,4 @@
/* /*
* net/dccp/ccids/ccid2.h
*
* Copyright (c) 2005 Andrea Bittau <a.bittau@cs.ucl.ac.uk> * Copyright (c) 2005 Andrea Bittau <a.bittau@cs.ucl.ac.uk>
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
@ -40,14 +38,14 @@ struct ccid2_seq {
#define CCID2_SEQBUF_LEN 1024 #define CCID2_SEQBUF_LEN 1024
#define CCID2_SEQBUF_MAX 128 #define CCID2_SEQBUF_MAX 128
/** struct ccid2_hc_tx_sock - CCID2 TX half connection /**
* * struct ccid2_hc_tx_sock - CCID2 TX half connection
* @ccid2hctx_{cwnd,ssthresh,pipe}: as per RFC 4341, section 5 * @ccid2hctx_{cwnd,ssthresh,pipe}: as per RFC 4341, section 5
* @ccid2hctx_packets_acked - Ack counter for deriving cwnd growth (RFC 3465) * @ccid2hctx_packets_acked - Ack counter for deriving cwnd growth (RFC 3465)
* @ccid2hctx_lastrtt -time RTT was last measured * @ccid2hctx_lastrtt -time RTT was last measured
* @ccid2hctx_rpseq - last consecutive seqno * @ccid2hctx_rpseq - last consecutive seqno
* @ccid2hctx_rpdupack - dupacks since rpseq * @ccid2hctx_rpdupack - dupacks since rpseq
*/ */
struct ccid2_hc_tx_sock { struct ccid2_hc_tx_sock {
u32 ccid2hctx_cwnd; u32 ccid2hctx_cwnd;
u32 ccid2hctx_ssthresh; u32 ccid2hctx_ssthresh;

View file

@ -1,6 +1,4 @@
/* /*
* net/dccp/ccids/ccid3.c
*
* Copyright (c) 2007 The University of Aberdeen, Scotland, UK * Copyright (c) 2007 The University of Aberdeen, Scotland, UK
* Copyright (c) 2005-7 The University of Waikato, Hamilton, New Zealand. * Copyright (c) 2005-7 The University of Waikato, Hamilton, New Zealand.
* Copyright (c) 2005-7 Ian McDonald <ian.mcdonald@jandi.co.nz> * Copyright (c) 2005-7 Ian McDonald <ian.mcdonald@jandi.co.nz>
@ -750,7 +748,8 @@ static int ccid3_hc_rx_insert_options(struct sock *sk, struct sk_buff *skb)
return 0; return 0;
} }
/** ccid3_first_li - Implements [RFC 3448, 6.3.1] /**
* ccid3_first_li - Implements [RFC 5348, 6.3.1]
* *
* Determine the length of the first loss interval via inverse lookup. * Determine the length of the first loss interval via inverse lookup.
* Assume that X_recv can be computed by the throughput equation * Assume that X_recv can be computed by the throughput equation

View file

@ -1,6 +1,4 @@
/* /*
* net/dccp/ccids/ccid3.h
*
* Copyright (c) 2005-7 The University of Waikato, Hamilton, New Zealand. * Copyright (c) 2005-7 The University of Waikato, Hamilton, New Zealand.
* Copyright (c) 2007 The University of Aberdeen, Scotland, UK * Copyright (c) 2007 The University of Aberdeen, Scotland, UK
* *
@ -75,8 +73,8 @@ enum ccid3_hc_tx_states {
TFRC_SSTATE_TERM, TFRC_SSTATE_TERM,
}; };
/** struct ccid3_hc_tx_sock - CCID3 sender half-connection socket /**
* * struct ccid3_hc_tx_sock - CCID3 sender half-connection socket
* @ccid3hctx_x - Current sending rate in 64 * bytes per second * @ccid3hctx_x - Current sending rate in 64 * bytes per second
* @ccid3hctx_x_recv - Receive rate in 64 * bytes per second * @ccid3hctx_x_recv - Receive rate in 64 * bytes per second
* @ccid3hctx_x_calc - Calculated rate in bytes per second * @ccid3hctx_x_calc - Calculated rate in bytes per second
@ -119,9 +117,9 @@ struct ccid3_hc_tx_sock {
static inline struct ccid3_hc_tx_sock *ccid3_hc_tx_sk(const struct sock *sk) static inline struct ccid3_hc_tx_sock *ccid3_hc_tx_sk(const struct sock *sk)
{ {
struct ccid3_hc_tx_sock *hctx = ccid_priv(dccp_sk(sk)->dccps_hc_tx_ccid); struct ccid3_hc_tx_sock *hctx = ccid_priv(dccp_sk(sk)->dccps_hc_tx_ccid);
BUG_ON(hctx == NULL); BUG_ON(hctx == NULL);
return hctx; return hctx;
} }
/* TFRC receiver states */ /* TFRC receiver states */
@ -131,22 +129,22 @@ enum ccid3_hc_rx_states {
TFRC_RSTATE_TERM = 127, TFRC_RSTATE_TERM = 127,
}; };
/** struct ccid3_hc_rx_sock - CCID3 receiver half-connection socket /**
* * struct ccid3_hc_rx_sock - CCID3 receiver half-connection socket
* @ccid3hcrx_x_recv - Receiver estimate of send rate (RFC 3448 4.3) * @ccid3hcrx_x_recv - Receiver estimate of send rate (RFC 3448 4.3)
* @ccid3hcrx_rtt - Receiver estimate of rtt (non-standard) * @ccid3hcrx_rtt - Receiver estimate of rtt (non-standard)
* @ccid3hcrx_p - Current loss event rate (RFC 3448 5.4) * @ccid3hcrx_p - Current loss event rate (RFC 3448 5.4)
* @ccid3hcrx_last_counter - Tracks window counter (RFC 4342, 8.1) * @ccid3hcrx_last_counter - Tracks window counter (RFC 4342, 8.1)
* @ccid3hcrx_state - Receiver state, one of %ccid3_hc_rx_states * @ccid3hcrx_state - Receiver state, one of %ccid3_hc_rx_states
* @ccid3hcrx_bytes_recv - Total sum of DCCP payload bytes * @ccid3hcrx_bytes_recv - Total sum of DCCP payload bytes
* @ccid3hcrx_x_recv - Receiver estimate of send rate (RFC 3448, sec. 4.3) * @ccid3hcrx_x_recv - Receiver estimate of send rate (RFC 3448, sec. 4.3)
* @ccid3hcrx_rtt - Receiver estimate of RTT * @ccid3hcrx_rtt - Receiver estimate of RTT
* @ccid3hcrx_tstamp_last_feedback - Time at which last feedback was sent * @ccid3hcrx_tstamp_last_feedback - Time at which last feedback was sent
* @ccid3hcrx_tstamp_last_ack - Time at which last feedback was sent * @ccid3hcrx_tstamp_last_ack - Time at which last feedback was sent
* @ccid3hcrx_hist - Packet history (loss detection + RTT sampling) * @ccid3hcrx_hist - Packet history (loss detection + RTT sampling)
* @ccid3hcrx_li_hist - Loss Interval database * @ccid3hcrx_li_hist - Loss Interval database
* @ccid3hcrx_s - Received packet size in bytes * @ccid3hcrx_s - Received packet size in bytes
* @ccid3hcrx_pinv - Inverse of Loss Event Rate (RFC 4342, sec. 8.5) * @ccid3hcrx_pinv - Inverse of Loss Event Rate (RFC 4342, sec. 8.5)
*/ */
struct ccid3_hc_rx_sock { struct ccid3_hc_rx_sock {
u8 ccid3hcrx_last_counter:4; u8 ccid3hcrx_last_counter:4;
@ -163,9 +161,9 @@ struct ccid3_hc_rx_sock {
static inline struct ccid3_hc_rx_sock *ccid3_hc_rx_sk(const struct sock *sk) static inline struct ccid3_hc_rx_sock *ccid3_hc_rx_sk(const struct sock *sk)
{ {
struct ccid3_hc_rx_sock *hcrx = ccid_priv(dccp_sk(sk)->dccps_hc_rx_ccid); struct ccid3_hc_rx_sock *hcrx = ccid_priv(dccp_sk(sk)->dccps_hc_rx_ccid);
BUG_ON(hcrx == NULL); BUG_ON(hcrx == NULL);
return hcrx; return hcrx;
} }
#endif /* _DCCP_CCID3_H_ */ #endif /* _DCCP_CCID3_H_ */

View file

@ -1,6 +1,4 @@
/* /*
* net/dccp/ccids/lib/loss_interval.c
*
* Copyright (c) 2007 The University of Aberdeen, Scotland, UK * Copyright (c) 2007 The University of Aberdeen, Scotland, UK
* Copyright (c) 2005-7 The University of Waikato, Hamilton, New Zealand. * Copyright (c) 2005-7 The University of Waikato, Hamilton, New Zealand.
* Copyright (c) 2005-7 Ian McDonald <ian.mcdonald@jandi.co.nz> * Copyright (c) 2005-7 Ian McDonald <ian.mcdonald@jandi.co.nz>
@ -21,7 +19,7 @@ static const int tfrc_lh_weights[NINTERVAL] = { 10, 10, 10, 10, 8, 6, 4, 2 };
/* implements LIFO semantics on the array */ /* implements LIFO semantics on the array */
static inline u8 LIH_INDEX(const u8 ctr) static inline u8 LIH_INDEX(const u8 ctr)
{ {
return (LIH_SIZE - 1 - (ctr % LIH_SIZE)); return LIH_SIZE - 1 - (ctr % LIH_SIZE);
} }
/* the `counter' index always points at the next entry to be populated */ /* the `counter' index always points at the next entry to be populated */
@ -129,7 +127,8 @@ static inline u8 tfrc_lh_is_new_loss(struct tfrc_loss_interval *cur,
(cur->li_is_closed || SUB16(new_loss->tfrchrx_ccval, cur->li_ccval) > 4); (cur->li_is_closed || SUB16(new_loss->tfrchrx_ccval, cur->li_ccval) > 4);
} }
/** tfrc_lh_interval_add - Insert new record into the Loss Interval database /**
* tfrc_lh_interval_add - Insert new record into the Loss Interval database
* @lh: Loss Interval database * @lh: Loss Interval database
* @rh: Receive history containing a fresh loss event * @rh: Receive history containing a fresh loss event
* @calc_first_li: Caller-dependent routine to compute length of first interval * @calc_first_li: Caller-dependent routine to compute length of first interval

View file

@ -1,8 +1,6 @@
#ifndef _DCCP_LI_HIST_ #ifndef _DCCP_LI_HIST_
#define _DCCP_LI_HIST_ #define _DCCP_LI_HIST_
/* /*
* net/dccp/ccids/lib/loss_interval.h
*
* Copyright (c) 2007 The University of Aberdeen, Scotland, UK * Copyright (c) 2007 The University of Aberdeen, Scotland, UK
* Copyright (c) 2005-7 The University of Waikato, Hamilton, New Zealand. * Copyright (c) 2005-7 The University of Waikato, Hamilton, New Zealand.
* Copyright (c) 2005-7 Ian McDonald <ian.mcdonald@jandi.co.nz> * Copyright (c) 2005-7 Ian McDonald <ian.mcdonald@jandi.co.nz>

View file

@ -1,6 +1,4 @@
/* /*
* net/dccp/packet_history.c
*
* Copyright (c) 2007 The University of Aberdeen, Scotland, UK * Copyright (c) 2007 The University of Aberdeen, Scotland, UK
* Copyright (c) 2005-7 The University of Waikato, Hamilton, New Zealand. * Copyright (c) 2005-7 The University of Waikato, Hamilton, New Zealand.
* *
@ -128,7 +126,7 @@ u32 tfrc_tx_hist_rtt(struct tfrc_tx_hist_entry *head, const u64 seqno,
/* /*
* Receiver History Routines * Receiver History Routines
*/ */
static struct kmem_cache *tfrc_rx_hist_slab; static struct kmem_cache *tfrc_rx_hist_slab;

View file

@ -70,7 +70,6 @@ struct tfrc_rx_hist_entry {
/** /**
* tfrc_rx_hist - RX history structure for TFRC-based protocols * tfrc_rx_hist - RX history structure for TFRC-based protocols
*
* @ring: Packet history for RTT sampling and loss detection * @ring: Packet history for RTT sampling and loss detection
* @loss_count: Number of entries in circular history * @loss_count: Number of entries in circular history
* @loss_start: Movable index (for loss detection) * @loss_start: Movable index (for loss detection)

View file

@ -1,8 +1,6 @@
#ifndef _TFRC_H_ #ifndef _TFRC_H_
#define _TFRC_H_ #define _TFRC_H_
/* /*
* net/dccp/ccids/lib/tfrc.h
*
* Copyright (c) 2007 The University of Aberdeen, Scotland, UK * Copyright (c) 2007 The University of Aberdeen, Scotland, UK
* Copyright (c) 2005-6 The University of Waikato, Hamilton, New Zealand. * Copyright (c) 2005-6 The University of Waikato, Hamilton, New Zealand.
* Copyright (c) 2005-6 Ian McDonald <ian.mcdonald@jandi.co.nz> * Copyright (c) 2005-6 Ian McDonald <ian.mcdonald@jandi.co.nz>
@ -32,7 +30,7 @@ extern int tfrc_debug;
/* integer-arithmetic divisions of type (a * 1000000)/b */ /* integer-arithmetic divisions of type (a * 1000000)/b */
static inline u64 scaled_div(u64 a, u64 b) static inline u64 scaled_div(u64 a, u64 b)
{ {
BUG_ON(b==0); BUG_ON(b == 0);
return div64_u64(a * 1000000, b); return div64_u64(a * 1000000, b);
} }

View file

@ -1,6 +1,4 @@
/* /*
* net/dccp/ccids/lib/tfrc_equation.c
*
* Copyright (c) 2005 The University of Waikato, Hamilton, New Zealand. * Copyright (c) 2005 The University of Waikato, Hamilton, New Zealand.
* Copyright (c) 2005 Ian McDonald <ian.mcdonald@jandi.co.nz> * Copyright (c) 2005 Ian McDonald <ian.mcdonald@jandi.co.nz>
* Copyright (c) 2005 Arnaldo Carvalho de Melo <acme@conectiva.com.br> * Copyright (c) 2005 Arnaldo Carvalho de Melo <acme@conectiva.com.br>
@ -79,10 +77,10 @@
} }
With the given configuration, we have, with M = TFRC_CALC_X_ARRSIZE-1, With the given configuration, we have, with M = TFRC_CALC_X_ARRSIZE-1,
lookup[0][0] = g(1000000/(M+1)) = 1000000 * f(0.2%) lookup[0][0] = g(1000000/(M+1)) = 1000000 * f(0.2%)
lookup[M][0] = g(1000000) = 1000000 * f(100%) lookup[M][0] = g(1000000) = 1000000 * f(100%)
lookup[0][1] = g(TFRC_SMALLEST_P) = 1000000 * f(0.01%) lookup[0][1] = g(TFRC_SMALLEST_P) = 1000000 * f(0.01%)
lookup[M][1] = g(TFRC_CALC_X_SPLIT) = 1000000 * f(5%) lookup[M][1] = g(TFRC_CALC_X_SPLIT) = 1000000 * f(5%)
In summary, the two columns represent f(p) for the following ranges: In summary, the two columns represent f(p) for the following ranges:
* The first column is for 0.002 <= p <= 1.0 * The first column is for 0.002 <= p <= 1.0
@ -610,11 +608,10 @@ static inline u32 tfrc_binsearch(u32 fval, u8 small)
/** /**
* tfrc_calc_x - Calculate the send rate as per section 3.1 of RFC3448 * tfrc_calc_x - Calculate the send rate as per section 3.1 of RFC3448
* * @s: packet size in bytes
* @s: packet size in bytes * @R: RTT scaled by 1000000 (i.e., microseconds)
* @R: RTT scaled by 1000000 (i.e., microseconds) * @p: loss ratio estimate scaled by 1000000
* @p: loss ratio estimate scaled by 1000000 * Returns X_calc in bytes per second (not scaled).
* Returns X_calc in bytes per second (not scaled).
*/ */
u32 tfrc_calc_x(u16 s, u32 R, u32 p) u32 tfrc_calc_x(u16 s, u32 R, u32 p)
{ {
@ -630,17 +627,17 @@ u32 tfrc_calc_x(u16 s, u32 R, u32 p)
return ~0U; return ~0U;
} }
if (p <= TFRC_CALC_X_SPLIT) { /* 0.0000 < p <= 0.05 */ if (p <= TFRC_CALC_X_SPLIT) { /* 0.0000 < p <= 0.05 */
if (p < TFRC_SMALLEST_P) { /* 0.0000 < p < 0.0001 */ if (p < TFRC_SMALLEST_P) { /* 0.0000 < p < 0.0001 */
DCCP_WARN("Value of p (%d) below resolution. " DCCP_WARN("Value of p (%d) below resolution. "
"Substituting %d\n", p, TFRC_SMALLEST_P); "Substituting %d\n", p, TFRC_SMALLEST_P);
index = 0; index = 0;
} else /* 0.0001 <= p <= 0.05 */ } else /* 0.0001 <= p <= 0.05 */
index = p/TFRC_SMALLEST_P - 1; index = p/TFRC_SMALLEST_P - 1;
f = tfrc_calc_x_lookup[index][1]; f = tfrc_calc_x_lookup[index][1];
} else { /* 0.05 < p <= 1.00 */ } else { /* 0.05 < p <= 1.00 */
index = p/(1000000/TFRC_CALC_X_ARRSIZE) - 1; index = p/(1000000/TFRC_CALC_X_ARRSIZE) - 1;
f = tfrc_calc_x_lookup[index][0]; f = tfrc_calc_x_lookup[index][0];
@ -661,7 +658,6 @@ u32 tfrc_calc_x(u16 s, u32 R, u32 p)
/** /**
* tfrc_calc_x_reverse_lookup - try to find p given f(p) * tfrc_calc_x_reverse_lookup - try to find p given f(p)
*
* @fvalue: function value to match, scaled by 1000000 * @fvalue: function value to match, scaled by 1000000
* Returns closest match for p, also scaled by 1000000 * Returns closest match for p, also scaled by 1000000
*/ */

View file

@ -948,7 +948,7 @@ static struct proto dccp_v4_prot = {
#endif #endif
}; };
static struct net_protocol dccp_v4_protocol = { static const struct net_protocol dccp_v4_protocol = {
.handler = dccp_v4_rcv, .handler = dccp_v4_rcv,
.err_handler = dccp_v4_err, .err_handler = dccp_v4_err,
.no_policy = 1, .no_policy = 1,

View file

@ -1152,13 +1152,13 @@ static struct proto dccp_v6_prot = {
#endif #endif
}; };
static struct inet6_protocol dccp_v6_protocol = { static const struct inet6_protocol dccp_v6_protocol = {
.handler = dccp_v6_rcv, .handler = dccp_v6_rcv,
.err_handler = dccp_v6_err, .err_handler = dccp_v6_err,
.flags = INET6_PROTO_NOPOLICY | INET6_PROTO_FINAL, .flags = INET6_PROTO_NOPOLICY | INET6_PROTO_FINAL,
}; };
static struct proto_ops inet6_dccp_ops = { static const struct proto_ops inet6_dccp_ops = {
.family = PF_INET6, .family = PF_INET6,
.owner = THIS_MODULE, .owner = THIS_MODULE,
.release = inet6_release, .release = inet6_release,

View file

@ -414,7 +414,7 @@ static int dgram_getsockopt(struct sock *sk, int level, int optname,
} }
static int dgram_setsockopt(struct sock *sk, int level, int optname, static int dgram_setsockopt(struct sock *sk, int level, int optname,
char __user *optval, int __user optlen) char __user *optval, int optlen)
{ {
struct dgram_sock *ro = dgram_sk(sk); struct dgram_sock *ro = dgram_sk(sk);
int val; int val;

View file

@ -35,6 +35,7 @@
#include <net/ieee802154_netdev.h> #include <net/ieee802154_netdev.h>
static unsigned int ieee802154_seq_num; static unsigned int ieee802154_seq_num;
static DEFINE_SPINLOCK(ieee802154_seq_lock);
static struct genl_family ieee802154_coordinator_family = { static struct genl_family ieee802154_coordinator_family = {
.id = GENL_ID_GENERATE, .id = GENL_ID_GENERATE,
@ -57,12 +58,15 @@ static struct sk_buff *ieee802154_nl_create(int flags, u8 req)
{ {
void *hdr; void *hdr;
struct sk_buff *msg = nlmsg_new(NLMSG_GOODSIZE, GFP_ATOMIC); struct sk_buff *msg = nlmsg_new(NLMSG_GOODSIZE, GFP_ATOMIC);
unsigned long f;
if (!msg) if (!msg)
return NULL; return NULL;
spin_lock_irqsave(&ieee802154_seq_lock, f);
hdr = genlmsg_put(msg, 0, ieee802154_seq_num++, hdr = genlmsg_put(msg, 0, ieee802154_seq_num++,
&ieee802154_coordinator_family, flags, req); &ieee802154_coordinator_family, flags, req);
spin_unlock_irqrestore(&ieee802154_seq_lock, f);
if (!hdr) { if (!hdr) {
nlmsg_free(msg); nlmsg_free(msg);
return NULL; return NULL;

View file

@ -244,7 +244,7 @@ static int raw_getsockopt(struct sock *sk, int level, int optname,
} }
static int raw_setsockopt(struct sock *sk, int level, int optname, static int raw_setsockopt(struct sock *sk, int level, int optname,
char __user *optval, int __user optlen) char __user *optval, int optlen)
{ {
return -EOPNOTSUPP; return -EOPNOTSUPP;
} }

View file

@ -244,7 +244,7 @@ EXPORT_SYMBOL(build_ehash_secret);
static inline int inet_netns_ok(struct net *net, int protocol) static inline int inet_netns_ok(struct net *net, int protocol)
{ {
int hash; int hash;
struct net_protocol *ipprot; const struct net_protocol *ipprot;
if (net_eq(net, &init_net)) if (net_eq(net, &init_net))
return 1; return 1;
@ -1162,7 +1162,7 @@ EXPORT_SYMBOL(inet_sk_rebuild_header);
static int inet_gso_send_check(struct sk_buff *skb) static int inet_gso_send_check(struct sk_buff *skb)
{ {
struct iphdr *iph; struct iphdr *iph;
struct net_protocol *ops; const struct net_protocol *ops;
int proto; int proto;
int ihl; int ihl;
int err = -EINVAL; int err = -EINVAL;
@ -1198,7 +1198,7 @@ static struct sk_buff *inet_gso_segment(struct sk_buff *skb, int features)
{ {
struct sk_buff *segs = ERR_PTR(-EINVAL); struct sk_buff *segs = ERR_PTR(-EINVAL);
struct iphdr *iph; struct iphdr *iph;
struct net_protocol *ops; const struct net_protocol *ops;
int proto; int proto;
int ihl; int ihl;
int id; int id;
@ -1265,7 +1265,7 @@ out:
static struct sk_buff **inet_gro_receive(struct sk_buff **head, static struct sk_buff **inet_gro_receive(struct sk_buff **head,
struct sk_buff *skb) struct sk_buff *skb)
{ {
struct net_protocol *ops; const struct net_protocol *ops;
struct sk_buff **pp = NULL; struct sk_buff **pp = NULL;
struct sk_buff *p; struct sk_buff *p;
struct iphdr *iph; struct iphdr *iph;
@ -1342,7 +1342,7 @@ out:
static int inet_gro_complete(struct sk_buff *skb) static int inet_gro_complete(struct sk_buff *skb)
{ {
struct net_protocol *ops; const struct net_protocol *ops;
struct iphdr *iph = ip_hdr(skb); struct iphdr *iph = ip_hdr(skb);
int proto = iph->protocol & (MAX_INET_PROTOS - 1); int proto = iph->protocol & (MAX_INET_PROTOS - 1);
int err = -ENOSYS; int err = -ENOSYS;
@ -1427,13 +1427,13 @@ void snmp_mib_free(void *ptr[2])
EXPORT_SYMBOL_GPL(snmp_mib_free); EXPORT_SYMBOL_GPL(snmp_mib_free);
#ifdef CONFIG_IP_MULTICAST #ifdef CONFIG_IP_MULTICAST
static struct net_protocol igmp_protocol = { static const struct net_protocol igmp_protocol = {
.handler = igmp_rcv, .handler = igmp_rcv,
.netns_ok = 1, .netns_ok = 1,
}; };
#endif #endif
static struct net_protocol tcp_protocol = { static const struct net_protocol tcp_protocol = {
.handler = tcp_v4_rcv, .handler = tcp_v4_rcv,
.err_handler = tcp_v4_err, .err_handler = tcp_v4_err,
.gso_send_check = tcp_v4_gso_send_check, .gso_send_check = tcp_v4_gso_send_check,
@ -1444,7 +1444,7 @@ static struct net_protocol tcp_protocol = {
.netns_ok = 1, .netns_ok = 1,
}; };
static struct net_protocol udp_protocol = { static const struct net_protocol udp_protocol = {
.handler = udp_rcv, .handler = udp_rcv,
.err_handler = udp_err, .err_handler = udp_err,
.gso_send_check = udp4_ufo_send_check, .gso_send_check = udp4_ufo_send_check,
@ -1453,7 +1453,7 @@ static struct net_protocol udp_protocol = {
.netns_ok = 1, .netns_ok = 1,
}; };
static struct net_protocol icmp_protocol = { static const struct net_protocol icmp_protocol = {
.handler = icmp_rcv, .handler = icmp_rcv,
.no_policy = 1, .no_policy = 1,
.netns_ok = 1, .netns_ok = 1,

View file

@ -311,7 +311,7 @@ static const struct xfrm_type ah_type =
.output = ah_output .output = ah_output
}; };
static struct net_protocol ah4_protocol = { static const struct net_protocol ah4_protocol = {
.handler = xfrm4_rcv, .handler = xfrm4_rcv,
.err_handler = ah4_err, .err_handler = ah4_err,
.no_policy = 1, .no_policy = 1,

View file

@ -1087,6 +1087,12 @@ static int inetdev_event(struct notifier_block *this, unsigned long event,
case NETDEV_DOWN: case NETDEV_DOWN:
ip_mc_down(in_dev); ip_mc_down(in_dev);
break; break;
case NETDEV_BONDING_OLDTYPE:
ip_mc_unmap(in_dev);
break;
case NETDEV_BONDING_NEWTYPE:
ip_mc_remap(in_dev);
break;
case NETDEV_CHANGEMTU: case NETDEV_CHANGEMTU:
if (inetdev_valid_mtu(dev->mtu)) if (inetdev_valid_mtu(dev->mtu))
break; break;

View file

@ -615,7 +615,7 @@ static const struct xfrm_type esp_type =
.output = esp_output .output = esp_output
}; };
static struct net_protocol esp4_protocol = { static const struct net_protocol esp4_protocol = {
.handler = xfrm4_rcv, .handler = xfrm4_rcv,
.err_handler = esp4_err, .err_handler = esp4_err,
.no_policy = 1, .no_policy = 1,

View file

@ -655,7 +655,7 @@ static void icmp_unreach(struct sk_buff *skb)
struct iphdr *iph; struct iphdr *iph;
struct icmphdr *icmph; struct icmphdr *icmph;
int hash, protocol; int hash, protocol;
struct net_protocol *ipprot; const struct net_protocol *ipprot;
u32 info = 0; u32 info = 0;
struct net *net; struct net *net;

View file

@ -1298,6 +1298,28 @@ void ip_mc_dec_group(struct in_device *in_dev, __be32 addr)
} }
} }
/* Device changing type */
void ip_mc_unmap(struct in_device *in_dev)
{
struct ip_mc_list *i;
ASSERT_RTNL();
for (i = in_dev->mc_list; i; i = i->next)
igmp_group_dropped(i);
}
void ip_mc_remap(struct in_device *in_dev)
{
struct ip_mc_list *i;
ASSERT_RTNL();
for (i = in_dev->mc_list; i; i = i->next)
igmp_group_added(i);
}
/* Device going down */ /* Device going down */
void ip_mc_down(struct in_device *in_dev) void ip_mc_down(struct in_device *in_dev)

View file

@ -1288,7 +1288,7 @@ static void ipgre_fb_tunnel_init(struct net_device *dev)
} }
static struct net_protocol ipgre_protocol = { static const struct net_protocol ipgre_protocol = {
.handler = ipgre_rcv, .handler = ipgre_rcv,
.err_handler = ipgre_err, .err_handler = ipgre_err,
.netns_ok = 1, .netns_ok = 1,

View file

@ -202,7 +202,7 @@ static int ip_local_deliver_finish(struct sk_buff *skb)
{ {
int protocol = ip_hdr(skb)->protocol; int protocol = ip_hdr(skb)->protocol;
int hash, raw; int hash, raw;
struct net_protocol *ipprot; const struct net_protocol *ipprot;
resubmit: resubmit:
raw = raw_local_deliver(skb, protocol); raw = raw_local_deliver(skb, protocol);

View file

@ -146,7 +146,7 @@ static const struct xfrm_type ipcomp_type = {
.output = ipcomp_output .output = ipcomp_output
}; };
static struct net_protocol ipcomp4_protocol = { static const struct net_protocol ipcomp4_protocol = {
.handler = xfrm4_rcv, .handler = xfrm4_rcv,
.err_handler = ipcomp4_err, .err_handler = ipcomp4_err,
.no_policy = 1, .no_policy = 1,

View file

@ -99,10 +99,6 @@ static int ipmr_cache_report(struct net *net,
struct sk_buff *pkt, vifi_t vifi, int assert); struct sk_buff *pkt, vifi_t vifi, int assert);
static int ipmr_fill_mroute(struct sk_buff *skb, struct mfc_cache *c, struct rtmsg *rtm); static int ipmr_fill_mroute(struct sk_buff *skb, struct mfc_cache *c, struct rtmsg *rtm);
#ifdef CONFIG_IP_PIMSM_V2
static struct net_protocol pim_protocol;
#endif
static struct timer_list ipmr_expire_timer; static struct timer_list ipmr_expire_timer;
/* Service routines creating virtual interfaces: DVMRP tunnels and PIMREG */ /* Service routines creating virtual interfaces: DVMRP tunnels and PIMREG */
@ -1945,7 +1941,7 @@ static const struct file_operations ipmr_mfc_fops = {
#endif #endif
#ifdef CONFIG_IP_PIMSM_V2 #ifdef CONFIG_IP_PIMSM_V2
static struct net_protocol pim_protocol = { static const struct net_protocol pim_protocol = {
.handler = pim_rcv, .handler = pim_rcv,
.netns_ok = 1, .netns_ok = 1,
}; };

View file

@ -28,14 +28,14 @@
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <net/protocol.h> #include <net/protocol.h>
struct net_protocol *inet_protos[MAX_INET_PROTOS] ____cacheline_aligned_in_smp; const struct net_protocol *inet_protos[MAX_INET_PROTOS] ____cacheline_aligned_in_smp;
static DEFINE_SPINLOCK(inet_proto_lock); static DEFINE_SPINLOCK(inet_proto_lock);
/* /*
* Add a protocol handler to the hash tables * Add a protocol handler to the hash tables
*/ */
int inet_add_protocol(struct net_protocol *prot, unsigned char protocol) int inet_add_protocol(const struct net_protocol *prot, unsigned char protocol)
{ {
int hash, ret; int hash, ret;
@ -57,7 +57,7 @@ int inet_add_protocol(struct net_protocol *prot, unsigned char protocol)
* Remove a protocol from the hash tables. * Remove a protocol from the hash tables.
*/ */
int inet_del_protocol(struct net_protocol *prot, unsigned char protocol) int inet_del_protocol(const struct net_protocol *prot, unsigned char protocol)
{ {
int hash, ret; int hash, ret;

View file

@ -2012,7 +2012,7 @@ int tcp_disconnect(struct sock *sk, int flags)
tp->snd_cwnd = 2; tp->snd_cwnd = 2;
icsk->icsk_probes_out = 0; icsk->icsk_probes_out = 0;
tp->packets_out = 0; tp->packets_out = 0;
tp->snd_ssthresh = 0x7fffffff; tp->snd_ssthresh = TCP_INFINITE_SSTHRESH;
tp->snd_cwnd_cnt = 0; tp->snd_cwnd_cnt = 0;
tp->bytes_acked = 0; tp->bytes_acked = 0;
tcp_set_ca_state(sk, TCP_CA_Open); tcp_set_ca_state(sk, TCP_CA_Open);

View file

@ -761,7 +761,7 @@ void tcp_update_metrics(struct sock *sk)
set_dst_metric_rtt(dst, RTAX_RTTVAR, var); set_dst_metric_rtt(dst, RTAX_RTTVAR, var);
} }
if (tp->snd_ssthresh >= 0xFFFF) { if (tcp_in_initial_slowstart(tp)) {
/* Slow start still did not finish. */ /* Slow start still did not finish. */
if (dst_metric(dst, RTAX_SSTHRESH) && if (dst_metric(dst, RTAX_SSTHRESH) &&
!dst_metric_locked(dst, RTAX_SSTHRESH) && !dst_metric_locked(dst, RTAX_SSTHRESH) &&

View file

@ -1808,7 +1808,7 @@ static int tcp_v4_init_sock(struct sock *sk)
/* See draft-stevens-tcpca-spec-01 for discussion of the /* See draft-stevens-tcpca-spec-01 for discussion of the
* initialization of these values. * initialization of these values.
*/ */
tp->snd_ssthresh = 0x7fffffff; /* Infinity */ tp->snd_ssthresh = TCP_INFINITE_SSTHRESH;
tp->snd_cwnd_clamp = ~0; tp->snd_cwnd_clamp = ~0;
tp->mss_cache = 536; tp->mss_cache = 536;
@ -2284,7 +2284,7 @@ static void get_tcp4_sock(struct sock *sk, struct seq_file *f, int i, int *len)
jiffies_to_clock_t(icsk->icsk_ack.ato), jiffies_to_clock_t(icsk->icsk_ack.ato),
(icsk->icsk_ack.quick << 1) | icsk->icsk_ack.pingpong, (icsk->icsk_ack.quick << 1) | icsk->icsk_ack.pingpong,
tp->snd_cwnd, tp->snd_cwnd,
tp->snd_ssthresh >= 0xFFFF ? -1 : tp->snd_ssthresh, tcp_in_initial_slowstart(tp) ? -1 : tp->snd_ssthresh,
len); len);
} }

View file

@ -363,7 +363,7 @@ void tcp_twsk_destructor(struct sock *sk)
#ifdef CONFIG_TCP_MD5SIG #ifdef CONFIG_TCP_MD5SIG
struct tcp_timewait_sock *twsk = tcp_twsk(sk); struct tcp_timewait_sock *twsk = tcp_twsk(sk);
if (twsk->tw_md5_keylen) if (twsk->tw_md5_keylen)
tcp_put_md5sig_pool(); tcp_free_md5sig_pool();
#endif #endif
} }
@ -410,7 +410,7 @@ struct sock *tcp_create_openreq_child(struct sock *sk, struct request_sock *req,
newtp->retrans_out = 0; newtp->retrans_out = 0;
newtp->sacked_out = 0; newtp->sacked_out = 0;
newtp->fackets_out = 0; newtp->fackets_out = 0;
newtp->snd_ssthresh = 0x7fffffff; newtp->snd_ssthresh = TCP_INFINITE_SSTHRESH;
/* So many TCP implementations out there (incorrectly) count the /* So many TCP implementations out there (incorrectly) count the
* initial SYN frame in their delayed-ACK and congestion control * initial SYN frame in their delayed-ACK and congestion control

View file

@ -132,7 +132,7 @@ static void tunnel64_err(struct sk_buff *skb, u32 info)
} }
#endif #endif
static struct net_protocol tunnel4_protocol = { static const struct net_protocol tunnel4_protocol = {
.handler = tunnel4_rcv, .handler = tunnel4_rcv,
.err_handler = tunnel4_err, .err_handler = tunnel4_err,
.no_policy = 1, .no_policy = 1,
@ -140,7 +140,7 @@ static struct net_protocol tunnel4_protocol = {
}; };
#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
static struct net_protocol tunnel64_protocol = { static const struct net_protocol tunnel64_protocol = {
.handler = tunnel64_rcv, .handler = tunnel64_rcv,
.err_handler = tunnel64_err, .err_handler = tunnel64_err,
.no_policy = 1, .no_policy = 1,

View file

@ -25,7 +25,7 @@ static void udplite_err(struct sk_buff *skb, u32 info)
__udp4_lib_err(skb, info, &udplite_table); __udp4_lib_err(skb, info, &udplite_table);
} }
static struct net_protocol udplite_protocol = { static const struct net_protocol udplite_protocol = {
.handler = udplite_rcv, .handler = udplite_rcv,
.err_handler = udplite_err, .err_handler = udplite_err,
.no_policy = 1, .no_policy = 1,

View file

@ -137,6 +137,8 @@ static DEFINE_SPINLOCK(addrconf_verify_lock);
static void addrconf_join_anycast(struct inet6_ifaddr *ifp); static void addrconf_join_anycast(struct inet6_ifaddr *ifp);
static void addrconf_leave_anycast(struct inet6_ifaddr *ifp); static void addrconf_leave_anycast(struct inet6_ifaddr *ifp);
static void addrconf_bonding_change(struct net_device *dev,
unsigned long event);
static int addrconf_ifdown(struct net_device *dev, int how); static int addrconf_ifdown(struct net_device *dev, int how);
static void addrconf_dad_start(struct inet6_ifaddr *ifp, u32 flags); static void addrconf_dad_start(struct inet6_ifaddr *ifp, u32 flags);
@ -1405,8 +1407,8 @@ void addrconf_dad_failure(struct inet6_ifaddr *ifp)
struct inet6_dev *idev = ifp->idev; struct inet6_dev *idev = ifp->idev;
if (net_ratelimit()) if (net_ratelimit())
printk(KERN_INFO "%s: IPv6 duplicate address detected!\n", printk(KERN_INFO "%s: IPv6 duplicate address %pI6c detected!\n",
ifp->idev->dev->name); ifp->idev->dev->name, &ifp->addr);
if (idev->cnf.accept_dad > 1 && !idev->cnf.disable_ipv6) { if (idev->cnf.accept_dad > 1 && !idev->cnf.disable_ipv6) {
struct in6_addr addr; struct in6_addr addr;
@ -2582,6 +2584,10 @@ static int addrconf_notify(struct notifier_block *this, unsigned long event,
return notifier_from_errno(err); return notifier_from_errno(err);
} }
break; break;
case NETDEV_BONDING_OLDTYPE:
case NETDEV_BONDING_NEWTYPE:
addrconf_bonding_change(dev, event);
break;
} }
return NOTIFY_OK; return NOTIFY_OK;
@ -2595,6 +2601,19 @@ static struct notifier_block ipv6_dev_notf = {
.priority = 0 .priority = 0
}; };
static void addrconf_bonding_change(struct net_device *dev, unsigned long event)
{
struct inet6_dev *idev;
ASSERT_RTNL();
idev = __in6_dev_get(dev);
if (event == NETDEV_BONDING_NEWTYPE)
ipv6_mc_remap(idev);
else if (event == NETDEV_BONDING_OLDTYPE)
ipv6_mc_unmap(idev);
}
static int addrconf_ifdown(struct net_device *dev, int how) static int addrconf_ifdown(struct net_device *dev, int how)
{ {
struct inet6_dev *idev; struct inet6_dev *idev;

View file

@ -710,7 +710,7 @@ EXPORT_SYMBOL_GPL(ipv6_opt_accepted);
static int ipv6_gso_pull_exthdrs(struct sk_buff *skb, int proto) static int ipv6_gso_pull_exthdrs(struct sk_buff *skb, int proto)
{ {
struct inet6_protocol *ops = NULL; const struct inet6_protocol *ops = NULL;
for (;;) { for (;;) {
struct ipv6_opt_hdr *opth; struct ipv6_opt_hdr *opth;
@ -745,7 +745,7 @@ static int ipv6_gso_pull_exthdrs(struct sk_buff *skb, int proto)
static int ipv6_gso_send_check(struct sk_buff *skb) static int ipv6_gso_send_check(struct sk_buff *skb)
{ {
struct ipv6hdr *ipv6h; struct ipv6hdr *ipv6h;
struct inet6_protocol *ops; const struct inet6_protocol *ops;
int err = -EINVAL; int err = -EINVAL;
if (unlikely(!pskb_may_pull(skb, sizeof(*ipv6h)))) if (unlikely(!pskb_may_pull(skb, sizeof(*ipv6h))))
@ -773,7 +773,7 @@ static struct sk_buff *ipv6_gso_segment(struct sk_buff *skb, int features)
{ {
struct sk_buff *segs = ERR_PTR(-EINVAL); struct sk_buff *segs = ERR_PTR(-EINVAL);
struct ipv6hdr *ipv6h; struct ipv6hdr *ipv6h;
struct inet6_protocol *ops; const struct inet6_protocol *ops;
int proto; int proto;
struct frag_hdr *fptr; struct frag_hdr *fptr;
unsigned int unfrag_ip6hlen; unsigned int unfrag_ip6hlen;
@ -840,7 +840,7 @@ struct ipv6_gro_cb {
static struct sk_buff **ipv6_gro_receive(struct sk_buff **head, static struct sk_buff **ipv6_gro_receive(struct sk_buff **head,
struct sk_buff *skb) struct sk_buff *skb)
{ {
struct inet6_protocol *ops; const struct inet6_protocol *ops;
struct sk_buff **pp = NULL; struct sk_buff **pp = NULL;
struct sk_buff *p; struct sk_buff *p;
struct ipv6hdr *iph; struct ipv6hdr *iph;
@ -926,7 +926,7 @@ out:
static int ipv6_gro_complete(struct sk_buff *skb) static int ipv6_gro_complete(struct sk_buff *skb)
{ {
struct inet6_protocol *ops; const struct inet6_protocol *ops;
struct ipv6hdr *iph = ipv6_hdr(skb); struct ipv6hdr *iph = ipv6_hdr(skb);
int err = -ENOSYS; int err = -ENOSYS;

View file

@ -527,7 +527,7 @@ static const struct xfrm_type ah6_type =
.hdr_offset = xfrm6_find_1stfragopt, .hdr_offset = xfrm6_find_1stfragopt,
}; };
static struct inet6_protocol ah6_protocol = { static const struct inet6_protocol ah6_protocol = {
.handler = xfrm6_rcv, .handler = xfrm6_rcv,
.err_handler = ah6_err, .err_handler = ah6_err,
.flags = INET6_PROTO_NOPOLICY, .flags = INET6_PROTO_NOPOLICY,

View file

@ -558,7 +558,7 @@ static const struct xfrm_type esp6_type =
.hdr_offset = xfrm6_find_1stfragopt, .hdr_offset = xfrm6_find_1stfragopt,
}; };
static struct inet6_protocol esp6_protocol = { static const struct inet6_protocol esp6_protocol = {
.handler = xfrm6_rcv, .handler = xfrm6_rcv,
.err_handler = esp6_err, .err_handler = esp6_err,
.flags = INET6_PROTO_NOPOLICY, .flags = INET6_PROTO_NOPOLICY,

View file

@ -500,17 +500,17 @@ unknown_rh:
return -1; return -1;
} }
static struct inet6_protocol rthdr_protocol = { static const struct inet6_protocol rthdr_protocol = {
.handler = ipv6_rthdr_rcv, .handler = ipv6_rthdr_rcv,
.flags = INET6_PROTO_NOPOLICY | INET6_PROTO_GSO_EXTHDR, .flags = INET6_PROTO_NOPOLICY | INET6_PROTO_GSO_EXTHDR,
}; };
static struct inet6_protocol destopt_protocol = { static const struct inet6_protocol destopt_protocol = {
.handler = ipv6_destopt_rcv, .handler = ipv6_destopt_rcv,
.flags = INET6_PROTO_NOPOLICY | INET6_PROTO_GSO_EXTHDR, .flags = INET6_PROTO_NOPOLICY | INET6_PROTO_GSO_EXTHDR,
}; };
static struct inet6_protocol nodata_protocol = { static const struct inet6_protocol nodata_protocol = {
.handler = dst_discard, .handler = dst_discard,
.flags = INET6_PROTO_NOPOLICY, .flags = INET6_PROTO_NOPOLICY,
}; };

View file

@ -86,7 +86,7 @@ static inline struct sock *icmpv6_sk(struct net *net)
static int icmpv6_rcv(struct sk_buff *skb); static int icmpv6_rcv(struct sk_buff *skb);
static struct inet6_protocol icmpv6_protocol = { static const struct inet6_protocol icmpv6_protocol = {
.handler = icmpv6_rcv, .handler = icmpv6_rcv,
.flags = INET6_PROTO_NOPOLICY|INET6_PROTO_FINAL, .flags = INET6_PROTO_NOPOLICY|INET6_PROTO_FINAL,
}; };
@ -583,7 +583,7 @@ out:
static void icmpv6_notify(struct sk_buff *skb, u8 type, u8 code, __be32 info) static void icmpv6_notify(struct sk_buff *skb, u8 type, u8 code, __be32 info)
{ {
struct inet6_protocol *ipprot; const struct inet6_protocol *ipprot;
int inner_offset; int inner_offset;
int hash; int hash;
u8 nexthdr; u8 nexthdr;

View file

@ -159,7 +159,7 @@ drop:
static int ip6_input_finish(struct sk_buff *skb) static int ip6_input_finish(struct sk_buff *skb)
{ {
struct inet6_protocol *ipprot; const struct inet6_protocol *ipprot;
unsigned int nhoff; unsigned int nhoff;
int nexthdr, raw; int nexthdr, raw;
u8 hash; u8 hash;

View file

@ -83,10 +83,6 @@ static int ip6mr_cache_report(struct net *net, struct sk_buff *pkt,
static int ip6mr_fill_mroute(struct sk_buff *skb, struct mfc6_cache *c, struct rtmsg *rtm); static int ip6mr_fill_mroute(struct sk_buff *skb, struct mfc6_cache *c, struct rtmsg *rtm);
static void mroute_clean_tables(struct net *net); static void mroute_clean_tables(struct net *net);
#ifdef CONFIG_IPV6_PIMSM_V2
static struct inet6_protocol pim6_protocol;
#endif
static struct timer_list ipmr_expire_timer; static struct timer_list ipmr_expire_timer;
@ -410,7 +406,7 @@ static int pim6_rcv(struct sk_buff *skb)
return 0; return 0;
} }
static struct inet6_protocol pim6_protocol = { static const struct inet6_protocol pim6_protocol = {
.handler = pim6_rcv, .handler = pim6_rcv,
}; };

Some files were not shown because too many files have changed in this diff Show more