Re: [PATCH net-next v4 02/13] net: wwan: t7xx: Add control DMA interface
flat view
From: "Martinez, Ricardo" <ricardo.martinez@linux.intel.com>
Date: 2022-01-18 22:22:12
Also in:
linux-wireless
On 1/18/2022 6:13 AM, Ilpo Järvinen wrote:
On Thu, 13 Jan 2022, Ricardo Martinez wrote:
...
quoted
+#define CLDMA_NUM 2I tried to understand its purpose but it seems that only one of the indexes is used in the arrays where this define gives the size? Related to this, ID_CLDMA0 is not used anywhere?
The modem HW has 2 CLDMAs, idx 0 for the app processor (SAP) and idx 1 for the modem (MD). CLDMA_NUM is defined as 2 to reflect the HW capabilities but mainly to have a cleaner upcoming patches, which will use ID_CLDMA0. If having array's of size 1 is not a problem then we can define CLDMA_NUM as 1 and play with the CLDMA indexes. ...
quoted
+static void t7xx_cldma_enable_irq(struct cldma_ctrl *md_ctrl) +{ + t7xx_pcie_mac_set_int(md_ctrl->t7xx_dev, md_ctrl->hw_info.phy_interrupt_id); +} + +static void t7xx_cldma_disable_irq(struct cldma_ctrl *md_ctrl) +{ + t7xx_pcie_mac_clear_int(md_ctrl->t7xx_dev, md_ctrl->hw_info.phy_interrupt_id); +}t7xx_pcie_mac_set_int and t7xx_pcie_mac_clear_int are only defined by a later patch.quoted
+static bool t7xx_cldma_qs_are_active(struct t7xx_cldma_hw *hw_info) +{ + unsigned int tx_active; + unsigned int rx_active; + + tx_active = t7xx_cldma_hw_queue_status(hw_info, CLDMA_ALL_Q, MTK_TX); + rx_active = t7xx_cldma_hw_queue_status(hw_info, CLDMA_ALL_Q, MTK_RX); + if (tx_active == CLDMA_INVALID_STATUS || rx_active == CLDMA_INVALID_STATUS)These cannot ever be true because of mask in t7xx_cldma_hw_queue_status().
t7xx_cldma_hw_queue_status() shouldn't apply the mask for CLDMA_ALL_Q.
quoted
+static int t7xx_cldma_clear_rxq(struct cldma_ctrl *md_ctrl, int qnum) +{ + struct cldma_queue *rxq = &md_ctrl->rxq[qnum]; + struct cldma_request *req; + struct cldma_rgpd *rgpd; + unsigned long flags; + + spin_lock_irqsave(&rxq->ring_lock, flags); + t7xx_cldma_q_reset(rxq); + list_for_each_entry(req, &rxq->tr_ring->gpd_ring, entry) { + rgpd = req->gpd; + rgpd->gpd_flags = GPD_FLAGS_IOC | GPD_FLAGS_HWO; + rgpd->data_buff_len = 0; + + if (req->skb) { + req->skb->len = 0; + skb_reset_tail_pointer(req->skb); + } + } + + spin_unlock_irqrestore(&rxq->ring_lock, flags); + list_for_each_entry(req, &rxq->tr_ring->gpd_ring, entry) { + int ret;I find this kind of newline+unlock+more code a bit odd groupingwise. IMO, the newline should be after the unlock rather than just before it to better indicate the critical sections visually.
Agree. In general, the driver uses a newline after '}', unlock operations should be an exception since it looks better to keep the critical section blocks together. ...
quoted
+/** + * t7xx_cldma_send_skb() - Send control data to modem. + * @md_ctrl: CLDMA context structure. + * @qno: Queue number. + * @skb: Socket buffer. + * @blocking: True for blocking operation. + * + * Send control packet to modem using a ring buffer. + * If blocking is set, it will wait for completion. + * + * Return: + * * 0 - Success. + * * -ENOMEM - Allocation failure. + * * -EINVAL - Invalid queue request. + * * -EBUSY - Resource lock failure. + */ +int t7xx_cldma_send_skb(struct cldma_ctrl *md_ctrl, int qno, struct sk_buff *skb, bool blocking) +{ + struct cldma_request *tx_req; + struct cldma_queue *queue; + unsigned long flags; + int ret; + + if (qno >= CLDMA_TXQ_NUM) + return -EINVAL; + + queue = &md_ctrl->txq[qno]; + + spin_lock_irqsave(&md_ctrl->cldma_lock, flags); + if (!(md_ctrl->txq_active & BIT(qno))) { + ret = -EBUSY; + spin_unlock_irqrestore(&md_ctrl->cldma_lock, flags); + goto allow_sleep; + }...quoted
+ if (!blocking) { + ret = -EBUSY; + break; + } + + ret = wait_event_interruptible_exclusive(queue->req_wq, queue->budget > 0); + } while (!ret); + +allow_sleep: + return ret; +}First of all, if I interpreted the call chains correctly, this function is always called with blocking=true. Second, the first codepath returning -EBUSY when not txq_active seems twisted/reversed logic to me (not active => busy ?!?).
What about -EINVAL? Other codes considered: -EPERM, -ENETDOWN.
...