diff options
| author | Dmitry Torokhov <[email protected]> | 2023-08-30 16:06:38 -0700 | 
|---|---|---|
| committer | Dmitry Torokhov <[email protected]> | 2023-08-30 16:06:38 -0700 | 
| commit | 1ac731c529cd4d6adbce134754b51ff7d822b145 (patch) | |
| tree | 143ab3f35ca5f3b69f583c84e6964b17139c2ec1 /drivers/net/can/m_can/m_can.c | |
| parent | 07b4c950f27bef0362dc6ad7ee713aab61d58149 (diff) | |
| parent | 54116d442e001e1b6bd482122043b1870998a1f3 (diff) | |
Merge branch 'next' into for-linus
Prepare input updates for 6.6 merge window.
Diffstat (limited to 'drivers/net/can/m_can/m_can.c')
| -rw-r--r-- | drivers/net/can/m_can/m_can.c | 37 | 
1 files changed, 19 insertions, 18 deletions
diff --git a/drivers/net/can/m_can/m_can.c b/drivers/net/can/m_can/m_can.c index 8e83d6963d85..a5003435802b 100644 --- a/drivers/net/can/m_can/m_can.c +++ b/drivers/net/can/m_can/m_can.c @@ -972,8 +972,8 @@ static int m_can_rx_peripheral(struct net_device *dev, u32 irqstatus)  	/* Don't re-enable interrupts if the driver had a fatal error  	 * (e.g., FIFO read failure).  	 */ -	if (work_done >= 0) -		m_can_enable_all_interrupts(cdev); +	if (work_done < 0) +		m_can_disable_all_interrupts(cdev);  	return work_done;  } @@ -1083,8 +1083,7 @@ static irqreturn_t m_can_isr(int irq, void *dev_id)  		return IRQ_NONE;  	/* ACK all irqs */ -	if (ir & IR_ALL_INT) -		m_can_write(cdev, M_CAN_IR, ir); +	m_can_write(cdev, M_CAN_IR, ir);  	if (cdev->ops->clear_interrupts)  		cdev->ops->clear_interrupts(cdev); @@ -1096,11 +1095,12 @@ static irqreturn_t m_can_isr(int irq, void *dev_id)  	 */  	if ((ir & IR_RF0N) || (ir & IR_ERR_ALL_30X)) {  		cdev->irqstatus = ir; -		m_can_disable_all_interrupts(cdev); -		if (!cdev->is_peripheral) +		if (!cdev->is_peripheral) { +			m_can_disable_all_interrupts(cdev);  			napi_schedule(&cdev->napi); -		else if (m_can_rx_peripheral(dev, ir) < 0) +		} else if (m_can_rx_peripheral(dev, ir) < 0) {  			goto out_fail; +		}  	}  	if (cdev->version == 30) { @@ -1262,6 +1262,7 @@ static int m_can_set_bittiming(struct net_device *dev)  static int m_can_chip_config(struct net_device *dev)  {  	struct m_can_classdev *cdev = netdev_priv(dev); +	u32 interrupts = IR_ALL_INT;  	u32 cccr, test;  	int err; @@ -1271,6 +1272,11 @@ static int m_can_chip_config(struct net_device *dev)  		return err;  	} +	/* Disable unused interrupts */ +	interrupts &= ~(IR_ARA | IR_ELO | IR_DRX | IR_TEFF | IR_TEFW | IR_TFE | +			IR_TCF | IR_HPM | IR_RF1F | IR_RF1W | IR_RF1N | +			IR_RF0F | IR_RF0W); +  	m_can_config_endisable(cdev, true);  	/* RX Buffer/FIFO Element Size 64 bytes data field */ @@ -1365,16 +1371,13 @@ static int m_can_chip_config(struct net_device *dev)  	m_can_write(cdev, M_CAN_TEST, test);  	/* Enable interrupts */ -	m_can_write(cdev, M_CAN_IR, IR_ALL_INT); -	if (!(cdev->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING)) +	if (!(cdev->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING)) {  		if (cdev->version == 30) -			m_can_write(cdev, M_CAN_IE, IR_ALL_INT & -				    ~(IR_ERR_LEC_30X)); +			interrupts &= ~(IR_ERR_LEC_30X);  		else -			m_can_write(cdev, M_CAN_IE, IR_ALL_INT & -				    ~(IR_ERR_LEC_31X)); -	else -		m_can_write(cdev, M_CAN_IE, IR_ALL_INT); +			interrupts &= ~(IR_ERR_LEC_31X); +	} +	m_can_write(cdev, M_CAN_IE, interrupts);  	/* route all interrupts to INT0 */  	m_can_write(cdev, M_CAN_ILS, ILS_ALL_INT0); @@ -1592,10 +1595,8 @@ static int m_can_close(struct net_device *dev)  		cdev->tx_skb = NULL;  		destroy_workqueue(cdev->tx_wq);  		cdev->tx_wq = NULL; -	} - -	if (cdev->is_peripheral)  		can_rx_offload_disable(&cdev->offload); +	}  	close_candev(dev);  |