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: (31 commits) sctp: fix missing send up SCTP_SENDER_DRY_EVENT when subscribe it net: refine {udp|tcp|sctp}_mem limits vmxnet3: round down # of queues to power of two net: sh_eth: fix the parameter for the ETHER of SH7757 net: sh_eth: fix cannot work half-duplex mode net: vlan: enable soft features regardless of underlying device vmxnet3: fix starving rx ring whenoc_skb kb fails bridge: Always flood broadcast packets greth: greth_set_mac_add would corrupt the MAC address. net: bind() fix error return on wrong address family natsemi: silence dma-debug warnings net: 8139too: Initial necessary vlan_features to support vlan Fix call trace when interrupts are disabled while sleeping function kzalloc is called qlge:Version change to v1.00.00.29 qlge: Fix printk priority so chip fatal errors are always reported. qlge:Fix crash caused by mailbox execution on wedged chip. xfrm4: Don't call icmp_send on local error ipv4: Don't use ufo handling on later transformed packets xfrm: Remove family arg from xfrm_bundle_ok ipv6: Don't put artificial limit on routing table size. ...
This commit is contained in:
Коммит
85746e429f
|
@ -992,6 +992,7 @@ static int __devinit rtl8139_init_one (struct pci_dev *pdev,
|
||||||
* features
|
* features
|
||||||
*/
|
*/
|
||||||
dev->features |= NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_HIGHDMA;
|
dev->features |= NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_HIGHDMA;
|
||||||
|
dev->vlan_features = dev->features;
|
||||||
|
|
||||||
dev->irq = pdev->irq;
|
dev->irq = pdev->irq;
|
||||||
|
|
||||||
|
|
|
@ -1111,7 +1111,7 @@ bnad_mbox_irq_alloc(struct bnad *bnad,
|
||||||
struct bna_intr_info *intr_info)
|
struct bna_intr_info *intr_info)
|
||||||
{
|
{
|
||||||
int err = 0;
|
int err = 0;
|
||||||
unsigned long flags;
|
unsigned long irq_flags = 0, flags;
|
||||||
u32 irq;
|
u32 irq;
|
||||||
irq_handler_t irq_handler;
|
irq_handler_t irq_handler;
|
||||||
|
|
||||||
|
@ -1125,18 +1125,17 @@ bnad_mbox_irq_alloc(struct bnad *bnad,
|
||||||
if (bnad->cfg_flags & BNAD_CF_MSIX) {
|
if (bnad->cfg_flags & BNAD_CF_MSIX) {
|
||||||
irq_handler = (irq_handler_t)bnad_msix_mbox_handler;
|
irq_handler = (irq_handler_t)bnad_msix_mbox_handler;
|
||||||
irq = bnad->msix_table[bnad->msix_num - 1].vector;
|
irq = bnad->msix_table[bnad->msix_num - 1].vector;
|
||||||
flags = 0;
|
|
||||||
intr_info->intr_type = BNA_INTR_T_MSIX;
|
intr_info->intr_type = BNA_INTR_T_MSIX;
|
||||||
intr_info->idl[0].vector = bnad->msix_num - 1;
|
intr_info->idl[0].vector = bnad->msix_num - 1;
|
||||||
} else {
|
} else {
|
||||||
irq_handler = (irq_handler_t)bnad_isr;
|
irq_handler = (irq_handler_t)bnad_isr;
|
||||||
irq = bnad->pcidev->irq;
|
irq = bnad->pcidev->irq;
|
||||||
flags = IRQF_SHARED;
|
irq_flags = IRQF_SHARED;
|
||||||
intr_info->intr_type = BNA_INTR_T_INTX;
|
intr_info->intr_type = BNA_INTR_T_INTX;
|
||||||
/* intr_info->idl.vector = 0 ? */
|
/* intr_info->idl.vector = 0 ? */
|
||||||
}
|
}
|
||||||
spin_unlock_irqrestore(&bnad->bna_lock, flags);
|
spin_unlock_irqrestore(&bnad->bna_lock, flags);
|
||||||
|
flags = irq_flags;
|
||||||
sprintf(bnad->mbox_irq_name, "%s", BNAD_NAME);
|
sprintf(bnad->mbox_irq_name, "%s", BNAD_NAME);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -1015,11 +1015,10 @@ static int greth_set_mac_add(struct net_device *dev, void *p)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
|
memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
|
||||||
|
GRETH_REGSAVE(regs->esa_msb, dev->dev_addr[0] << 8 | dev->dev_addr[1]);
|
||||||
|
GRETH_REGSAVE(regs->esa_lsb, dev->dev_addr[2] << 24 | dev->dev_addr[3] << 16 |
|
||||||
|
dev->dev_addr[4] << 8 | dev->dev_addr[5]);
|
||||||
|
|
||||||
GRETH_REGSAVE(regs->esa_msb, addr->sa_data[0] << 8 | addr->sa_data[1]);
|
|
||||||
GRETH_REGSAVE(regs->esa_lsb,
|
|
||||||
addr->sa_data[2] << 24 | addr->
|
|
||||||
sa_data[3] << 16 | addr->sa_data[4] << 8 | addr->sa_data[5]);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -692,10 +692,10 @@ static void sixpack_close(struct tty_struct *tty)
|
||||||
{
|
{
|
||||||
struct sixpack *sp;
|
struct sixpack *sp;
|
||||||
|
|
||||||
write_lock(&disc_data_lock);
|
write_lock_bh(&disc_data_lock);
|
||||||
sp = tty->disc_data;
|
sp = tty->disc_data;
|
||||||
tty->disc_data = NULL;
|
tty->disc_data = NULL;
|
||||||
write_unlock(&disc_data_lock);
|
write_unlock_bh(&disc_data_lock);
|
||||||
if (!sp)
|
if (!sp)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
|
@ -813,10 +813,10 @@ static void mkiss_close(struct tty_struct *tty)
|
||||||
{
|
{
|
||||||
struct mkiss *ax;
|
struct mkiss *ax;
|
||||||
|
|
||||||
write_lock(&disc_data_lock);
|
write_lock_bh(&disc_data_lock);
|
||||||
ax = tty->disc_data;
|
ax = tty->disc_data;
|
||||||
tty->disc_data = NULL;
|
tty->disc_data = NULL;
|
||||||
write_unlock(&disc_data_lock);
|
write_unlock_bh(&disc_data_lock);
|
||||||
|
|
||||||
if (!ax)
|
if (!ax)
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -2360,7 +2360,8 @@ static void netdev_rx(struct net_device *dev, int *work_done, int work_to_do)
|
||||||
PCI_DMA_FROMDEVICE);
|
PCI_DMA_FROMDEVICE);
|
||||||
} else {
|
} else {
|
||||||
pci_unmap_single(np->pci_dev, np->rx_dma[entry],
|
pci_unmap_single(np->pci_dev, np->rx_dma[entry],
|
||||||
buflen, PCI_DMA_FROMDEVICE);
|
buflen + NATSEMI_PADDING,
|
||||||
|
PCI_DMA_FROMDEVICE);
|
||||||
skb_put(skb = np->rx_skbuff[entry], pkt_len);
|
skb_put(skb = np->rx_skbuff[entry], pkt_len);
|
||||||
np->rx_skbuff[entry] = NULL;
|
np->rx_skbuff[entry] = NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
*/
|
*/
|
||||||
#define DRV_NAME "qlge"
|
#define DRV_NAME "qlge"
|
||||||
#define DRV_STRING "QLogic 10 Gigabit PCI-E Ethernet Driver "
|
#define DRV_STRING "QLogic 10 Gigabit PCI-E Ethernet Driver "
|
||||||
#define DRV_VERSION "v1.00.00.27.00.00-01"
|
#define DRV_VERSION "v1.00.00.29.00.00-01"
|
||||||
|
|
||||||
#define WQ_ADDR_ALIGN 0x3 /* 4 byte alignment */
|
#define WQ_ADDR_ALIGN 0x3 /* 4 byte alignment */
|
||||||
|
|
||||||
|
@ -1996,6 +1996,7 @@ enum {
|
||||||
QL_LB_LINK_UP = 10,
|
QL_LB_LINK_UP = 10,
|
||||||
QL_FRC_COREDUMP = 11,
|
QL_FRC_COREDUMP = 11,
|
||||||
QL_EEH_FATAL = 12,
|
QL_EEH_FATAL = 12,
|
||||||
|
QL_ASIC_RECOVERY = 14, /* We are in ascic recovery. */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* link_status bit definitions */
|
/* link_status bit definitions */
|
||||||
|
|
|
@ -2152,6 +2152,10 @@ void ql_queue_asic_error(struct ql_adapter *qdev)
|
||||||
* thread
|
* thread
|
||||||
*/
|
*/
|
||||||
clear_bit(QL_ADAPTER_UP, &qdev->flags);
|
clear_bit(QL_ADAPTER_UP, &qdev->flags);
|
||||||
|
/* Set asic recovery bit to indicate reset process that we are
|
||||||
|
* in fatal error recovery process rather than normal close
|
||||||
|
*/
|
||||||
|
set_bit(QL_ASIC_RECOVERY, &qdev->flags);
|
||||||
queue_delayed_work(qdev->workqueue, &qdev->asic_reset_work, 0);
|
queue_delayed_work(qdev->workqueue, &qdev->asic_reset_work, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2166,23 +2170,20 @@ static void ql_process_chip_ae_intr(struct ql_adapter *qdev,
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case CAM_LOOKUP_ERR_EVENT:
|
case CAM_LOOKUP_ERR_EVENT:
|
||||||
netif_err(qdev, link, qdev->ndev,
|
netdev_err(qdev->ndev, "Multiple CAM hits lookup occurred.\n");
|
||||||
"Multiple CAM hits lookup occurred.\n");
|
netdev_err(qdev->ndev, "This event shouldn't occur.\n");
|
||||||
netif_err(qdev, drv, qdev->ndev,
|
|
||||||
"This event shouldn't occur.\n");
|
|
||||||
ql_queue_asic_error(qdev);
|
ql_queue_asic_error(qdev);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case SOFT_ECC_ERROR_EVENT:
|
case SOFT_ECC_ERROR_EVENT:
|
||||||
netif_err(qdev, rx_err, qdev->ndev,
|
netdev_err(qdev->ndev, "Soft ECC error detected.\n");
|
||||||
"Soft ECC error detected.\n");
|
|
||||||
ql_queue_asic_error(qdev);
|
ql_queue_asic_error(qdev);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PCI_ERR_ANON_BUF_RD:
|
case PCI_ERR_ANON_BUF_RD:
|
||||||
netif_err(qdev, rx_err, qdev->ndev,
|
netdev_err(qdev->ndev, "PCI error occurred when reading "
|
||||||
"PCI error occurred when reading anonymous buffers from rx_ring %d.\n",
|
"anonymous buffers from rx_ring %d.\n",
|
||||||
ib_ae_rsp->q_id);
|
ib_ae_rsp->q_id);
|
||||||
ql_queue_asic_error(qdev);
|
ql_queue_asic_error(qdev);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -2437,11 +2438,10 @@ static irqreturn_t qlge_isr(int irq, void *dev_id)
|
||||||
*/
|
*/
|
||||||
if (var & STS_FE) {
|
if (var & STS_FE) {
|
||||||
ql_queue_asic_error(qdev);
|
ql_queue_asic_error(qdev);
|
||||||
netif_err(qdev, intr, qdev->ndev,
|
netdev_err(qdev->ndev, "Got fatal error, STS = %x.\n", var);
|
||||||
"Got fatal error, STS = %x.\n", var);
|
|
||||||
var = ql_read32(qdev, ERR_STS);
|
var = ql_read32(qdev, ERR_STS);
|
||||||
netif_err(qdev, intr, qdev->ndev,
|
netdev_err(qdev->ndev, "Resetting chip. "
|
||||||
"Resetting chip. Error Status Register = 0x%x\n", var);
|
"Error Status Register = 0x%x\n", var);
|
||||||
return IRQ_HANDLED;
|
return IRQ_HANDLED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3818,11 +3818,17 @@ static int ql_adapter_reset(struct ql_adapter *qdev)
|
||||||
end_jiffies = jiffies +
|
end_jiffies = jiffies +
|
||||||
max((unsigned long)1, usecs_to_jiffies(30));
|
max((unsigned long)1, usecs_to_jiffies(30));
|
||||||
|
|
||||||
/* Stop management traffic. */
|
/* Check if bit is set then skip the mailbox command and
|
||||||
ql_mb_set_mgmnt_traffic_ctl(qdev, MB_SET_MPI_TFK_STOP);
|
* clear the bit, else we are in normal reset process.
|
||||||
|
*/
|
||||||
|
if (!test_bit(QL_ASIC_RECOVERY, &qdev->flags)) {
|
||||||
|
/* Stop management traffic. */
|
||||||
|
ql_mb_set_mgmnt_traffic_ctl(qdev, MB_SET_MPI_TFK_STOP);
|
||||||
|
|
||||||
/* Wait for the NIC and MGMNT FIFOs to empty. */
|
/* Wait for the NIC and MGMNT FIFOs to empty. */
|
||||||
ql_wait_fifo_empty(qdev);
|
ql_wait_fifo_empty(qdev);
|
||||||
|
} else
|
||||||
|
clear_bit(QL_ASIC_RECOVERY, &qdev->flags);
|
||||||
|
|
||||||
ql_write32(qdev, RST_FO, (RST_FO_FR << 16) | RST_FO_FR);
|
ql_write32(qdev, RST_FO, (RST_FO_FR << 16) | RST_FO_FR);
|
||||||
|
|
||||||
|
|
|
@ -140,6 +140,8 @@ static struct sh_eth_cpu_data sh_eth_my_cpu_data = {
|
||||||
.tpauser = 1,
|
.tpauser = 1,
|
||||||
.hw_swap = 1,
|
.hw_swap = 1,
|
||||||
.no_ade = 1,
|
.no_ade = 1,
|
||||||
|
.rpadir = 1,
|
||||||
|
.rpadir_value = 2 << 16,
|
||||||
};
|
};
|
||||||
|
|
||||||
#define SH_GIGA_ETH_BASE 0xfee00000
|
#define SH_GIGA_ETH_BASE 0xfee00000
|
||||||
|
@ -1184,8 +1186,8 @@ static void sh_eth_adjust_link(struct net_device *ndev)
|
||||||
mdp->cd->set_rate(ndev);
|
mdp->cd->set_rate(ndev);
|
||||||
}
|
}
|
||||||
if (mdp->link == PHY_DOWN) {
|
if (mdp->link == PHY_DOWN) {
|
||||||
sh_eth_write(ndev, (sh_eth_read(ndev, ECMR) & ~ECMR_TXF)
|
sh_eth_write(ndev,
|
||||||
| ECMR_DM, ECMR);
|
(sh_eth_read(ndev, ECMR) & ~ECMR_TXF), ECMR);
|
||||||
new_state = 1;
|
new_state = 1;
|
||||||
mdp->link = phydev->link;
|
mdp->link = phydev->link;
|
||||||
}
|
}
|
||||||
|
|
|
@ -575,7 +575,7 @@ vmxnet3_rq_alloc_rx_buf(struct vmxnet3_rx_queue *rq, u32 ring_idx,
|
||||||
struct vmxnet3_cmd_ring *ring = &rq->rx_ring[ring_idx];
|
struct vmxnet3_cmd_ring *ring = &rq->rx_ring[ring_idx];
|
||||||
u32 val;
|
u32 val;
|
||||||
|
|
||||||
while (num_allocated < num_to_alloc) {
|
while (num_allocated <= num_to_alloc) {
|
||||||
struct vmxnet3_rx_buf_info *rbi;
|
struct vmxnet3_rx_buf_info *rbi;
|
||||||
union Vmxnet3_GenericDesc *gd;
|
union Vmxnet3_GenericDesc *gd;
|
||||||
|
|
||||||
|
@ -621,9 +621,15 @@ vmxnet3_rq_alloc_rx_buf(struct vmxnet3_rx_queue *rq, u32 ring_idx,
|
||||||
|
|
||||||
BUG_ON(rbi->dma_addr == 0);
|
BUG_ON(rbi->dma_addr == 0);
|
||||||
gd->rxd.addr = cpu_to_le64(rbi->dma_addr);
|
gd->rxd.addr = cpu_to_le64(rbi->dma_addr);
|
||||||
gd->dword[2] = cpu_to_le32((ring->gen << VMXNET3_RXD_GEN_SHIFT)
|
gd->dword[2] = cpu_to_le32((!ring->gen << VMXNET3_RXD_GEN_SHIFT)
|
||||||
| val | rbi->len);
|
| val | rbi->len);
|
||||||
|
|
||||||
|
/* Fill the last buffer but dont mark it ready, or else the
|
||||||
|
* device will think that the queue is full */
|
||||||
|
if (num_allocated == num_to_alloc)
|
||||||
|
break;
|
||||||
|
|
||||||
|
gd->dword[2] |= cpu_to_le32(ring->gen << VMXNET3_RXD_GEN_SHIFT);
|
||||||
num_allocated++;
|
num_allocated++;
|
||||||
vmxnet3_cmd_ring_adv_next2fill(ring);
|
vmxnet3_cmd_ring_adv_next2fill(ring);
|
||||||
}
|
}
|
||||||
|
@ -1140,6 +1146,7 @@ vmxnet3_rq_rx_complete(struct vmxnet3_rx_queue *rq,
|
||||||
VMXNET3_REG_RXPROD, VMXNET3_REG_RXPROD2
|
VMXNET3_REG_RXPROD, VMXNET3_REG_RXPROD2
|
||||||
};
|
};
|
||||||
u32 num_rxd = 0;
|
u32 num_rxd = 0;
|
||||||
|
bool skip_page_frags = false;
|
||||||
struct Vmxnet3_RxCompDesc *rcd;
|
struct Vmxnet3_RxCompDesc *rcd;
|
||||||
struct vmxnet3_rx_ctx *ctx = &rq->rx_ctx;
|
struct vmxnet3_rx_ctx *ctx = &rq->rx_ctx;
|
||||||
#ifdef __BIG_ENDIAN_BITFIELD
|
#ifdef __BIG_ENDIAN_BITFIELD
|
||||||
|
@ -1150,11 +1157,12 @@ vmxnet3_rq_rx_complete(struct vmxnet3_rx_queue *rq,
|
||||||
&rxComp);
|
&rxComp);
|
||||||
while (rcd->gen == rq->comp_ring.gen) {
|
while (rcd->gen == rq->comp_ring.gen) {
|
||||||
struct vmxnet3_rx_buf_info *rbi;
|
struct vmxnet3_rx_buf_info *rbi;
|
||||||
struct sk_buff *skb;
|
struct sk_buff *skb, *new_skb = NULL;
|
||||||
|
struct page *new_page = NULL;
|
||||||
int num_to_alloc;
|
int num_to_alloc;
|
||||||
struct Vmxnet3_RxDesc *rxd;
|
struct Vmxnet3_RxDesc *rxd;
|
||||||
u32 idx, ring_idx;
|
u32 idx, ring_idx;
|
||||||
|
struct vmxnet3_cmd_ring *ring = NULL;
|
||||||
if (num_rxd >= quota) {
|
if (num_rxd >= quota) {
|
||||||
/* we may stop even before we see the EOP desc of
|
/* we may stop even before we see the EOP desc of
|
||||||
* the current pkt
|
* the current pkt
|
||||||
|
@ -1165,6 +1173,7 @@ vmxnet3_rq_rx_complete(struct vmxnet3_rx_queue *rq,
|
||||||
BUG_ON(rcd->rqID != rq->qid && rcd->rqID != rq->qid2);
|
BUG_ON(rcd->rqID != rq->qid && rcd->rqID != rq->qid2);
|
||||||
idx = rcd->rxdIdx;
|
idx = rcd->rxdIdx;
|
||||||
ring_idx = rcd->rqID < adapter->num_rx_queues ? 0 : 1;
|
ring_idx = rcd->rqID < adapter->num_rx_queues ? 0 : 1;
|
||||||
|
ring = rq->rx_ring + ring_idx;
|
||||||
vmxnet3_getRxDesc(rxd, &rq->rx_ring[ring_idx].base[idx].rxd,
|
vmxnet3_getRxDesc(rxd, &rq->rx_ring[ring_idx].base[idx].rxd,
|
||||||
&rxCmdDesc);
|
&rxCmdDesc);
|
||||||
rbi = rq->buf_info[ring_idx] + idx;
|
rbi = rq->buf_info[ring_idx] + idx;
|
||||||
|
@ -1193,37 +1202,80 @@ vmxnet3_rq_rx_complete(struct vmxnet3_rx_queue *rq,
|
||||||
goto rcd_done;
|
goto rcd_done;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
skip_page_frags = false;
|
||||||
ctx->skb = rbi->skb;
|
ctx->skb = rbi->skb;
|
||||||
rbi->skb = NULL;
|
new_skb = dev_alloc_skb(rbi->len + NET_IP_ALIGN);
|
||||||
|
if (new_skb == NULL) {
|
||||||
|
/* Skb allocation failed, do not handover this
|
||||||
|
* skb to stack. Reuse it. Drop the existing pkt
|
||||||
|
*/
|
||||||
|
rq->stats.rx_buf_alloc_failure++;
|
||||||
|
ctx->skb = NULL;
|
||||||
|
rq->stats.drop_total++;
|
||||||
|
skip_page_frags = true;
|
||||||
|
goto rcd_done;
|
||||||
|
}
|
||||||
|
|
||||||
pci_unmap_single(adapter->pdev, rbi->dma_addr, rbi->len,
|
pci_unmap_single(adapter->pdev, rbi->dma_addr, rbi->len,
|
||||||
PCI_DMA_FROMDEVICE);
|
PCI_DMA_FROMDEVICE);
|
||||||
|
|
||||||
skb_put(ctx->skb, rcd->len);
|
skb_put(ctx->skb, rcd->len);
|
||||||
|
|
||||||
|
/* Immediate refill */
|
||||||
|
new_skb->dev = adapter->netdev;
|
||||||
|
skb_reserve(new_skb, NET_IP_ALIGN);
|
||||||
|
rbi->skb = new_skb;
|
||||||
|
rbi->dma_addr = pci_map_single(adapter->pdev,
|
||||||
|
rbi->skb->data, rbi->len,
|
||||||
|
PCI_DMA_FROMDEVICE);
|
||||||
|
rxd->addr = cpu_to_le64(rbi->dma_addr);
|
||||||
|
rxd->len = rbi->len;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
BUG_ON(ctx->skb == NULL);
|
BUG_ON(ctx->skb == NULL && !skip_page_frags);
|
||||||
|
|
||||||
/* non SOP buffer must be type 1 in most cases */
|
/* non SOP buffer must be type 1 in most cases */
|
||||||
if (rbi->buf_type == VMXNET3_RX_BUF_PAGE) {
|
BUG_ON(rbi->buf_type != VMXNET3_RX_BUF_PAGE);
|
||||||
BUG_ON(rxd->btype != VMXNET3_RXD_BTYPE_BODY);
|
BUG_ON(rxd->btype != VMXNET3_RXD_BTYPE_BODY);
|
||||||
|
|
||||||
if (rcd->len) {
|
/* If an sop buffer was dropped, skip all
|
||||||
pci_unmap_page(adapter->pdev,
|
* following non-sop fragments. They will be reused.
|
||||||
rbi->dma_addr, rbi->len,
|
*/
|
||||||
PCI_DMA_FROMDEVICE);
|
if (skip_page_frags)
|
||||||
|
goto rcd_done;
|
||||||
|
|
||||||
vmxnet3_append_frag(ctx->skb, rcd, rbi);
|
new_page = alloc_page(GFP_ATOMIC);
|
||||||
rbi->page = NULL;
|
if (unlikely(new_page == NULL)) {
|
||||||
}
|
/* Replacement page frag could not be allocated.
|
||||||
} else {
|
* Reuse this page. Drop the pkt and free the
|
||||||
/*
|
* skb which contained this page as a frag. Skip
|
||||||
* The only time a non-SOP buffer is type 0 is
|
* processing all the following non-sop frags.
|
||||||
* when it's EOP and error flag is raised, which
|
|
||||||
* has already been handled.
|
|
||||||
*/
|
*/
|
||||||
BUG_ON(true);
|
rq->stats.rx_buf_alloc_failure++;
|
||||||
|
dev_kfree_skb(ctx->skb);
|
||||||
|
ctx->skb = NULL;
|
||||||
|
skip_page_frags = true;
|
||||||
|
goto rcd_done;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (rcd->len) {
|
||||||
|
pci_unmap_page(adapter->pdev,
|
||||||
|
rbi->dma_addr, rbi->len,
|
||||||
|
PCI_DMA_FROMDEVICE);
|
||||||
|
|
||||||
|
vmxnet3_append_frag(ctx->skb, rcd, rbi);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Immediate refill */
|
||||||
|
rbi->page = new_page;
|
||||||
|
rbi->dma_addr = pci_map_page(adapter->pdev, rbi->page,
|
||||||
|
0, PAGE_SIZE,
|
||||||
|
PCI_DMA_FROMDEVICE);
|
||||||
|
rxd->addr = cpu_to_le64(rbi->dma_addr);
|
||||||
|
rxd->len = rbi->len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
skb = ctx->skb;
|
skb = ctx->skb;
|
||||||
if (rcd->eop) {
|
if (rcd->eop) {
|
||||||
skb->len += skb->data_len;
|
skb->len += skb->data_len;
|
||||||
|
@ -1244,26 +1296,27 @@ vmxnet3_rq_rx_complete(struct vmxnet3_rx_queue *rq,
|
||||||
}
|
}
|
||||||
|
|
||||||
rcd_done:
|
rcd_done:
|
||||||
/* device may skip some rx descs */
|
/* device may have skipped some rx descs */
|
||||||
rq->rx_ring[ring_idx].next2comp = idx;
|
ring->next2comp = idx;
|
||||||
VMXNET3_INC_RING_IDX_ONLY(rq->rx_ring[ring_idx].next2comp,
|
num_to_alloc = vmxnet3_cmd_ring_desc_avail(ring);
|
||||||
rq->rx_ring[ring_idx].size);
|
ring = rq->rx_ring + ring_idx;
|
||||||
|
while (num_to_alloc) {
|
||||||
|
vmxnet3_getRxDesc(rxd, &ring->base[ring->next2fill].rxd,
|
||||||
|
&rxCmdDesc);
|
||||||
|
BUG_ON(!rxd->addr);
|
||||||
|
|
||||||
/* refill rx buffers frequently to avoid starving the h/w */
|
/* Recv desc is ready to be used by the device */
|
||||||
num_to_alloc = vmxnet3_cmd_ring_desc_avail(rq->rx_ring +
|
rxd->gen = ring->gen;
|
||||||
ring_idx);
|
vmxnet3_cmd_ring_adv_next2fill(ring);
|
||||||
if (unlikely(num_to_alloc > VMXNET3_RX_ALLOC_THRESHOLD(rq,
|
num_to_alloc--;
|
||||||
ring_idx, adapter))) {
|
}
|
||||||
vmxnet3_rq_alloc_rx_buf(rq, ring_idx, num_to_alloc,
|
|
||||||
adapter);
|
|
||||||
|
|
||||||
/* if needed, update the register */
|
/* if needed, update the register */
|
||||||
if (unlikely(rq->shared->updateRxProd)) {
|
if (unlikely(rq->shared->updateRxProd)) {
|
||||||
VMXNET3_WRITE_BAR0_REG(adapter,
|
VMXNET3_WRITE_BAR0_REG(adapter,
|
||||||
rxprod_reg[ring_idx] + rq->qid * 8,
|
rxprod_reg[ring_idx] + rq->qid * 8,
|
||||||
rq->rx_ring[ring_idx].next2fill);
|
ring->next2fill);
|
||||||
rq->uncommitted[ring_idx] = 0;
|
rq->uncommitted[ring_idx] = 0;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
vmxnet3_comp_ring_adv_next2proc(&rq->comp_ring);
|
vmxnet3_comp_ring_adv_next2proc(&rq->comp_ring);
|
||||||
|
@ -2894,6 +2947,7 @@ vmxnet3_probe_device(struct pci_dev *pdev,
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
num_rx_queues = 1;
|
num_rx_queues = 1;
|
||||||
|
num_rx_queues = rounddown_pow_of_two(num_rx_queues);
|
||||||
|
|
||||||
if (enable_mq)
|
if (enable_mq)
|
||||||
num_tx_queues = min(VMXNET3_DEVICE_MAX_TX_QUEUES,
|
num_tx_queues = min(VMXNET3_DEVICE_MAX_TX_QUEUES,
|
||||||
|
@ -2901,6 +2955,7 @@ vmxnet3_probe_device(struct pci_dev *pdev,
|
||||||
else
|
else
|
||||||
num_tx_queues = 1;
|
num_tx_queues = 1;
|
||||||
|
|
||||||
|
num_tx_queues = rounddown_pow_of_two(num_tx_queues);
|
||||||
netdev = alloc_etherdev_mq(sizeof(struct vmxnet3_adapter),
|
netdev = alloc_etherdev_mq(sizeof(struct vmxnet3_adapter),
|
||||||
max(num_tx_queues, num_rx_queues));
|
max(num_tx_queues, num_rx_queues));
|
||||||
printk(KERN_INFO "# of Tx queues : %d, # of Rx queues : %d\n",
|
printk(KERN_INFO "# of Tx queues : %d, # of Rx queues : %d\n",
|
||||||
|
@ -3085,6 +3140,7 @@ vmxnet3_remove_device(struct pci_dev *pdev)
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
num_rx_queues = 1;
|
num_rx_queues = 1;
|
||||||
|
num_rx_queues = rounddown_pow_of_two(num_rx_queues);
|
||||||
|
|
||||||
cancel_work_sync(&adapter->work);
|
cancel_work_sync(&adapter->work);
|
||||||
|
|
||||||
|
|
|
@ -55,6 +55,7 @@
|
||||||
#include <linux/if_vlan.h>
|
#include <linux/if_vlan.h>
|
||||||
#include <linux/if_arp.h>
|
#include <linux/if_arp.h>
|
||||||
#include <linux/inetdevice.h>
|
#include <linux/inetdevice.h>
|
||||||
|
#include <linux/log2.h>
|
||||||
|
|
||||||
#include "vmxnet3_defs.h"
|
#include "vmxnet3_defs.h"
|
||||||
|
|
||||||
|
@ -68,10 +69,10 @@
|
||||||
/*
|
/*
|
||||||
* Version numbers
|
* Version numbers
|
||||||
*/
|
*/
|
||||||
#define VMXNET3_DRIVER_VERSION_STRING "1.1.9.0-k"
|
#define VMXNET3_DRIVER_VERSION_STRING "1.1.18.0-k"
|
||||||
|
|
||||||
/* a 32-bit int, each byte encode a verion number in VMXNET3_DRIVER_VERSION */
|
/* a 32-bit int, each byte encode a verion number in VMXNET3_DRIVER_VERSION */
|
||||||
#define VMXNET3_DRIVER_VERSION_NUM 0x01010900
|
#define VMXNET3_DRIVER_VERSION_NUM 0x01011200
|
||||||
|
|
||||||
#if defined(CONFIG_PCI_MSI)
|
#if defined(CONFIG_PCI_MSI)
|
||||||
/* RSS only makes sense if MSI-X is supported. */
|
/* RSS only makes sense if MSI-X is supported. */
|
||||||
|
|
|
@ -691,14 +691,12 @@ ath5k_eeprom_free_pcal_info(struct ath5k_hw *ah, int mode)
|
||||||
if (!chinfo[pier].pd_curves)
|
if (!chinfo[pier].pd_curves)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
for (pdg = 0; pdg < ee->ee_pd_gains[mode]; pdg++) {
|
for (pdg = 0; pdg < AR5K_EEPROM_N_PD_CURVES; pdg++) {
|
||||||
struct ath5k_pdgain_info *pd =
|
struct ath5k_pdgain_info *pd =
|
||||||
&chinfo[pier].pd_curves[pdg];
|
&chinfo[pier].pd_curves[pdg];
|
||||||
|
|
||||||
if (pd != NULL) {
|
kfree(pd->pd_step);
|
||||||
kfree(pd->pd_step);
|
kfree(pd->pd_pwr);
|
||||||
kfree(pd->pd_pwr);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
kfree(chinfo[pier].pd_curves);
|
kfree(chinfo[pier].pd_curves);
|
||||||
|
|
|
@ -278,6 +278,12 @@ static int ath_pci_suspend(struct device *device)
|
||||||
|
|
||||||
ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, 1);
|
ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, 1);
|
||||||
|
|
||||||
|
/* The device has to be moved to FULLSLEEP forcibly.
|
||||||
|
* Otherwise the chip never moved to full sleep,
|
||||||
|
* when no interface is up.
|
||||||
|
*/
|
||||||
|
ath9k_hw_setpower(sc->sc_ah, ATH9K_PM_FULL_SLEEP);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -36,6 +36,7 @@
|
||||||
#include <net/mac80211.h>
|
#include <net/mac80211.h>
|
||||||
#include <linux/etherdevice.h>
|
#include <linux/etherdevice.h>
|
||||||
#include <asm/unaligned.h>
|
#include <asm/unaligned.h>
|
||||||
|
#include <linux/stringify.h>
|
||||||
|
|
||||||
#include "iwl-eeprom.h"
|
#include "iwl-eeprom.h"
|
||||||
#include "iwl-dev.h"
|
#include "iwl-dev.h"
|
||||||
|
@ -55,10 +56,10 @@
|
||||||
#define IWL100_UCODE_API_MIN 5
|
#define IWL100_UCODE_API_MIN 5
|
||||||
|
|
||||||
#define IWL1000_FW_PRE "iwlwifi-1000-"
|
#define IWL1000_FW_PRE "iwlwifi-1000-"
|
||||||
#define IWL1000_MODULE_FIRMWARE(api) IWL1000_FW_PRE #api ".ucode"
|
#define IWL1000_MODULE_FIRMWARE(api) IWL1000_FW_PRE __stringify(api) ".ucode"
|
||||||
|
|
||||||
#define IWL100_FW_PRE "iwlwifi-100-"
|
#define IWL100_FW_PRE "iwlwifi-100-"
|
||||||
#define IWL100_MODULE_FIRMWARE(api) IWL100_FW_PRE #api ".ucode"
|
#define IWL100_MODULE_FIRMWARE(api) IWL100_FW_PRE __stringify(api) ".ucode"
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -36,6 +36,7 @@
|
||||||
#include <net/mac80211.h>
|
#include <net/mac80211.h>
|
||||||
#include <linux/etherdevice.h>
|
#include <linux/etherdevice.h>
|
||||||
#include <asm/unaligned.h>
|
#include <asm/unaligned.h>
|
||||||
|
#include <linux/stringify.h>
|
||||||
|
|
||||||
#include "iwl-eeprom.h"
|
#include "iwl-eeprom.h"
|
||||||
#include "iwl-dev.h"
|
#include "iwl-dev.h"
|
||||||
|
@ -58,13 +59,13 @@
|
||||||
#define IWL105_UCODE_API_MIN 5
|
#define IWL105_UCODE_API_MIN 5
|
||||||
|
|
||||||
#define IWL2030_FW_PRE "iwlwifi-2030-"
|
#define IWL2030_FW_PRE "iwlwifi-2030-"
|
||||||
#define IWL2030_MODULE_FIRMWARE(api) IWL2030_FW_PRE #api ".ucode"
|
#define IWL2030_MODULE_FIRMWARE(api) IWL2030_FW_PRE __stringify(api) ".ucode"
|
||||||
|
|
||||||
#define IWL2000_FW_PRE "iwlwifi-2000-"
|
#define IWL2000_FW_PRE "iwlwifi-2000-"
|
||||||
#define IWL2000_MODULE_FIRMWARE(api) IWL2000_FW_PRE #api ".ucode"
|
#define IWL2000_MODULE_FIRMWARE(api) IWL2000_FW_PRE __stringify(api) ".ucode"
|
||||||
|
|
||||||
#define IWL105_FW_PRE "iwlwifi-105-"
|
#define IWL105_FW_PRE "iwlwifi-105-"
|
||||||
#define IWL105_MODULE_FIRMWARE(api) IWL105_FW_PRE #api ".ucode"
|
#define IWL105_MODULE_FIRMWARE(api) IWL105_FW_PRE __stringify(api) ".ucode"
|
||||||
|
|
||||||
static void iwl2000_set_ct_threshold(struct iwl_priv *priv)
|
static void iwl2000_set_ct_threshold(struct iwl_priv *priv)
|
||||||
{
|
{
|
||||||
|
|
|
@ -37,6 +37,7 @@
|
||||||
#include <net/mac80211.h>
|
#include <net/mac80211.h>
|
||||||
#include <linux/etherdevice.h>
|
#include <linux/etherdevice.h>
|
||||||
#include <asm/unaligned.h>
|
#include <asm/unaligned.h>
|
||||||
|
#include <linux/stringify.h>
|
||||||
|
|
||||||
#include "iwl-eeprom.h"
|
#include "iwl-eeprom.h"
|
||||||
#include "iwl-dev.h"
|
#include "iwl-dev.h"
|
||||||
|
@ -57,10 +58,10 @@
|
||||||
#define IWL5150_UCODE_API_MIN 1
|
#define IWL5150_UCODE_API_MIN 1
|
||||||
|
|
||||||
#define IWL5000_FW_PRE "iwlwifi-5000-"
|
#define IWL5000_FW_PRE "iwlwifi-5000-"
|
||||||
#define IWL5000_MODULE_FIRMWARE(api) IWL5000_FW_PRE #api ".ucode"
|
#define IWL5000_MODULE_FIRMWARE(api) IWL5000_FW_PRE __stringify(api) ".ucode"
|
||||||
|
|
||||||
#define IWL5150_FW_PRE "iwlwifi-5150-"
|
#define IWL5150_FW_PRE "iwlwifi-5150-"
|
||||||
#define IWL5150_MODULE_FIRMWARE(api) IWL5150_FW_PRE #api ".ucode"
|
#define IWL5150_MODULE_FIRMWARE(api) IWL5150_FW_PRE __stringify(api) ".ucode"
|
||||||
|
|
||||||
/* NIC configuration for 5000 series */
|
/* NIC configuration for 5000 series */
|
||||||
static void iwl5000_nic_config(struct iwl_priv *priv)
|
static void iwl5000_nic_config(struct iwl_priv *priv)
|
||||||
|
|
|
@ -36,6 +36,7 @@
|
||||||
#include <net/mac80211.h>
|
#include <net/mac80211.h>
|
||||||
#include <linux/etherdevice.h>
|
#include <linux/etherdevice.h>
|
||||||
#include <asm/unaligned.h>
|
#include <asm/unaligned.h>
|
||||||
|
#include <linux/stringify.h>
|
||||||
|
|
||||||
#include "iwl-eeprom.h"
|
#include "iwl-eeprom.h"
|
||||||
#include "iwl-dev.h"
|
#include "iwl-dev.h"
|
||||||
|
@ -58,16 +59,16 @@
|
||||||
#define IWL6000G2_UCODE_API_MIN 4
|
#define IWL6000G2_UCODE_API_MIN 4
|
||||||
|
|
||||||
#define IWL6000_FW_PRE "iwlwifi-6000-"
|
#define IWL6000_FW_PRE "iwlwifi-6000-"
|
||||||
#define IWL6000_MODULE_FIRMWARE(api) IWL6000_FW_PRE #api ".ucode"
|
#define IWL6000_MODULE_FIRMWARE(api) IWL6000_FW_PRE __stringify(api) ".ucode"
|
||||||
|
|
||||||
#define IWL6050_FW_PRE "iwlwifi-6050-"
|
#define IWL6050_FW_PRE "iwlwifi-6050-"
|
||||||
#define IWL6050_MODULE_FIRMWARE(api) IWL6050_FW_PRE #api ".ucode"
|
#define IWL6050_MODULE_FIRMWARE(api) IWL6050_FW_PRE __stringify(api) ".ucode"
|
||||||
|
|
||||||
#define IWL6005_FW_PRE "iwlwifi-6000g2a-"
|
#define IWL6005_FW_PRE "iwlwifi-6000g2a-"
|
||||||
#define IWL6005_MODULE_FIRMWARE(api) IWL6005_FW_PRE #api ".ucode"
|
#define IWL6005_MODULE_FIRMWARE(api) IWL6005_FW_PRE __stringify(api) ".ucode"
|
||||||
|
|
||||||
#define IWL6030_FW_PRE "iwlwifi-6000g2b-"
|
#define IWL6030_FW_PRE "iwlwifi-6000g2b-"
|
||||||
#define IWL6030_MODULE_FIRMWARE(api) IWL6030_FW_PRE #api ".ucode"
|
#define IWL6030_MODULE_FIRMWARE(api) IWL6030_FW_PRE __stringify(api) ".ucode"
|
||||||
|
|
||||||
static void iwl6000_set_ct_threshold(struct iwl_priv *priv)
|
static void iwl6000_set_ct_threshold(struct iwl_priv *priv)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1763,6 +1763,7 @@ int iwl_mac_change_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
||||||
struct iwl_rxon_context *ctx = iwl_rxon_ctx_from_vif(vif);
|
struct iwl_rxon_context *ctx = iwl_rxon_ctx_from_vif(vif);
|
||||||
struct iwl_rxon_context *bss_ctx = &priv->contexts[IWL_RXON_CTX_BSS];
|
struct iwl_rxon_context *bss_ctx = &priv->contexts[IWL_RXON_CTX_BSS];
|
||||||
struct iwl_rxon_context *tmp;
|
struct iwl_rxon_context *tmp;
|
||||||
|
enum nl80211_iftype newviftype = newtype;
|
||||||
u32 interface_modes;
|
u32 interface_modes;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
|
@ -1818,7 +1819,7 @@ int iwl_mac_change_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
||||||
|
|
||||||
/* success */
|
/* success */
|
||||||
iwl_teardown_interface(priv, vif, true);
|
iwl_teardown_interface(priv, vif, true);
|
||||||
vif->type = newtype;
|
vif->type = newviftype;
|
||||||
vif->p2p = newp2p;
|
vif->p2p = newp2p;
|
||||||
err = iwl_setup_interface(priv, ctx);
|
err = iwl_setup_interface(priv, ctx);
|
||||||
WARN_ON(err);
|
WARN_ON(err);
|
||||||
|
|
|
@ -126,7 +126,7 @@ static inline u8 iwl_tfd_get_num_tbs(struct iwl_tfd *tfd)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void iwlagn_unmap_tfd(struct iwl_priv *priv, struct iwl_cmd_meta *meta,
|
static void iwlagn_unmap_tfd(struct iwl_priv *priv, struct iwl_cmd_meta *meta,
|
||||||
struct iwl_tfd *tfd)
|
struct iwl_tfd *tfd, int dma_dir)
|
||||||
{
|
{
|
||||||
struct pci_dev *dev = priv->pci_dev;
|
struct pci_dev *dev = priv->pci_dev;
|
||||||
int i;
|
int i;
|
||||||
|
@ -151,7 +151,7 @@ static void iwlagn_unmap_tfd(struct iwl_priv *priv, struct iwl_cmd_meta *meta,
|
||||||
/* Unmap chunks, if any. */
|
/* Unmap chunks, if any. */
|
||||||
for (i = 1; i < num_tbs; i++)
|
for (i = 1; i < num_tbs; i++)
|
||||||
pci_unmap_single(dev, iwl_tfd_tb_get_addr(tfd, i),
|
pci_unmap_single(dev, iwl_tfd_tb_get_addr(tfd, i),
|
||||||
iwl_tfd_tb_get_len(tfd, i), PCI_DMA_TODEVICE);
|
iwl_tfd_tb_get_len(tfd, i), dma_dir);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -167,7 +167,8 @@ void iwlagn_txq_free_tfd(struct iwl_priv *priv, struct iwl_tx_queue *txq)
|
||||||
struct iwl_tfd *tfd_tmp = txq->tfds;
|
struct iwl_tfd *tfd_tmp = txq->tfds;
|
||||||
int index = txq->q.read_ptr;
|
int index = txq->q.read_ptr;
|
||||||
|
|
||||||
iwlagn_unmap_tfd(priv, &txq->meta[index], &tfd_tmp[index]);
|
iwlagn_unmap_tfd(priv, &txq->meta[index], &tfd_tmp[index],
|
||||||
|
PCI_DMA_TODEVICE);
|
||||||
|
|
||||||
/* free SKB */
|
/* free SKB */
|
||||||
if (txq->txb) {
|
if (txq->txb) {
|
||||||
|
@ -310,9 +311,7 @@ void iwl_cmd_queue_unmap(struct iwl_priv *priv)
|
||||||
i = get_cmd_index(q, q->read_ptr);
|
i = get_cmd_index(q, q->read_ptr);
|
||||||
|
|
||||||
if (txq->meta[i].flags & CMD_MAPPED) {
|
if (txq->meta[i].flags & CMD_MAPPED) {
|
||||||
pci_unmap_single(priv->pci_dev,
|
iwlagn_unmap_tfd(priv, &txq->meta[i], &txq->tfds[i],
|
||||||
dma_unmap_addr(&txq->meta[i], mapping),
|
|
||||||
dma_unmap_len(&txq->meta[i], len),
|
|
||||||
PCI_DMA_BIDIRECTIONAL);
|
PCI_DMA_BIDIRECTIONAL);
|
||||||
txq->meta[i].flags = 0;
|
txq->meta[i].flags = 0;
|
||||||
}
|
}
|
||||||
|
@ -535,12 +534,7 @@ out_free_arrays:
|
||||||
void iwl_tx_queue_reset(struct iwl_priv *priv, struct iwl_tx_queue *txq,
|
void iwl_tx_queue_reset(struct iwl_priv *priv, struct iwl_tx_queue *txq,
|
||||||
int slots_num, u32 txq_id)
|
int slots_num, u32 txq_id)
|
||||||
{
|
{
|
||||||
int actual_slots = slots_num;
|
memset(txq->meta, 0, sizeof(struct iwl_cmd_meta) * slots_num);
|
||||||
|
|
||||||
if (txq_id == priv->cmd_queue)
|
|
||||||
actual_slots++;
|
|
||||||
|
|
||||||
memset(txq->meta, 0, sizeof(struct iwl_cmd_meta) * actual_slots);
|
|
||||||
|
|
||||||
txq->need_update = 0;
|
txq->need_update = 0;
|
||||||
|
|
||||||
|
@ -700,10 +694,11 @@ int iwl_enqueue_hcmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd)
|
||||||
if (!(cmd->dataflags[i] & IWL_HCMD_DFL_NOCOPY))
|
if (!(cmd->dataflags[i] & IWL_HCMD_DFL_NOCOPY))
|
||||||
continue;
|
continue;
|
||||||
phys_addr = pci_map_single(priv->pci_dev, (void *)cmd->data[i],
|
phys_addr = pci_map_single(priv->pci_dev, (void *)cmd->data[i],
|
||||||
cmd->len[i], PCI_DMA_TODEVICE);
|
cmd->len[i], PCI_DMA_BIDIRECTIONAL);
|
||||||
if (pci_dma_mapping_error(priv->pci_dev, phys_addr)) {
|
if (pci_dma_mapping_error(priv->pci_dev, phys_addr)) {
|
||||||
iwlagn_unmap_tfd(priv, out_meta,
|
iwlagn_unmap_tfd(priv, out_meta,
|
||||||
&txq->tfds[q->write_ptr]);
|
&txq->tfds[q->write_ptr],
|
||||||
|
PCI_DMA_BIDIRECTIONAL);
|
||||||
idx = -ENOMEM;
|
idx = -ENOMEM;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
@ -807,7 +802,7 @@ void iwl_tx_cmd_complete(struct iwl_priv *priv, struct iwl_rx_mem_buffer *rxb)
|
||||||
cmd = txq->cmd[cmd_index];
|
cmd = txq->cmd[cmd_index];
|
||||||
meta = &txq->meta[cmd_index];
|
meta = &txq->meta[cmd_index];
|
||||||
|
|
||||||
iwlagn_unmap_tfd(priv, meta, &txq->tfds[index]);
|
iwlagn_unmap_tfd(priv, meta, &txq->tfds[index], PCI_DMA_BIDIRECTIONAL);
|
||||||
|
|
||||||
/* Input error checking is done when commands are added to queue. */
|
/* Input error checking is done when commands are added to queue. */
|
||||||
if (meta->flags & CMD_WANT_SKB) {
|
if (meta->flags & CMD_WANT_SKB) {
|
||||||
|
|
|
@ -2688,7 +2688,7 @@ void cfg80211_send_unprot_disassoc(struct net_device *dev, const u8 *buf,
|
||||||
* @dev: network device
|
* @dev: network device
|
||||||
* @addr: The source MAC address of the frame
|
* @addr: The source MAC address of the frame
|
||||||
* @key_type: The key type that the received frame used
|
* @key_type: The key type that the received frame used
|
||||||
* @key_id: Key identifier (0..3)
|
* @key_id: Key identifier (0..3). Can be -1 if missing.
|
||||||
* @tsc: The TSC value of the frame that generated the MIC failure (6 octets)
|
* @tsc: The TSC value of the frame that generated the MIC failure (6 octets)
|
||||||
* @gfp: allocation flags
|
* @gfp: allocation flags
|
||||||
*
|
*
|
||||||
|
|
|
@ -77,6 +77,7 @@ struct dst_entry {
|
||||||
#define DST_NOPOLICY 0x0004
|
#define DST_NOPOLICY 0x0004
|
||||||
#define DST_NOHASH 0x0008
|
#define DST_NOHASH 0x0008
|
||||||
#define DST_NOCACHE 0x0010
|
#define DST_NOCACHE 0x0010
|
||||||
|
#define DST_NOCOUNT 0x0020
|
||||||
union {
|
union {
|
||||||
struct dst_entry *next;
|
struct dst_entry *next;
|
||||||
struct rtable __rcu *rt_next;
|
struct rtable __rcu *rt_next;
|
||||||
|
|
|
@ -586,9 +586,14 @@ static void vlan_dev_uninit(struct net_device *dev)
|
||||||
static u32 vlan_dev_fix_features(struct net_device *dev, u32 features)
|
static u32 vlan_dev_fix_features(struct net_device *dev, u32 features)
|
||||||
{
|
{
|
||||||
struct net_device *real_dev = vlan_dev_info(dev)->real_dev;
|
struct net_device *real_dev = vlan_dev_info(dev)->real_dev;
|
||||||
|
u32 old_features = features;
|
||||||
|
|
||||||
features &= real_dev->features;
|
features &= real_dev->features;
|
||||||
features &= real_dev->vlan_features;
|
features &= real_dev->vlan_features;
|
||||||
|
|
||||||
|
if (old_features & NETIF_F_SOFT_FEATURES)
|
||||||
|
features |= old_features & NETIF_F_SOFT_FEATURES;
|
||||||
|
|
||||||
if (dev_ethtool_get_rx_csum(real_dev))
|
if (dev_ethtool_get_rx_csum(real_dev))
|
||||||
features |= NETIF_F_RXCSUM;
|
features |= NETIF_F_RXCSUM;
|
||||||
features |= NETIF_F_LLTX;
|
features |= NETIF_F_LLTX;
|
||||||
|
|
|
@ -49,7 +49,9 @@ netdev_tx_t br_dev_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||||
skb_pull(skb, ETH_HLEN);
|
skb_pull(skb, ETH_HLEN);
|
||||||
|
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
if (is_multicast_ether_addr(dest)) {
|
if (is_broadcast_ether_addr(dest))
|
||||||
|
br_flood_deliver(br, skb);
|
||||||
|
else if (is_multicast_ether_addr(dest)) {
|
||||||
if (unlikely(netpoll_tx_running(dev))) {
|
if (unlikely(netpoll_tx_running(dev))) {
|
||||||
br_flood_deliver(br, skb);
|
br_flood_deliver(br, skb);
|
||||||
goto out;
|
goto out;
|
||||||
|
|
|
@ -60,7 +60,7 @@ int br_handle_frame_finish(struct sk_buff *skb)
|
||||||
br = p->br;
|
br = p->br;
|
||||||
br_fdb_update(br, p, eth_hdr(skb)->h_source);
|
br_fdb_update(br, p, eth_hdr(skb)->h_source);
|
||||||
|
|
||||||
if (is_multicast_ether_addr(dest) &&
|
if (!is_broadcast_ether_addr(dest) && is_multicast_ether_addr(dest) &&
|
||||||
br_multicast_rcv(br, p, skb))
|
br_multicast_rcv(br, p, skb))
|
||||||
goto drop;
|
goto drop;
|
||||||
|
|
||||||
|
@ -77,7 +77,9 @@ int br_handle_frame_finish(struct sk_buff *skb)
|
||||||
|
|
||||||
dst = NULL;
|
dst = NULL;
|
||||||
|
|
||||||
if (is_multicast_ether_addr(dest)) {
|
if (is_broadcast_ether_addr(dest))
|
||||||
|
skb2 = skb;
|
||||||
|
else if (is_multicast_ether_addr(dest)) {
|
||||||
mdst = br_mdb_get(br, skb);
|
mdst = br_mdb_get(br, skb);
|
||||||
if (mdst || BR_INPUT_SKB_CB_MROUTERS_ONLY(skb)) {
|
if (mdst || BR_INPUT_SKB_CB_MROUTERS_ONLY(skb)) {
|
||||||
if ((mdst && mdst->mglist) ||
|
if ((mdst && mdst->mglist) ||
|
||||||
|
|
|
@ -190,7 +190,8 @@ void *dst_alloc(struct dst_ops *ops, struct net_device *dev,
|
||||||
dst->lastuse = jiffies;
|
dst->lastuse = jiffies;
|
||||||
dst->flags = flags;
|
dst->flags = flags;
|
||||||
dst->next = NULL;
|
dst->next = NULL;
|
||||||
dst_entries_add(ops, 1);
|
if (!(flags & DST_NOCOUNT))
|
||||||
|
dst_entries_add(ops, 1);
|
||||||
return dst;
|
return dst;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(dst_alloc);
|
EXPORT_SYMBOL(dst_alloc);
|
||||||
|
@ -243,7 +244,8 @@ again:
|
||||||
neigh_release(neigh);
|
neigh_release(neigh);
|
||||||
}
|
}
|
||||||
|
|
||||||
dst_entries_add(dst->ops, -1);
|
if (!(dst->flags & DST_NOCOUNT))
|
||||||
|
dst_entries_add(dst->ops, -1);
|
||||||
|
|
||||||
if (dst->ops->destroy)
|
if (dst->ops->destroy)
|
||||||
dst->ops->destroy(dst);
|
dst->ops->destroy(dst);
|
||||||
|
|
|
@ -465,8 +465,10 @@ int inet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
|
||||||
if (addr_len < sizeof(struct sockaddr_in))
|
if (addr_len < sizeof(struct sockaddr_in))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (addr->sin_family != AF_INET)
|
if (addr->sin_family != AF_INET) {
|
||||||
|
err = -EAFNOSUPPORT;
|
||||||
goto out;
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
chk_addr_ret = inet_addr_type(sock_net(sk), addr->sin_addr.s_addr);
|
chk_addr_ret = inet_addr_type(sock_net(sk), addr->sin_addr.s_addr);
|
||||||
|
|
||||||
|
|
|
@ -828,7 +828,7 @@ static int __ip_append_data(struct sock *sk,
|
||||||
cork->length += length;
|
cork->length += length;
|
||||||
if (((length > mtu) || (skb && skb_is_gso(skb))) &&
|
if (((length > mtu) || (skb && skb_is_gso(skb))) &&
|
||||||
(sk->sk_protocol == IPPROTO_UDP) &&
|
(sk->sk_protocol == IPPROTO_UDP) &&
|
||||||
(rt->dst.dev->features & NETIF_F_UFO)) {
|
(rt->dst.dev->features & NETIF_F_UFO) && !rt->dst.header_len) {
|
||||||
err = ip_ufo_append_data(sk, queue, getfrag, from, length,
|
err = ip_ufo_append_data(sk, queue, getfrag, from, length,
|
||||||
hh_len, fragheaderlen, transhdrlen,
|
hh_len, fragheaderlen, transhdrlen,
|
||||||
mtu, flags);
|
mtu, flags);
|
||||||
|
|
|
@ -3220,7 +3220,7 @@ __setup("thash_entries=", set_thash_entries);
|
||||||
void __init tcp_init(void)
|
void __init tcp_init(void)
|
||||||
{
|
{
|
||||||
struct sk_buff *skb = NULL;
|
struct sk_buff *skb = NULL;
|
||||||
unsigned long nr_pages, limit;
|
unsigned long limit;
|
||||||
int i, max_share, cnt;
|
int i, max_share, cnt;
|
||||||
unsigned long jiffy = jiffies;
|
unsigned long jiffy = jiffies;
|
||||||
|
|
||||||
|
@ -3277,13 +3277,7 @@ void __init tcp_init(void)
|
||||||
sysctl_tcp_max_orphans = cnt / 2;
|
sysctl_tcp_max_orphans = cnt / 2;
|
||||||
sysctl_max_syn_backlog = max(128, cnt / 256);
|
sysctl_max_syn_backlog = max(128, cnt / 256);
|
||||||
|
|
||||||
/* Set the pressure threshold to be a fraction of global memory that
|
limit = nr_free_buffer_pages() / 8;
|
||||||
* is up to 1/2 at 256 MB, decreasing toward zero with the amount of
|
|
||||||
* memory, with a floor of 128 pages.
|
|
||||||
*/
|
|
||||||
nr_pages = totalram_pages - totalhigh_pages;
|
|
||||||
limit = min(nr_pages, 1UL<<(28-PAGE_SHIFT)) >> (20-PAGE_SHIFT);
|
|
||||||
limit = (limit * (nr_pages >> (20-PAGE_SHIFT))) >> (PAGE_SHIFT-11);
|
|
||||||
limit = max(limit, 128UL);
|
limit = max(limit, 128UL);
|
||||||
sysctl_tcp_mem[0] = limit / 4 * 3;
|
sysctl_tcp_mem[0] = limit / 4 * 3;
|
||||||
sysctl_tcp_mem[1] = limit;
|
sysctl_tcp_mem[1] = limit;
|
||||||
|
|
|
@ -2209,16 +2209,10 @@ void __init udp_table_init(struct udp_table *table, const char *name)
|
||||||
|
|
||||||
void __init udp_init(void)
|
void __init udp_init(void)
|
||||||
{
|
{
|
||||||
unsigned long nr_pages, limit;
|
unsigned long limit;
|
||||||
|
|
||||||
udp_table_init(&udp_table, "UDP");
|
udp_table_init(&udp_table, "UDP");
|
||||||
/* Set the pressure threshold up by the same strategy of TCP. It is a
|
limit = nr_free_buffer_pages() / 8;
|
||||||
* fraction of global memory that is up to 1/2 at 256 MB, decreasing
|
|
||||||
* toward zero with the amount of memory, with a floor of 128 pages.
|
|
||||||
*/
|
|
||||||
nr_pages = totalram_pages - totalhigh_pages;
|
|
||||||
limit = min(nr_pages, 1UL<<(28-PAGE_SHIFT)) >> (20-PAGE_SHIFT);
|
|
||||||
limit = (limit * (nr_pages >> (20-PAGE_SHIFT))) >> (PAGE_SHIFT-11);
|
|
||||||
limit = max(limit, 128UL);
|
limit = max(limit, 128UL);
|
||||||
sysctl_udp_mem[0] = limit / 4 * 3;
|
sysctl_udp_mem[0] = limit / 4 * 3;
|
||||||
sysctl_udp_mem[1] = limit;
|
sysctl_udp_mem[1] = limit;
|
||||||
|
|
|
@ -32,7 +32,12 @@ static int xfrm4_tunnel_check_size(struct sk_buff *skb)
|
||||||
dst = skb_dst(skb);
|
dst = skb_dst(skb);
|
||||||
mtu = dst_mtu(dst);
|
mtu = dst_mtu(dst);
|
||||||
if (skb->len > mtu) {
|
if (skb->len > mtu) {
|
||||||
icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED, htonl(mtu));
|
if (skb->sk)
|
||||||
|
ip_local_error(skb->sk, EMSGSIZE, ip_hdr(skb)->daddr,
|
||||||
|
inet_sk(skb->sk)->inet_dport, mtu);
|
||||||
|
else
|
||||||
|
icmp_send(skb, ICMP_DEST_UNREACH,
|
||||||
|
ICMP_FRAG_NEEDED, htonl(mtu));
|
||||||
ret = -EMSGSIZE;
|
ret = -EMSGSIZE;
|
||||||
}
|
}
|
||||||
out:
|
out:
|
||||||
|
|
|
@ -274,7 +274,7 @@ int inet6_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (addr->sin6_family != AF_INET6)
|
if (addr->sin6_family != AF_INET6)
|
||||||
return -EINVAL;
|
return -EAFNOSUPPORT;
|
||||||
|
|
||||||
addr_type = ipv6_addr_type(&addr->sin6_addr);
|
addr_type = ipv6_addr_type(&addr->sin6_addr);
|
||||||
if ((addr_type & IPV6_ADDR_MULTICAST) && sock->type == SOCK_STREAM)
|
if ((addr_type & IPV6_ADDR_MULTICAST) && sock->type == SOCK_STREAM)
|
||||||
|
|
|
@ -228,9 +228,10 @@ static struct rt6_info ip6_blk_hole_entry_template = {
|
||||||
|
|
||||||
/* allocate dst with ip6_dst_ops */
|
/* allocate dst with ip6_dst_ops */
|
||||||
static inline struct rt6_info *ip6_dst_alloc(struct dst_ops *ops,
|
static inline struct rt6_info *ip6_dst_alloc(struct dst_ops *ops,
|
||||||
struct net_device *dev)
|
struct net_device *dev,
|
||||||
|
int flags)
|
||||||
{
|
{
|
||||||
struct rt6_info *rt = dst_alloc(ops, dev, 0, 0, 0);
|
struct rt6_info *rt = dst_alloc(ops, dev, 0, 0, flags);
|
||||||
|
|
||||||
memset(&rt->rt6i_table, 0, sizeof(*rt) - sizeof(struct dst_entry));
|
memset(&rt->rt6i_table, 0, sizeof(*rt) - sizeof(struct dst_entry));
|
||||||
|
|
||||||
|
@ -1042,7 +1043,7 @@ struct dst_entry *icmp6_dst_alloc(struct net_device *dev,
|
||||||
if (unlikely(idev == NULL))
|
if (unlikely(idev == NULL))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
rt = ip6_dst_alloc(&net->ipv6.ip6_dst_ops, dev);
|
rt = ip6_dst_alloc(&net->ipv6.ip6_dst_ops, dev, 0);
|
||||||
if (unlikely(rt == NULL)) {
|
if (unlikely(rt == NULL)) {
|
||||||
in6_dev_put(idev);
|
in6_dev_put(idev);
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -1062,14 +1063,6 @@ struct dst_entry *icmp6_dst_alloc(struct net_device *dev,
|
||||||
dst_metric_set(&rt->dst, RTAX_HOPLIMIT, 255);
|
dst_metric_set(&rt->dst, RTAX_HOPLIMIT, 255);
|
||||||
rt->dst.output = ip6_output;
|
rt->dst.output = ip6_output;
|
||||||
|
|
||||||
#if 0 /* there's no chance to use these for ndisc */
|
|
||||||
rt->dst.flags = ipv6_addr_type(addr) & IPV6_ADDR_UNICAST
|
|
||||||
? DST_HOST
|
|
||||||
: 0;
|
|
||||||
ipv6_addr_copy(&rt->rt6i_dst.addr, addr);
|
|
||||||
rt->rt6i_dst.plen = 128;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
spin_lock_bh(&icmp6_dst_lock);
|
spin_lock_bh(&icmp6_dst_lock);
|
||||||
rt->dst.next = icmp6_dst_gc_list;
|
rt->dst.next = icmp6_dst_gc_list;
|
||||||
icmp6_dst_gc_list = &rt->dst;
|
icmp6_dst_gc_list = &rt->dst;
|
||||||
|
@ -1214,7 +1207,7 @@ int ip6_route_add(struct fib6_config *cfg)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
rt = ip6_dst_alloc(&net->ipv6.ip6_dst_ops, NULL);
|
rt = ip6_dst_alloc(&net->ipv6.ip6_dst_ops, NULL, DST_NOCOUNT);
|
||||||
|
|
||||||
if (rt == NULL) {
|
if (rt == NULL) {
|
||||||
err = -ENOMEM;
|
err = -ENOMEM;
|
||||||
|
@ -1244,7 +1237,7 @@ int ip6_route_add(struct fib6_config *cfg)
|
||||||
ipv6_addr_prefix(&rt->rt6i_dst.addr, &cfg->fc_dst, cfg->fc_dst_len);
|
ipv6_addr_prefix(&rt->rt6i_dst.addr, &cfg->fc_dst, cfg->fc_dst_len);
|
||||||
rt->rt6i_dst.plen = cfg->fc_dst_len;
|
rt->rt6i_dst.plen = cfg->fc_dst_len;
|
||||||
if (rt->rt6i_dst.plen == 128)
|
if (rt->rt6i_dst.plen == 128)
|
||||||
rt->dst.flags = DST_HOST;
|
rt->dst.flags |= DST_HOST;
|
||||||
|
|
||||||
#ifdef CONFIG_IPV6_SUBTREES
|
#ifdef CONFIG_IPV6_SUBTREES
|
||||||
ipv6_addr_prefix(&rt->rt6i_src.addr, &cfg->fc_src, cfg->fc_src_len);
|
ipv6_addr_prefix(&rt->rt6i_src.addr, &cfg->fc_src, cfg->fc_src_len);
|
||||||
|
@ -1734,7 +1727,7 @@ static struct rt6_info * ip6_rt_copy(struct rt6_info *ort)
|
||||||
{
|
{
|
||||||
struct net *net = dev_net(ort->rt6i_dev);
|
struct net *net = dev_net(ort->rt6i_dev);
|
||||||
struct rt6_info *rt = ip6_dst_alloc(&net->ipv6.ip6_dst_ops,
|
struct rt6_info *rt = ip6_dst_alloc(&net->ipv6.ip6_dst_ops,
|
||||||
ort->dst.dev);
|
ort->dst.dev, 0);
|
||||||
|
|
||||||
if (rt) {
|
if (rt) {
|
||||||
rt->dst.input = ort->dst.input;
|
rt->dst.input = ort->dst.input;
|
||||||
|
@ -2013,7 +2006,7 @@ struct rt6_info *addrconf_dst_alloc(struct inet6_dev *idev,
|
||||||
{
|
{
|
||||||
struct net *net = dev_net(idev->dev);
|
struct net *net = dev_net(idev->dev);
|
||||||
struct rt6_info *rt = ip6_dst_alloc(&net->ipv6.ip6_dst_ops,
|
struct rt6_info *rt = ip6_dst_alloc(&net->ipv6.ip6_dst_ops,
|
||||||
net->loopback_dev);
|
net->loopback_dev, 0);
|
||||||
struct neighbour *neigh;
|
struct neighbour *neigh;
|
||||||
|
|
||||||
if (rt == NULL) {
|
if (rt == NULL) {
|
||||||
|
@ -2025,7 +2018,7 @@ struct rt6_info *addrconf_dst_alloc(struct inet6_dev *idev,
|
||||||
|
|
||||||
in6_dev_hold(idev);
|
in6_dev_hold(idev);
|
||||||
|
|
||||||
rt->dst.flags = DST_HOST;
|
rt->dst.flags |= DST_HOST;
|
||||||
rt->dst.input = ip6_input;
|
rt->dst.input = ip6_input;
|
||||||
rt->dst.output = ip6_output;
|
rt->dst.output = ip6_output;
|
||||||
rt->rt6i_idev = idev;
|
rt->rt6i_idev = idev;
|
||||||
|
|
|
@ -154,7 +154,13 @@ update_iv:
|
||||||
return RX_CONTINUE;
|
return RX_CONTINUE;
|
||||||
|
|
||||||
mic_fail:
|
mic_fail:
|
||||||
mac80211_ev_michael_mic_failure(rx->sdata, rx->key->conf.keyidx,
|
/*
|
||||||
|
* In some cases the key can be unset - e.g. a multicast packet, in
|
||||||
|
* a driver that supports HW encryption. Send up the key idx only if
|
||||||
|
* the key is set.
|
||||||
|
*/
|
||||||
|
mac80211_ev_michael_mic_failure(rx->sdata,
|
||||||
|
rx->key ? rx->key->conf.keyidx : -1,
|
||||||
(void *) skb->data, NULL, GFP_ATOMIC);
|
(void *) skb->data, NULL, GFP_ATOMIC);
|
||||||
return RX_DROP_UNUSABLE;
|
return RX_DROP_UNUSABLE;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1058,7 +1058,6 @@ SCTP_STATIC __init int sctp_init(void)
|
||||||
int status = -EINVAL;
|
int status = -EINVAL;
|
||||||
unsigned long goal;
|
unsigned long goal;
|
||||||
unsigned long limit;
|
unsigned long limit;
|
||||||
unsigned long nr_pages;
|
|
||||||
int max_share;
|
int max_share;
|
||||||
int order;
|
int order;
|
||||||
|
|
||||||
|
@ -1148,15 +1147,7 @@ SCTP_STATIC __init int sctp_init(void)
|
||||||
/* Initialize handle used for association ids. */
|
/* Initialize handle used for association ids. */
|
||||||
idr_init(&sctp_assocs_id);
|
idr_init(&sctp_assocs_id);
|
||||||
|
|
||||||
/* Set the pressure threshold to be a fraction of global memory that
|
limit = nr_free_buffer_pages() / 8;
|
||||||
* is up to 1/2 at 256 MB, decreasing toward zero with the amount of
|
|
||||||
* memory, with a floor of 128 pages.
|
|
||||||
* Note this initializes the data in sctpv6_prot too
|
|
||||||
* Unabashedly stolen from tcp_init
|
|
||||||
*/
|
|
||||||
nr_pages = totalram_pages - totalhigh_pages;
|
|
||||||
limit = min(nr_pages, 1UL<<(28-PAGE_SHIFT)) >> (20-PAGE_SHIFT);
|
|
||||||
limit = (limit * (nr_pages >> (20-PAGE_SHIFT))) >> (PAGE_SHIFT-11);
|
|
||||||
limit = max(limit, 128UL);
|
limit = max(limit, 128UL);
|
||||||
sysctl_sctp_mem[0] = limit / 4 * 3;
|
sysctl_sctp_mem[0] = limit / 4 * 3;
|
||||||
sysctl_sctp_mem[1] = limit;
|
sysctl_sctp_mem[1] = limit;
|
||||||
|
|
|
@ -2073,10 +2073,33 @@ static int sctp_setsockopt_disable_fragments(struct sock *sk,
|
||||||
static int sctp_setsockopt_events(struct sock *sk, char __user *optval,
|
static int sctp_setsockopt_events(struct sock *sk, char __user *optval,
|
||||||
unsigned int optlen)
|
unsigned int optlen)
|
||||||
{
|
{
|
||||||
|
struct sctp_association *asoc;
|
||||||
|
struct sctp_ulpevent *event;
|
||||||
|
|
||||||
if (optlen > sizeof(struct sctp_event_subscribe))
|
if (optlen > sizeof(struct sctp_event_subscribe))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
if (copy_from_user(&sctp_sk(sk)->subscribe, optval, optlen))
|
if (copy_from_user(&sctp_sk(sk)->subscribe, optval, optlen))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* At the time when a user app subscribes to SCTP_SENDER_DRY_EVENT,
|
||||||
|
* if there is no data to be sent or retransmit, the stack will
|
||||||
|
* immediately send up this notification.
|
||||||
|
*/
|
||||||
|
if (sctp_ulpevent_type_enabled(SCTP_SENDER_DRY_EVENT,
|
||||||
|
&sctp_sk(sk)->subscribe)) {
|
||||||
|
asoc = sctp_id2assoc(sk, 0);
|
||||||
|
|
||||||
|
if (asoc && sctp_outq_is_empty(&asoc->outqueue)) {
|
||||||
|
event = sctp_ulpevent_make_sender_dry_event(asoc,
|
||||||
|
GFP_ATOMIC);
|
||||||
|
if (!event)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
sctp_ulpq_tail_event(&asoc->ulpq, event);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6463,7 +6463,8 @@ void nl80211_michael_mic_failure(struct cfg80211_registered_device *rdev,
|
||||||
if (addr)
|
if (addr)
|
||||||
NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, addr);
|
NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, addr);
|
||||||
NLA_PUT_U32(msg, NL80211_ATTR_KEY_TYPE, key_type);
|
NLA_PUT_U32(msg, NL80211_ATTR_KEY_TYPE, key_type);
|
||||||
NLA_PUT_U8(msg, NL80211_ATTR_KEY_IDX, key_id);
|
if (key_id != -1)
|
||||||
|
NLA_PUT_U8(msg, NL80211_ATTR_KEY_IDX, key_id);
|
||||||
if (tsc)
|
if (tsc)
|
||||||
NLA_PUT(msg, NL80211_ATTR_KEY_SEQ, 6, tsc);
|
NLA_PUT(msg, NL80211_ATTR_KEY_SEQ, 6, tsc);
|
||||||
|
|
||||||
|
|
|
@ -50,7 +50,7 @@ static struct xfrm_policy_afinfo *xfrm_policy_get_afinfo(unsigned short family);
|
||||||
static void xfrm_policy_put_afinfo(struct xfrm_policy_afinfo *afinfo);
|
static void xfrm_policy_put_afinfo(struct xfrm_policy_afinfo *afinfo);
|
||||||
static void xfrm_init_pmtu(struct dst_entry *dst);
|
static void xfrm_init_pmtu(struct dst_entry *dst);
|
||||||
static int stale_bundle(struct dst_entry *dst);
|
static int stale_bundle(struct dst_entry *dst);
|
||||||
static int xfrm_bundle_ok(struct xfrm_dst *xdst, int family);
|
static int xfrm_bundle_ok(struct xfrm_dst *xdst);
|
||||||
|
|
||||||
|
|
||||||
static struct xfrm_policy *__xfrm_policy_unlink(struct xfrm_policy *pol,
|
static struct xfrm_policy *__xfrm_policy_unlink(struct xfrm_policy *pol,
|
||||||
|
@ -2241,7 +2241,7 @@ static struct dst_entry *xfrm_dst_check(struct dst_entry *dst, u32 cookie)
|
||||||
|
|
||||||
static int stale_bundle(struct dst_entry *dst)
|
static int stale_bundle(struct dst_entry *dst)
|
||||||
{
|
{
|
||||||
return !xfrm_bundle_ok((struct xfrm_dst *)dst, AF_UNSPEC);
|
return !xfrm_bundle_ok((struct xfrm_dst *)dst);
|
||||||
}
|
}
|
||||||
|
|
||||||
void xfrm_dst_ifdown(struct dst_entry *dst, struct net_device *dev)
|
void xfrm_dst_ifdown(struct dst_entry *dst, struct net_device *dev)
|
||||||
|
@ -2313,7 +2313,7 @@ static void xfrm_init_pmtu(struct dst_entry *dst)
|
||||||
* still valid.
|
* still valid.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static int xfrm_bundle_ok(struct xfrm_dst *first, int family)
|
static int xfrm_bundle_ok(struct xfrm_dst *first)
|
||||||
{
|
{
|
||||||
struct dst_entry *dst = &first->u.dst;
|
struct dst_entry *dst = &first->u.dst;
|
||||||
struct xfrm_dst *last;
|
struct xfrm_dst *last;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче