diff options
Diffstat (limited to 'drivers/net/ethernet/intel/ice/ice_gnss.c')
| -rw-r--r-- | drivers/net/ethernet/intel/ice/ice_gnss.c | 72 | 
1 files changed, 5 insertions, 67 deletions
diff --git a/drivers/net/ethernet/intel/ice/ice_gnss.c b/drivers/net/ethernet/intel/ice/ice_gnss.c index 2ea8a2b11bcd..75c9de675f20 100644 --- a/drivers/net/ethernet/intel/ice/ice_gnss.c +++ b/drivers/net/ethernet/intel/ice/ice_gnss.c @@ -16,8 +16,8 @@   * * number of bytes written - success   * * negative - error code   */ -static unsigned int -ice_gnss_do_write(struct ice_pf *pf, unsigned char *buf, unsigned int size) +static int +ice_gnss_do_write(struct ice_pf *pf, const unsigned char *buf, unsigned int size)  {  	struct ice_aqc_link_topo_addr link_topo;  	struct ice_hw *hw = &pf->hw; @@ -72,39 +72,7 @@ err_out:  	dev_err(ice_pf_to_dev(pf), "GNSS failed to write, offset=%u, size=%u, err=%d\n",  		offset, size, err); -	return offset; -} - -/** - * ice_gnss_write_pending - Write all pending data to internal GNSS - * @work: GNSS write work structure - */ -static void ice_gnss_write_pending(struct kthread_work *work) -{ -	struct gnss_serial *gnss = container_of(work, struct gnss_serial, -						write_work); -	struct ice_pf *pf = gnss->back; - -	if (!pf) -		return; - -	if (!test_bit(ICE_FLAG_GNSS, pf->flags)) -		return; - -	if (!list_empty(&gnss->queue)) { -		struct gnss_write_buf *write_buf = NULL; -		unsigned int bytes; - -		write_buf = list_first_entry(&gnss->queue, -					     struct gnss_write_buf, queue); - -		bytes = ice_gnss_do_write(pf, write_buf->buf, write_buf->size); -		dev_dbg(ice_pf_to_dev(pf), "%u bytes written to GNSS\n", bytes); - -		list_del(&write_buf->queue); -		kfree(write_buf->buf); -		kfree(write_buf); -	} +	return err;  }  /** @@ -128,12 +96,7 @@ static void ice_gnss_read(struct kthread_work *work)  	int err = 0;  	pf = gnss->back; -	if (!pf) { -		err = -EFAULT; -		goto exit; -	} - -	if (!test_bit(ICE_FLAG_GNSS, pf->flags)) +	if (!pf || !test_bit(ICE_FLAG_GNSS, pf->flags))  		return;  	hw = &pf->hw; @@ -191,7 +154,6 @@ free_buf:  	free_page((unsigned long)buf);  requeue:  	kthread_queue_delayed_work(gnss->kworker, &gnss->read_work, delay); -exit:  	if (err)  		dev_dbg(ice_pf_to_dev(pf), "GNSS failed to read err=%d\n", err);  } @@ -220,8 +182,6 @@ static struct gnss_serial *ice_gnss_struct_init(struct ice_pf *pf)  	pf->gnss_serial = gnss;  	kthread_init_delayed_work(&gnss->read_work, ice_gnss_read); -	INIT_LIST_HEAD(&gnss->queue); -	kthread_init_work(&gnss->write_work, ice_gnss_write_pending);  	kworker = kthread_create_worker(0, "ice-gnss-%s", dev_name(dev));  	if (IS_ERR(kworker)) {  		kfree(gnss); @@ -281,7 +241,6 @@ static void ice_gnss_close(struct gnss_device *gdev)  	if (!gnss)  		return; -	kthread_cancel_work_sync(&gnss->write_work);  	kthread_cancel_delayed_work_sync(&gnss->read_work);  } @@ -300,10 +259,7 @@ ice_gnss_write(struct gnss_device *gdev, const unsigned char *buf,  	       size_t count)  {  	struct ice_pf *pf = gnss_get_drvdata(gdev); -	struct gnss_write_buf *write_buf;  	struct gnss_serial *gnss; -	unsigned char *cmd_buf; -	int err = count;  	/* We cannot write a single byte using our I2C implementation. */  	if (count <= 1 || count > ICE_GNSS_TTY_WRITE_BUF) @@ -319,24 +275,7 @@ ice_gnss_write(struct gnss_device *gdev, const unsigned char *buf,  	if (!gnss)  		return -ENODEV; -	cmd_buf = kcalloc(count, sizeof(*buf), GFP_KERNEL); -	if (!cmd_buf) -		return -ENOMEM; - -	memcpy(cmd_buf, buf, count); -	write_buf = kzalloc(sizeof(*write_buf), GFP_KERNEL); -	if (!write_buf) { -		kfree(cmd_buf); -		return -ENOMEM; -	} - -	write_buf->buf = cmd_buf; -	write_buf->size = count; -	INIT_LIST_HEAD(&write_buf->queue); -	list_add_tail(&write_buf->queue, &gnss->queue); -	kthread_queue_work(gnss->kworker, &gnss->write_work); - -	return err; +	return ice_gnss_do_write(pf, buf, count);  }  static const struct gnss_operations ice_gnss_ops = { @@ -432,7 +371,6 @@ void ice_gnss_exit(struct ice_pf *pf)  	if (pf->gnss_serial) {  		struct gnss_serial *gnss = pf->gnss_serial; -		kthread_cancel_work_sync(&gnss->write_work);  		kthread_cancel_delayed_work_sync(&gnss->read_work);  		kthread_destroy_worker(gnss->kworker);  		gnss->kworker = NULL;  |