Skip to content

Commit b22f805

Browse files
hongliu68Jiri Kosina
authored andcommitted
HID: intel-ish-hid: Optimize writing ipc message from queue
Currently we are using one additional static variable and a spinlock to prevent contention of writing IPC messages to ISH hardware, which is not necessary. Once ISH is ready to accept new data, we can push new data to hardware. This pushing of new data is already protected by wr_processing_spinlock for contention, which is enough. So use this spinlock to check both readiness for accepting new data and once ready allow writing of ipc message from queue to ISH hardware. While here, cleaned up some space after return. Signed-off-by: Hong Liu <[email protected]> Tested-by: Hongyan Song <[email protected]> Acked-by: Srinivas Pandruvada <[email protected]> Signed-off-by: Jiri Kosina <[email protected]>
1 parent 0d28f49 commit b22f805

File tree

2 files changed

+3
-18
lines changed

2 files changed

+3
-18
lines changed

drivers/hid/intel-ish-hid/ipc/ipc.c

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -256,33 +256,22 @@ static int write_ipc_from_queue(struct ishtp_device *dev)
256256
int i;
257257
void (*ipc_send_compl)(void *);
258258
void *ipc_send_compl_prm;
259-
static int out_ipc_locked;
260-
unsigned long out_ipc_flags;
261259

262260
if (dev->dev_state == ISHTP_DEV_DISABLED)
263-
return -EINVAL;
261+
return -EINVAL;
264262

265-
spin_lock_irqsave(&dev->out_ipc_spinlock, out_ipc_flags);
266-
if (out_ipc_locked) {
267-
spin_unlock_irqrestore(&dev->out_ipc_spinlock, out_ipc_flags);
268-
return -EBUSY;
269-
}
270-
out_ipc_locked = 1;
263+
spin_lock_irqsave(&dev->wr_processing_spinlock, flags);
271264
if (!ish_is_input_ready(dev)) {
272-
out_ipc_locked = 0;
273-
spin_unlock_irqrestore(&dev->out_ipc_spinlock, out_ipc_flags);
265+
spin_unlock_irqrestore(&dev->wr_processing_spinlock, flags);
274266
return -EBUSY;
275267
}
276-
spin_unlock_irqrestore(&dev->out_ipc_spinlock, out_ipc_flags);
277268

278-
spin_lock_irqsave(&dev->wr_processing_spinlock, flags);
279269
/*
280270
* if tx send list is empty - return 0;
281271
* may happen, as RX_COMPLETE handler doesn't check list emptiness.
282272
*/
283273
if (list_empty(&dev->wr_processing_list)) {
284274
spin_unlock_irqrestore(&dev->wr_processing_spinlock, flags);
285-
out_ipc_locked = 0;
286275
return 0;
287276
}
288277

@@ -333,7 +322,6 @@ static int write_ipc_from_queue(struct ishtp_device *dev)
333322
dev->ipc_tx_bytes_cnt += IPC_HEADER_GET_LENGTH(doorbell_val);
334323

335324
ish_reg_write(dev, IPC_REG_HOST2ISH_DRBL, doorbell_val);
336-
out_ipc_locked = 0;
337325

338326
ipc_send_compl = ipc_link->ipc_send_compl;
339327
ipc_send_compl_prm = ipc_link->ipc_send_compl_prm;
@@ -914,7 +902,6 @@ struct ishtp_device *ish_dev_init(struct pci_dev *pdev)
914902
init_waitqueue_head(&dev->wait_hw_ready);
915903

916904
spin_lock_init(&dev->wr_processing_spinlock);
917-
spin_lock_init(&dev->out_ipc_spinlock);
918905

919906
/* Init IPC processing and free lists */
920907
INIT_LIST_HEAD(&dev->wr_processing_list);

drivers/hid/intel-ish-hid/ishtp/ishtp-dev.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -211,8 +211,6 @@ struct ishtp_device {
211211
/* For both processing list and free list */
212212
spinlock_t wr_processing_spinlock;
213213

214-
spinlock_t out_ipc_spinlock;
215-
216214
struct ishtp_fw_client *fw_clients; /*Note:memory has to be allocated*/
217215
DECLARE_BITMAP(fw_clients_map, ISHTP_CLIENTS_MAX);
218216
DECLARE_BITMAP(host_clients_map, ISHTP_CLIENTS_MAX);

0 commit comments

Comments
 (0)