|
@@ -757,6 +757,14 @@ requeue:
|
|
static irqreturn_t cpsw_interrupt(int irq, void *dev_id)
|
|
static irqreturn_t cpsw_interrupt(int irq, void *dev_id)
|
|
{
|
|
{
|
|
struct cpsw_priv *priv = dev_id;
|
|
struct cpsw_priv *priv = dev_id;
|
|
|
|
+ int value = irq - priv->irqs_table[0];
|
|
|
|
+
|
|
|
|
+ /* NOTICE: Ending IRQ here. The trick with the 'value' variable above
|
|
|
|
+ * is to make sure we will always write the correct value to the EOI
|
|
|
|
+ * register. Namely 0 for RX_THRESH Interrupt, 1 for RX Interrupt, 2
|
|
|
|
+ * for TX Interrupt and 3 for MISC Interrupt.
|
|
|
|
+ */
|
|
|
|
+ cpdma_ctlr_eoi(priv->dma, value);
|
|
|
|
|
|
cpsw_intr_disable(priv);
|
|
cpsw_intr_disable(priv);
|
|
if (priv->irq_enabled == true) {
|
|
if (priv->irq_enabled == true) {
|
|
@@ -786,8 +794,6 @@ static int cpsw_poll(struct napi_struct *napi, int budget)
|
|
int num_tx, num_rx;
|
|
int num_tx, num_rx;
|
|
|
|
|
|
num_tx = cpdma_chan_process(priv->txch, 128);
|
|
num_tx = cpdma_chan_process(priv->txch, 128);
|
|
- if (num_tx)
|
|
|
|
- cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_TX);
|
|
|
|
|
|
|
|
num_rx = cpdma_chan_process(priv->rxch, budget);
|
|
num_rx = cpdma_chan_process(priv->rxch, budget);
|
|
if (num_rx < budget) {
|
|
if (num_rx < budget) {
|
|
@@ -795,7 +801,6 @@ static int cpsw_poll(struct napi_struct *napi, int budget)
|
|
|
|
|
|
napi_complete(napi);
|
|
napi_complete(napi);
|
|
cpsw_intr_enable(priv);
|
|
cpsw_intr_enable(priv);
|
|
- cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_RX);
|
|
|
|
prim_cpsw = cpsw_get_slave_priv(priv, 0);
|
|
prim_cpsw = cpsw_get_slave_priv(priv, 0);
|
|
if (prim_cpsw->irq_enabled == false) {
|
|
if (prim_cpsw->irq_enabled == false) {
|
|
prim_cpsw->irq_enabled = true;
|
|
prim_cpsw->irq_enabled = true;
|
|
@@ -1310,8 +1315,6 @@ static int cpsw_ndo_open(struct net_device *ndev)
|
|
napi_enable(&priv->napi);
|
|
napi_enable(&priv->napi);
|
|
cpdma_ctlr_start(priv->dma);
|
|
cpdma_ctlr_start(priv->dma);
|
|
cpsw_intr_enable(priv);
|
|
cpsw_intr_enable(priv);
|
|
- cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_RX);
|
|
|
|
- cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_TX);
|
|
|
|
|
|
|
|
prim_cpsw = cpsw_get_slave_priv(priv, 0);
|
|
prim_cpsw = cpsw_get_slave_priv(priv, 0);
|
|
if (prim_cpsw->irq_enabled == false) {
|
|
if (prim_cpsw->irq_enabled == false) {
|
|
@@ -1578,9 +1581,6 @@ static void cpsw_ndo_tx_timeout(struct net_device *ndev)
|
|
cpdma_chan_start(priv->txch);
|
|
cpdma_chan_start(priv->txch);
|
|
cpdma_ctlr_int_ctrl(priv->dma, true);
|
|
cpdma_ctlr_int_ctrl(priv->dma, true);
|
|
cpsw_intr_enable(priv);
|
|
cpsw_intr_enable(priv);
|
|
- cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_RX);
|
|
|
|
- cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_TX);
|
|
|
|
-
|
|
|
|
}
|
|
}
|
|
|
|
|
|
static int cpsw_ndo_set_mac_address(struct net_device *ndev, void *p)
|
|
static int cpsw_ndo_set_mac_address(struct net_device *ndev, void *p)
|
|
@@ -1620,9 +1620,6 @@ static void cpsw_ndo_poll_controller(struct net_device *ndev)
|
|
cpsw_interrupt(ndev->irq, priv);
|
|
cpsw_interrupt(ndev->irq, priv);
|
|
cpdma_ctlr_int_ctrl(priv->dma, true);
|
|
cpdma_ctlr_int_ctrl(priv->dma, true);
|
|
cpsw_intr_enable(priv);
|
|
cpsw_intr_enable(priv);
|
|
- cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_RX);
|
|
|
|
- cpdma_ctlr_eoi(priv->dma, CPDMA_EOI_TX);
|
|
|
|
-
|
|
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
|