Skip to content

Commit dc4e05d

Browse files
hongliu68Jiri Kosina
authored andcommitted
HID: intel-ish-hid: using list_head for ipc write queue
Currently wr_msg_ctl_info is used in ishtp_device just for list head purpose, using list_head directly can save ~150 bytes size for each replacement. Also this patch can save ~170 bytes of code size in intel-ish-ipc.ko. Signed-off-by: Hong Liu <hong.liu@intel.com> Acked-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com> Signed-off-by: Jiri Kosina <jkosina@suse.cz>
1 parent 946a777 commit dc4e05d

File tree

2 files changed

+15
-19
lines changed

2 files changed

+15
-19
lines changed

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

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -280,14 +280,14 @@ static int write_ipc_from_queue(struct ishtp_device *dev)
280280
* if tx send list is empty - return 0;
281281
* may happen, as RX_COMPLETE handler doesn't check list emptiness.
282282
*/
283-
if (list_empty(&dev->wr_processing_list_head.link)) {
283+
if (list_empty(&dev->wr_processing_list)) {
284284
spin_unlock_irqrestore(&dev->wr_processing_spinlock, flags);
285285
out_ipc_locked = 0;
286286
return 0;
287287
}
288288

289-
ipc_link = list_entry(dev->wr_processing_list_head.link.next,
290-
struct wr_msg_ctl_info, link);
289+
ipc_link = list_first_entry(&dev->wr_processing_list,
290+
struct wr_msg_ctl_info, link);
291291
/* first 4 bytes of the data is the doorbell value (IPC header) */
292292
length = ipc_link->length - sizeof(uint32_t);
293293
doorbell_val = *(uint32_t *)ipc_link->inline_data;
@@ -338,7 +338,7 @@ static int write_ipc_from_queue(struct ishtp_device *dev)
338338
ipc_send_compl = ipc_link->ipc_send_compl;
339339
ipc_send_compl_prm = ipc_link->ipc_send_compl_prm;
340340
list_del_init(&ipc_link->link);
341-
list_add_tail(&ipc_link->link, &dev->wr_free_list_head.link);
341+
list_add(&ipc_link->link, &dev->wr_free_list);
342342
spin_unlock_irqrestore(&dev->wr_processing_spinlock, flags);
343343

344344
/*
@@ -372,26 +372,26 @@ static int write_ipc_to_queue(struct ishtp_device *dev,
372372
unsigned char *msg, int length)
373373
{
374374
struct wr_msg_ctl_info *ipc_link;
375-
unsigned long flags;
375+
unsigned long flags;
376376

377377
if (length > IPC_FULL_MSG_SIZE)
378378
return -EMSGSIZE;
379379

380380
spin_lock_irqsave(&dev->wr_processing_spinlock, flags);
381-
if (list_empty(&dev->wr_free_list_head.link)) {
381+
if (list_empty(&dev->wr_free_list)) {
382382
spin_unlock_irqrestore(&dev->wr_processing_spinlock, flags);
383383
return -ENOMEM;
384384
}
385-
ipc_link = list_entry(dev->wr_free_list_head.link.next,
386-
struct wr_msg_ctl_info, link);
385+
ipc_link = list_first_entry(&dev->wr_free_list,
386+
struct wr_msg_ctl_info, link);
387387
list_del_init(&ipc_link->link);
388388

389389
ipc_link->ipc_send_compl = ipc_send_compl;
390390
ipc_link->ipc_send_compl_prm = ipc_send_compl_prm;
391391
ipc_link->length = length;
392392
memcpy(ipc_link->inline_data, msg, length);
393393

394-
list_add_tail(&ipc_link->link, &dev->wr_processing_list_head.link);
394+
list_add_tail(&ipc_link->link, &dev->wr_processing_list);
395395
spin_unlock_irqrestore(&dev->wr_processing_spinlock, flags);
396396

397397
write_ipc_from_queue(dev);
@@ -487,17 +487,13 @@ static int ish_fw_reset_handler(struct ishtp_device *dev)
487487
{
488488
uint32_t reset_id;
489489
unsigned long flags;
490-
struct wr_msg_ctl_info *processing, *next;
491490

492491
/* Read reset ID */
493492
reset_id = ish_reg_read(dev, IPC_REG_ISH2HOST_MSG) & 0xFFFF;
494493

495494
/* Clear IPC output queue */
496495
spin_lock_irqsave(&dev->wr_processing_spinlock, flags);
497-
list_for_each_entry_safe(processing, next,
498-
&dev->wr_processing_list_head.link, link) {
499-
list_move_tail(&processing->link, &dev->wr_free_list_head.link);
500-
}
496+
list_splice_init(&dev->wr_processing_list, &dev->wr_free_list);
501497
spin_unlock_irqrestore(&dev->wr_processing_spinlock, flags);
502498

503499
/* ISHTP notification in IPC_RESET */
@@ -921,9 +917,9 @@ struct ishtp_device *ish_dev_init(struct pci_dev *pdev)
921917
spin_lock_init(&dev->out_ipc_spinlock);
922918

923919
/* Init IPC processing and free lists */
924-
INIT_LIST_HEAD(&dev->wr_processing_list_head.link);
925-
INIT_LIST_HEAD(&dev->wr_free_list_head.link);
926-
for (i = 0; i < IPC_TX_FIFO_SIZE; ++i) {
920+
INIT_LIST_HEAD(&dev->wr_processing_list);
921+
INIT_LIST_HEAD(&dev->wr_free_list);
922+
for (i = 0; i < IPC_TX_FIFO_SIZE; i++) {
927923
struct wr_msg_ctl_info *tx_buf;
928924

929925
tx_buf = devm_kzalloc(&pdev->dev,
@@ -939,7 +935,7 @@ struct ishtp_device *ish_dev_init(struct pci_dev *pdev)
939935
i);
940936
break;
941937
}
942-
list_add_tail(&tx_buf->link, &dev->wr_free_list_head.link);
938+
list_add_tail(&tx_buf->link, &dev->wr_free_list);
943939
}
944940

945941
dev->ops = &ish_hw_ops;

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ struct ishtp_device {
207207
struct work_struct bh_hbm_work;
208208

209209
/* IPC write queue */
210-
struct wr_msg_ctl_info wr_processing_list_head, wr_free_list_head;
210+
struct list_head wr_processing_list, wr_free_list;
211211
/* For both processing list and free list */
212212
spinlock_t wr_processing_spinlock;
213213

0 commit comments

Comments
 (0)