You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
This commit is contained in:
@@ -56,6 +56,13 @@ ip_forward_use_pmtu - BOOLEAN
|
||||
0 - disabled
|
||||
1 - enabled
|
||||
|
||||
fwmark_reflect - BOOLEAN
|
||||
Controls the fwmark of kernel-generated IPv4 reply packets that are not
|
||||
associated with a socket for example, TCP RSTs or ICMP echo replies).
|
||||
If unset, these packets have a fwmark of zero. If set, they have the
|
||||
fwmark of the packet they are replying to.
|
||||
Default: 0
|
||||
|
||||
route/max_size - INTEGER
|
||||
Maximum number of routes allowed in the kernel. Increase
|
||||
this when using large numbers of interfaces and/or routes.
|
||||
@@ -1209,6 +1216,13 @@ conf/all/forwarding - BOOLEAN
|
||||
proxy_ndp - BOOLEAN
|
||||
Do proxy ndp.
|
||||
|
||||
fwmark_reflect - BOOLEAN
|
||||
Controls the fwmark of kernel-generated IPv6 reply packets that are not
|
||||
associated with a socket for example, TCP RSTs or ICMPv6 echo replies).
|
||||
If unset, these packets have a fwmark of zero. If set, they have the
|
||||
fwmark of the packet they are replying to.
|
||||
Default: 0
|
||||
|
||||
conf/interface/*:
|
||||
Change special settings per interface.
|
||||
|
||||
|
||||
@@ -599,7 +599,7 @@
|
||||
compatible = "apm,xgene-enet";
|
||||
status = "disabled";
|
||||
reg = <0x0 0x17020000 0x0 0xd100>,
|
||||
<0x0 0X17030000 0x0 0X400>,
|
||||
<0x0 0X17030000 0x0 0Xc300>,
|
||||
<0x0 0X10000000 0x0 0X200>;
|
||||
reg-names = "enet_csr", "ring_csr", "ring_cmd";
|
||||
interrupts = <0x0 0x3c 0x4>;
|
||||
@@ -624,9 +624,9 @@
|
||||
sgenet0: ethernet@1f210000 {
|
||||
compatible = "apm,xgene-enet";
|
||||
status = "disabled";
|
||||
reg = <0x0 0x1f210000 0x0 0x10000>,
|
||||
<0x0 0x1f200000 0x0 0X10000>,
|
||||
<0x0 0x1B000000 0x0 0X20000>;
|
||||
reg = <0x0 0x1f210000 0x0 0xd100>,
|
||||
<0x0 0x1f200000 0x0 0Xc300>,
|
||||
<0x0 0x1B000000 0x0 0X200>;
|
||||
reg-names = "enet_csr", "ring_csr", "ring_cmd";
|
||||
interrupts = <0x0 0xA0 0x4>;
|
||||
dma-coherent;
|
||||
@@ -639,7 +639,7 @@
|
||||
compatible = "apm,xgene-enet";
|
||||
status = "disabled";
|
||||
reg = <0x0 0x1f610000 0x0 0xd100>,
|
||||
<0x0 0x1f600000 0x0 0X400>,
|
||||
<0x0 0x1f600000 0x0 0Xc300>,
|
||||
<0x0 0x18000000 0x0 0X200>;
|
||||
reg-names = "enet_csr", "ring_csr", "ring_cmd";
|
||||
interrupts = <0x0 0x60 0x4>;
|
||||
|
||||
@@ -575,10 +575,24 @@ static void xgene_gmac_tx_disable(struct xgene_enet_pdata *pdata)
|
||||
xgene_enet_wr_mcx_mac(pdata, MAC_CONFIG_1_ADDR, data & ~TX_EN);
|
||||
}
|
||||
|
||||
static void xgene_enet_reset(struct xgene_enet_pdata *pdata)
|
||||
bool xgene_ring_mgr_init(struct xgene_enet_pdata *p)
|
||||
{
|
||||
if (!ioread32(p->ring_csr_addr + CLKEN_ADDR))
|
||||
return false;
|
||||
|
||||
if (ioread32(p->ring_csr_addr + SRST_ADDR))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static int xgene_enet_reset(struct xgene_enet_pdata *pdata)
|
||||
{
|
||||
u32 val;
|
||||
|
||||
if (!xgene_ring_mgr_init(pdata))
|
||||
return -ENODEV;
|
||||
|
||||
clk_prepare_enable(pdata->clk);
|
||||
clk_disable_unprepare(pdata->clk);
|
||||
clk_prepare_enable(pdata->clk);
|
||||
@@ -590,6 +604,8 @@ static void xgene_enet_reset(struct xgene_enet_pdata *pdata)
|
||||
val |= SCAN_AUTO_INCR;
|
||||
MGMT_CLOCK_SEL_SET(&val, 1);
|
||||
xgene_enet_wr_mcx_mac(pdata, MII_MGMT_CONFIG_ADDR, val);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void xgene_gport_shutdown(struct xgene_enet_pdata *pdata)
|
||||
|
||||
@@ -104,6 +104,9 @@ enum xgene_enet_rm {
|
||||
#define BLOCK_ETH_MAC_OFFSET 0x0000
|
||||
#define BLOCK_ETH_MAC_CSR_OFFSET 0x2800
|
||||
|
||||
#define CLKEN_ADDR 0xc208
|
||||
#define SRST_ADDR 0xc200
|
||||
|
||||
#define MAC_ADDR_REG_OFFSET 0x00
|
||||
#define MAC_COMMAND_REG_OFFSET 0x04
|
||||
#define MAC_WRITE_REG_OFFSET 0x08
|
||||
@@ -318,6 +321,7 @@ void xgene_enet_parse_error(struct xgene_enet_desc_ring *ring,
|
||||
|
||||
int xgene_enet_mdio_config(struct xgene_enet_pdata *pdata);
|
||||
void xgene_enet_mdio_remove(struct xgene_enet_pdata *pdata);
|
||||
bool xgene_ring_mgr_init(struct xgene_enet_pdata *p);
|
||||
|
||||
extern struct xgene_mac_ops xgene_gmac_ops;
|
||||
extern struct xgene_port_ops xgene_gport_ops;
|
||||
|
||||
@@ -639,9 +639,9 @@ static int xgene_enet_create_desc_rings(struct net_device *ndev)
|
||||
struct device *dev = ndev_to_dev(ndev);
|
||||
struct xgene_enet_desc_ring *rx_ring, *tx_ring, *cp_ring;
|
||||
struct xgene_enet_desc_ring *buf_pool = NULL;
|
||||
u8 cpu_bufnum = 0, eth_bufnum = 0;
|
||||
u8 bp_bufnum = 0x20;
|
||||
u16 ring_id, ring_num = 0;
|
||||
u8 cpu_bufnum = 0, eth_bufnum = START_ETH_BUFNUM;
|
||||
u8 bp_bufnum = START_BP_BUFNUM;
|
||||
u16 ring_id, ring_num = START_RING_NUM;
|
||||
int ret;
|
||||
|
||||
/* allocate rx descriptor ring */
|
||||
@@ -840,7 +840,9 @@ static int xgene_enet_init_hw(struct xgene_enet_pdata *pdata)
|
||||
u16 dst_ring_num;
|
||||
int ret;
|
||||
|
||||
pdata->port_ops->reset(pdata);
|
||||
ret = pdata->port_ops->reset(pdata);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = xgene_enet_create_desc_rings(ndev);
|
||||
if (ret) {
|
||||
@@ -942,6 +944,7 @@ static int xgene_enet_probe(struct platform_device *pdev)
|
||||
|
||||
return ret;
|
||||
err:
|
||||
unregister_netdev(ndev);
|
||||
free_netdev(ndev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -38,6 +38,9 @@
|
||||
#define SKB_BUFFER_SIZE (XGENE_ENET_MAX_MTU - NET_IP_ALIGN)
|
||||
#define NUM_PKT_BUF 64
|
||||
#define NUM_BUFPOOL 32
|
||||
#define START_ETH_BUFNUM 2
|
||||
#define START_BP_BUFNUM 0x22
|
||||
#define START_RING_NUM 8
|
||||
|
||||
#define PHY_POLL_LINK_ON (10 * HZ)
|
||||
#define PHY_POLL_LINK_OFF (PHY_POLL_LINK_ON / 5)
|
||||
@@ -83,7 +86,7 @@ struct xgene_mac_ops {
|
||||
};
|
||||
|
||||
struct xgene_port_ops {
|
||||
void (*reset)(struct xgene_enet_pdata *pdata);
|
||||
int (*reset)(struct xgene_enet_pdata *pdata);
|
||||
void (*cle_bypass)(struct xgene_enet_pdata *pdata,
|
||||
u32 dst_ring_num, u16 bufpool_id);
|
||||
void (*shutdown)(struct xgene_enet_pdata *pdata);
|
||||
|
||||
@@ -311,14 +311,19 @@ static void xgene_sgmac_tx_disable(struct xgene_enet_pdata *p)
|
||||
xgene_sgmac_rxtx(p, TX_EN, false);
|
||||
}
|
||||
|
||||
static void xgene_enet_reset(struct xgene_enet_pdata *p)
|
||||
static int xgene_enet_reset(struct xgene_enet_pdata *p)
|
||||
{
|
||||
if (!xgene_ring_mgr_init(p))
|
||||
return -ENODEV;
|
||||
|
||||
clk_prepare_enable(p->clk);
|
||||
clk_disable_unprepare(p->clk);
|
||||
clk_prepare_enable(p->clk);
|
||||
|
||||
xgene_enet_ecc_init(p);
|
||||
xgene_enet_config_ring_if_assoc(p);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void xgene_enet_cle_bypass(struct xgene_enet_pdata *p,
|
||||
|
||||
@@ -252,14 +252,19 @@ static void xgene_xgmac_tx_disable(struct xgene_enet_pdata *pdata)
|
||||
xgene_enet_wr_mac(pdata, AXGMAC_CONFIG_1, data & ~HSTTFEN);
|
||||
}
|
||||
|
||||
static void xgene_enet_reset(struct xgene_enet_pdata *pdata)
|
||||
static int xgene_enet_reset(struct xgene_enet_pdata *pdata)
|
||||
{
|
||||
if (!xgene_ring_mgr_init(pdata))
|
||||
return -ENODEV;
|
||||
|
||||
clk_prepare_enable(pdata->clk);
|
||||
clk_disable_unprepare(pdata->clk);
|
||||
clk_prepare_enable(pdata->clk);
|
||||
|
||||
xgene_enet_ecc_init(pdata);
|
||||
xgene_enet_config_ring_if_assoc(pdata);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void xgene_enet_xgcle_bypass(struct xgene_enet_pdata *pdata,
|
||||
|
||||
@@ -1110,7 +1110,8 @@ static int bcm_sysport_init_tx_ring(struct bcm_sysport_priv *priv,
|
||||
/* We just need one DMA descriptor which is DMA-able, since writing to
|
||||
* the port will allocate a new descriptor in its internal linked-list
|
||||
*/
|
||||
p = dma_zalloc_coherent(kdev, 1, &ring->desc_dma, GFP_KERNEL);
|
||||
p = dma_zalloc_coherent(kdev, sizeof(struct dma_desc), &ring->desc_dma,
|
||||
GFP_KERNEL);
|
||||
if (!p) {
|
||||
netif_err(priv, hw, priv->netdev, "DMA alloc failed\n");
|
||||
return -ENOMEM;
|
||||
@@ -1174,6 +1175,13 @@ static void bcm_sysport_fini_tx_ring(struct bcm_sysport_priv *priv,
|
||||
if (!(reg & TDMA_DISABLED))
|
||||
netdev_warn(priv->netdev, "TDMA not stopped!\n");
|
||||
|
||||
/* ring->cbs is the last part in bcm_sysport_init_tx_ring which could
|
||||
* fail, so by checking this pointer we know whether the TX ring was
|
||||
* fully initialized or not.
|
||||
*/
|
||||
if (!ring->cbs)
|
||||
return;
|
||||
|
||||
napi_disable(&ring->napi);
|
||||
netif_napi_del(&ring->napi);
|
||||
|
||||
@@ -1183,7 +1191,8 @@ static void bcm_sysport_fini_tx_ring(struct bcm_sysport_priv *priv,
|
||||
ring->cbs = NULL;
|
||||
|
||||
if (ring->desc_dma) {
|
||||
dma_free_coherent(kdev, 1, ring->desc_cpu, ring->desc_dma);
|
||||
dma_free_coherent(kdev, sizeof(struct dma_desc),
|
||||
ring->desc_cpu, ring->desc_dma);
|
||||
ring->desc_dma = 0;
|
||||
}
|
||||
ring->size = 0;
|
||||
|
||||
@@ -940,18 +940,8 @@ static int enic_rq_alloc_buf(struct vnic_rq *rq)
|
||||
struct vnic_rq_buf *buf = rq->to_use;
|
||||
|
||||
if (buf->os_buf) {
|
||||
buf = buf->next;
|
||||
rq->to_use = buf;
|
||||
rq->ring.desc_avail--;
|
||||
if ((buf->index & VNIC_RQ_RETURN_RATE) == 0) {
|
||||
/* Adding write memory barrier prevents compiler and/or
|
||||
* CPU reordering, thus avoiding descriptor posting
|
||||
* before descriptor is initialized. Otherwise, hardware
|
||||
* can read stale descriptor fields.
|
||||
*/
|
||||
wmb();
|
||||
iowrite32(buf->index, &rq->ctrl->posted_index);
|
||||
}
|
||||
enic_queue_rq_desc(rq, buf->os_buf, os_buf_index, buf->dma_addr,
|
||||
buf->len);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1037,7 +1027,10 @@ static void enic_rq_indicate_buf(struct vnic_rq *rq,
|
||||
enic->rq_truncated_pkts++;
|
||||
}
|
||||
|
||||
pci_unmap_single(enic->pdev, buf->dma_addr, buf->len,
|
||||
PCI_DMA_FROMDEVICE);
|
||||
dev_kfree_skb_any(skb);
|
||||
buf->os_buf = NULL;
|
||||
|
||||
return;
|
||||
}
|
||||
@@ -1088,7 +1081,10 @@ static void enic_rq_indicate_buf(struct vnic_rq *rq,
|
||||
/* Buffer overflow
|
||||
*/
|
||||
|
||||
pci_unmap_single(enic->pdev, buf->dma_addr, buf->len,
|
||||
PCI_DMA_FROMDEVICE);
|
||||
dev_kfree_skb_any(skb);
|
||||
buf->os_buf = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -3343,12 +3343,11 @@ static int __maybe_unused fec_suspend(struct device *dev)
|
||||
netif_device_detach(ndev);
|
||||
netif_tx_unlock_bh(ndev);
|
||||
fec_stop(ndev);
|
||||
fec_enet_clk_enable(ndev, false);
|
||||
pinctrl_pm_select_sleep_state(&fep->pdev->dev);
|
||||
}
|
||||
rtnl_unlock();
|
||||
|
||||
fec_enet_clk_enable(ndev, false);
|
||||
pinctrl_pm_select_sleep_state(&fep->pdev->dev);
|
||||
|
||||
if (fep->reg_phy)
|
||||
regulator_disable(fep->reg_phy);
|
||||
|
||||
@@ -3367,13 +3366,14 @@ static int __maybe_unused fec_resume(struct device *dev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
pinctrl_pm_select_default_state(&fep->pdev->dev);
|
||||
ret = fec_enet_clk_enable(ndev, true);
|
||||
if (ret)
|
||||
goto failed_clk;
|
||||
|
||||
rtnl_lock();
|
||||
if (netif_running(ndev)) {
|
||||
pinctrl_pm_select_default_state(&fep->pdev->dev);
|
||||
ret = fec_enet_clk_enable(ndev, true);
|
||||
if (ret) {
|
||||
rtnl_unlock();
|
||||
goto failed_clk;
|
||||
}
|
||||
fec_restart(ndev);
|
||||
netif_tx_lock_bh(ndev);
|
||||
netif_device_attach(ndev);
|
||||
|
||||
@@ -1047,7 +1047,6 @@ static int txq_reclaim(struct tx_queue *txq, int budget, int force)
|
||||
int tx_index;
|
||||
struct tx_desc *desc;
|
||||
u32 cmd_sts;
|
||||
struct sk_buff *skb;
|
||||
|
||||
tx_index = txq->tx_used_desc;
|
||||
desc = &txq->tx_desc_area[tx_index];
|
||||
@@ -1066,19 +1065,22 @@ static int txq_reclaim(struct tx_queue *txq, int budget, int force)
|
||||
reclaimed++;
|
||||
txq->tx_desc_count--;
|
||||
|
||||
skb = NULL;
|
||||
if (cmd_sts & TX_LAST_DESC)
|
||||
skb = __skb_dequeue(&txq->tx_skb);
|
||||
if (!IS_TSO_HEADER(txq, desc->buf_ptr))
|
||||
dma_unmap_single(mp->dev->dev.parent, desc->buf_ptr,
|
||||
desc->byte_cnt, DMA_TO_DEVICE);
|
||||
|
||||
if (cmd_sts & TX_ENABLE_INTERRUPT) {
|
||||
struct sk_buff *skb = __skb_dequeue(&txq->tx_skb);
|
||||
|
||||
if (!WARN_ON(!skb))
|
||||
dev_kfree_skb(skb);
|
||||
}
|
||||
|
||||
if (cmd_sts & ERROR_SUMMARY) {
|
||||
netdev_info(mp->dev, "tx error\n");
|
||||
mp->dev->stats.tx_errors++;
|
||||
}
|
||||
|
||||
if (!IS_TSO_HEADER(txq, desc->buf_ptr))
|
||||
dma_unmap_single(mp->dev->dev.parent, desc->buf_ptr,
|
||||
desc->byte_cnt, DMA_TO_DEVICE);
|
||||
dev_kfree_skb(skb);
|
||||
}
|
||||
|
||||
__netif_tx_unlock_bh(nq);
|
||||
|
||||
@@ -1692,6 +1692,7 @@ static int mvpp2_prs_vlan_add(struct mvpp2 *priv, unsigned short tpid, int ai,
|
||||
{
|
||||
struct mvpp2_prs_entry *pe;
|
||||
int tid_aux, tid;
|
||||
int ret = 0;
|
||||
|
||||
pe = mvpp2_prs_vlan_find(priv, tpid, ai);
|
||||
|
||||
@@ -1723,8 +1724,10 @@ static int mvpp2_prs_vlan_add(struct mvpp2 *priv, unsigned short tpid, int ai,
|
||||
break;
|
||||
}
|
||||
|
||||
if (tid <= tid_aux)
|
||||
return -EINVAL;
|
||||
if (tid <= tid_aux) {
|
||||
ret = -EINVAL;
|
||||
goto error;
|
||||
}
|
||||
|
||||
memset(pe, 0 , sizeof(struct mvpp2_prs_entry));
|
||||
mvpp2_prs_tcam_lu_set(pe, MVPP2_PRS_LU_VLAN);
|
||||
@@ -1756,9 +1759,10 @@ static int mvpp2_prs_vlan_add(struct mvpp2 *priv, unsigned short tpid, int ai,
|
||||
|
||||
mvpp2_prs_hw_write(priv, pe);
|
||||
|
||||
error:
|
||||
kfree(pe);
|
||||
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Get first free double vlan ai number */
|
||||
@@ -1821,7 +1825,7 @@ static int mvpp2_prs_double_vlan_add(struct mvpp2 *priv, unsigned short tpid1,
|
||||
unsigned int port_map)
|
||||
{
|
||||
struct mvpp2_prs_entry *pe;
|
||||
int tid_aux, tid, ai;
|
||||
int tid_aux, tid, ai, ret = 0;
|
||||
|
||||
pe = mvpp2_prs_double_vlan_find(priv, tpid1, tpid2);
|
||||
|
||||
@@ -1838,8 +1842,10 @@ static int mvpp2_prs_double_vlan_add(struct mvpp2 *priv, unsigned short tpid1,
|
||||
|
||||
/* Set ai value for new double vlan entry */
|
||||
ai = mvpp2_prs_double_vlan_ai_free_get(priv);
|
||||
if (ai < 0)
|
||||
return ai;
|
||||
if (ai < 0) {
|
||||
ret = ai;
|
||||
goto error;
|
||||
}
|
||||
|
||||
/* Get first single/triple vlan tid */
|
||||
for (tid_aux = MVPP2_PE_FIRST_FREE_TID;
|
||||
@@ -1859,8 +1865,10 @@ static int mvpp2_prs_double_vlan_add(struct mvpp2 *priv, unsigned short tpid1,
|
||||
break;
|
||||
}
|
||||
|
||||
if (tid >= tid_aux)
|
||||
return -ERANGE;
|
||||
if (tid >= tid_aux) {
|
||||
ret = -ERANGE;
|
||||
goto error;
|
||||
}
|
||||
|
||||
memset(pe, 0, sizeof(struct mvpp2_prs_entry));
|
||||
mvpp2_prs_tcam_lu_set(pe, MVPP2_PRS_LU_VLAN);
|
||||
@@ -1887,8 +1895,9 @@ static int mvpp2_prs_double_vlan_add(struct mvpp2 *priv, unsigned short tpid1,
|
||||
mvpp2_prs_tcam_port_map_set(pe, port_map);
|
||||
mvpp2_prs_hw_write(priv, pe);
|
||||
|
||||
error:
|
||||
kfree(pe);
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* IPv4 header parsing for fragmentation and L4 offset */
|
||||
|
||||
@@ -374,15 +374,14 @@ int mlx5_create_map_eq(struct mlx5_core_dev *dev, struct mlx5_eq *eq, u8 vecidx,
|
||||
snprintf(eq->name, MLX5_MAX_EQ_NAME, "%s@pci:%s",
|
||||
name, pci_name(dev->pdev));
|
||||
eq->eqn = out.eq_number;
|
||||
eq->irqn = vecidx;
|
||||
eq->dev = dev;
|
||||
eq->doorbell = uar->map + MLX5_EQ_DOORBEL_OFFSET;
|
||||
err = request_irq(table->msix_arr[vecidx].vector, mlx5_msix_handler, 0,
|
||||
eq->name, eq);
|
||||
if (err)
|
||||
goto err_eq;
|
||||
|
||||
eq->irqn = vecidx;
|
||||
eq->dev = dev;
|
||||
eq->doorbell = uar->map + MLX5_EQ_DOORBEL_OFFSET;
|
||||
|
||||
err = mlx5_debug_eq_add(dev, eq);
|
||||
if (err)
|
||||
goto err_irq;
|
||||
|
||||
@@ -864,14 +864,14 @@ static int init_one(struct pci_dev *pdev,
|
||||
dev->profile = &profile[prof_sel];
|
||||
dev->event = mlx5_core_event;
|
||||
|
||||
INIT_LIST_HEAD(&priv->ctx_list);
|
||||
spin_lock_init(&priv->ctx_lock);
|
||||
err = mlx5_dev_init(dev, pdev);
|
||||
if (err) {
|
||||
dev_err(&pdev->dev, "mlx5_dev_init failed %d\n", err);
|
||||
goto out;
|
||||
}
|
||||
|
||||
INIT_LIST_HEAD(&priv->ctx_list);
|
||||
spin_lock_init(&priv->ctx_lock);
|
||||
err = mlx5_register_device(dev);
|
||||
if (err) {
|
||||
dev_err(&pdev->dev, "mlx5_register_device failed %d\n", err);
|
||||
|
||||
@@ -2762,7 +2762,8 @@ netxen_fw_poll_work(struct work_struct *work)
|
||||
if (test_bit(__NX_RESETTING, &adapter->state))
|
||||
goto reschedule;
|
||||
|
||||
if (test_bit(__NX_DEV_UP, &adapter->state)) {
|
||||
if (test_bit(__NX_DEV_UP, &adapter->state) &&
|
||||
!(adapter->capabilities & NX_FW_CAPABILITY_LINK_NOTIFICATION)) {
|
||||
if (!adapter->has_link_events) {
|
||||
|
||||
netxen_nic_handle_phy_intr(adapter);
|
||||
|
||||
@@ -180,7 +180,8 @@ static int efx_ef10_probe(struct efx_nic *efx)
|
||||
EFX_MAX_CHANNELS,
|
||||
resource_size(&efx->pci_dev->resource[EFX_MEM_BAR]) /
|
||||
(EFX_VI_PAGE_SIZE * EFX_TXQ_TYPES));
|
||||
BUG_ON(efx->max_channels == 0);
|
||||
if (WARN_ON(efx->max_channels == 0))
|
||||
return -EIO;
|
||||
|
||||
nic_data = kzalloc(sizeof(*nic_data), GFP_KERNEL);
|
||||
if (!nic_data)
|
||||
|
||||
@@ -2243,9 +2243,10 @@ static int smc_drv_probe(struct platform_device *pdev)
|
||||
const struct of_device_id *match = NULL;
|
||||
struct smc_local *lp;
|
||||
struct net_device *ndev;
|
||||
struct resource *res, *ires;
|
||||
struct resource *res;
|
||||
unsigned int __iomem *addr;
|
||||
unsigned long irq_flags = SMC_IRQ_FLAGS;
|
||||
unsigned long irq_resflags;
|
||||
int ret;
|
||||
|
||||
ndev = alloc_etherdev(sizeof(struct smc_local));
|
||||
@@ -2337,16 +2338,19 @@ static int smc_drv_probe(struct platform_device *pdev)
|
||||
goto out_free_netdev;
|
||||
}
|
||||
|
||||
ires = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
|
||||
if (!ires) {
|
||||
ndev->irq = platform_get_irq(pdev, 0);
|
||||
if (ndev->irq <= 0) {
|
||||
ret = -ENODEV;
|
||||
goto out_release_io;
|
||||
}
|
||||
|
||||
ndev->irq = ires->start;
|
||||
|
||||
if (irq_flags == -1 || ires->flags & IRQF_TRIGGER_MASK)
|
||||
irq_flags = ires->flags & IRQF_TRIGGER_MASK;
|
||||
/*
|
||||
* If this platform does not specify any special irqflags, or if
|
||||
* the resource supplies a trigger, override the irqflags with
|
||||
* the trigger flags from the resource.
|
||||
*/
|
||||
irq_resflags = irqd_get_trigger_type(irq_get_irq_data(ndev->irq));
|
||||
if (irq_flags == -1 || irq_resflags & IRQF_TRIGGER_MASK)
|
||||
irq_flags = irq_resflags & IRQF_TRIGGER_MASK;
|
||||
|
||||
ret = smc_request_attrib(pdev, ndev);
|
||||
if (ret)
|
||||
|
||||
@@ -276,6 +276,7 @@ static void stmmac_eee_ctrl_timer(unsigned long arg)
|
||||
bool stmmac_eee_init(struct stmmac_priv *priv)
|
||||
{
|
||||
char *phy_bus_name = priv->plat->phy_bus_name;
|
||||
unsigned long flags;
|
||||
bool ret = false;
|
||||
|
||||
/* Using PCS we cannot dial with the phy registers at this stage
|
||||
@@ -300,6 +301,7 @@ bool stmmac_eee_init(struct stmmac_priv *priv)
|
||||
* changed).
|
||||
* In that case the driver disable own timers.
|
||||
*/
|
||||
spin_lock_irqsave(&priv->lock, flags);
|
||||
if (priv->eee_active) {
|
||||
pr_debug("stmmac: disable EEE\n");
|
||||
del_timer_sync(&priv->eee_ctrl_timer);
|
||||
@@ -307,9 +309,11 @@ bool stmmac_eee_init(struct stmmac_priv *priv)
|
||||
tx_lpi_timer);
|
||||
}
|
||||
priv->eee_active = 0;
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
goto out;
|
||||
}
|
||||
/* Activate the EEE and start timers */
|
||||
spin_lock_irqsave(&priv->lock, flags);
|
||||
if (!priv->eee_active) {
|
||||
priv->eee_active = 1;
|
||||
init_timer(&priv->eee_ctrl_timer);
|
||||
@@ -325,9 +329,10 @@ bool stmmac_eee_init(struct stmmac_priv *priv)
|
||||
/* Set HW EEE according to the speed */
|
||||
priv->hw->mac->set_eee_pls(priv->hw, priv->phydev->link);
|
||||
|
||||
pr_debug("stmmac: Energy-Efficient Ethernet initialized\n");
|
||||
|
||||
ret = true;
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
|
||||
pr_debug("stmmac: Energy-Efficient Ethernet initialized\n");
|
||||
}
|
||||
out:
|
||||
return ret;
|
||||
@@ -760,12 +765,12 @@ static void stmmac_adjust_link(struct net_device *dev)
|
||||
if (new_state && netif_msg_link(priv))
|
||||
phy_print_status(phydev);
|
||||
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
|
||||
/* At this stage, it could be needed to setup the EEE or adjust some
|
||||
* MAC related HW registers.
|
||||
*/
|
||||
priv->eee_enabled = stmmac_eee_init(priv);
|
||||
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -959,12 +964,12 @@ static void stmmac_clear_descriptors(struct stmmac_priv *priv)
|
||||
}
|
||||
|
||||
static int stmmac_init_rx_buffers(struct stmmac_priv *priv, struct dma_desc *p,
|
||||
int i)
|
||||
int i, gfp_t flags)
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
|
||||
skb = __netdev_alloc_skb(priv->dev, priv->dma_buf_sz + NET_IP_ALIGN,
|
||||
GFP_KERNEL);
|
||||
flags);
|
||||
if (!skb) {
|
||||
pr_err("%s: Rx init fails; skb is NULL\n", __func__);
|
||||
return -ENOMEM;
|
||||
@@ -1006,7 +1011,7 @@ static void stmmac_free_rx_buffers(struct stmmac_priv *priv, int i)
|
||||
* and allocates the socket buffers. It suppors the chained and ring
|
||||
* modes.
|
||||
*/
|
||||
static int init_dma_desc_rings(struct net_device *dev)
|
||||
static int init_dma_desc_rings(struct net_device *dev, gfp_t flags)
|
||||
{
|
||||
int i;
|
||||
struct stmmac_priv *priv = netdev_priv(dev);
|
||||
@@ -1041,7 +1046,7 @@ static int init_dma_desc_rings(struct net_device *dev)
|
||||
else
|
||||
p = priv->dma_rx + i;
|
||||
|
||||
ret = stmmac_init_rx_buffers(priv, p, i);
|
||||
ret = stmmac_init_rx_buffers(priv, p, i, flags);
|
||||
if (ret)
|
||||
goto err_init_rx_buffers;
|
||||
|
||||
@@ -1647,11 +1652,6 @@ static int stmmac_hw_setup(struct net_device *dev)
|
||||
struct stmmac_priv *priv = netdev_priv(dev);
|
||||
int ret;
|
||||
|
||||
ret = init_dma_desc_rings(dev);
|
||||
if (ret < 0) {
|
||||
pr_err("%s: DMA descriptors initialization failed\n", __func__);
|
||||
return ret;
|
||||
}
|
||||
/* DMA initialization and SW reset */
|
||||
ret = stmmac_init_dma_engine(priv);
|
||||
if (ret < 0) {
|
||||
@@ -1705,10 +1705,6 @@ static int stmmac_hw_setup(struct net_device *dev)
|
||||
}
|
||||
priv->tx_lpi_timer = STMMAC_DEFAULT_TWT_LS;
|
||||
|
||||
priv->eee_enabled = stmmac_eee_init(priv);
|
||||
|
||||
stmmac_init_tx_coalesce(priv);
|
||||
|
||||
if ((priv->use_riwt) && (priv->hw->dma->rx_watchdog)) {
|
||||
priv->rx_riwt = MAX_DMA_RIWT;
|
||||
priv->hw->dma->rx_watchdog(priv->ioaddr, MAX_DMA_RIWT);
|
||||
@@ -1761,12 +1757,20 @@ static int stmmac_open(struct net_device *dev)
|
||||
goto dma_desc_error;
|
||||
}
|
||||
|
||||
ret = init_dma_desc_rings(dev, GFP_KERNEL);
|
||||
if (ret < 0) {
|
||||
pr_err("%s: DMA descriptors initialization failed\n", __func__);
|
||||
goto init_error;
|
||||
}
|
||||
|
||||
ret = stmmac_hw_setup(dev);
|
||||
if (ret < 0) {
|
||||
pr_err("%s: Hw setup failed\n", __func__);
|
||||
goto init_error;
|
||||
}
|
||||
|
||||
stmmac_init_tx_coalesce(priv);
|
||||
|
||||
if (priv->phydev)
|
||||
phy_start(priv->phydev);
|
||||
|
||||
@@ -1894,7 +1898,10 @@ static netdev_tx_t stmmac_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
unsigned int nopaged_len = skb_headlen(skb);
|
||||
unsigned int enh_desc = priv->plat->enh_desc;
|
||||
|
||||
spin_lock(&priv->tx_lock);
|
||||
|
||||
if (unlikely(stmmac_tx_avail(priv) < nfrags + 1)) {
|
||||
spin_unlock(&priv->tx_lock);
|
||||
if (!netif_queue_stopped(dev)) {
|
||||
netif_stop_queue(dev);
|
||||
/* This is a hard error, log it. */
|
||||
@@ -1903,8 +1910,6 @@ static netdev_tx_t stmmac_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
return NETDEV_TX_BUSY;
|
||||
}
|
||||
|
||||
spin_lock(&priv->tx_lock);
|
||||
|
||||
if (priv->tx_path_in_lpi_mode)
|
||||
stmmac_disable_eee_mode(priv);
|
||||
|
||||
@@ -2025,6 +2030,7 @@ static netdev_tx_t stmmac_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
return NETDEV_TX_OK;
|
||||
|
||||
dma_map_err:
|
||||
spin_unlock(&priv->tx_lock);
|
||||
dev_err(priv->device, "Tx dma map failed\n");
|
||||
dev_kfree_skb(skb);
|
||||
priv->dev->stats.tx_dropped++;
|
||||
@@ -2281,9 +2287,7 @@ static void stmmac_set_rx_mode(struct net_device *dev)
|
||||
{
|
||||
struct stmmac_priv *priv = netdev_priv(dev);
|
||||
|
||||
spin_lock(&priv->lock);
|
||||
priv->hw->mac->set_filter(priv->hw, dev);
|
||||
spin_unlock(&priv->lock);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -2950,7 +2954,7 @@ int stmmac_suspend(struct net_device *ndev)
|
||||
stmmac_set_mac(priv->ioaddr, false);
|
||||
pinctrl_pm_select_sleep_state(priv->device);
|
||||
/* Disable clock in case of PWM is off */
|
||||
clk_disable_unprepare(priv->stmmac_clk);
|
||||
clk_disable(priv->stmmac_clk);
|
||||
}
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
|
||||
@@ -2982,7 +2986,7 @@ int stmmac_resume(struct net_device *ndev)
|
||||
} else {
|
||||
pinctrl_pm_select_default_state(priv->device);
|
||||
/* enable the clk prevously disabled */
|
||||
clk_prepare_enable(priv->stmmac_clk);
|
||||
clk_enable(priv->stmmac_clk);
|
||||
/* reset the phy so that it's ready */
|
||||
if (priv->mii)
|
||||
stmmac_mdio_reset(priv->mii);
|
||||
@@ -2990,7 +2994,9 @@ int stmmac_resume(struct net_device *ndev)
|
||||
|
||||
netif_device_attach(ndev);
|
||||
|
||||
init_dma_desc_rings(ndev, GFP_ATOMIC);
|
||||
stmmac_hw_setup(ndev);
|
||||
stmmac_init_tx_coalesce(priv);
|
||||
|
||||
napi_enable(&priv->napi);
|
||||
|
||||
|
||||
@@ -785,7 +785,6 @@ int cpsw_ale_destroy(struct cpsw_ale *ale)
|
||||
{
|
||||
if (!ale)
|
||||
return -EINVAL;
|
||||
cpsw_ale_stop(ale);
|
||||
cpsw_ale_control_set(ale, 0, ALE_ENABLE, 0);
|
||||
kfree(ale);
|
||||
return 0;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user