diff options
Diffstat (limited to 'drivers/net/ieee802154/mrf24j40.c')
| -rw-r--r-- | drivers/net/ieee802154/mrf24j40.c | 70 | 
1 files changed, 25 insertions, 45 deletions
diff --git a/drivers/net/ieee802154/mrf24j40.c b/drivers/net/ieee802154/mrf24j40.c index 42e6deee6db..4048062011b 100644 --- a/drivers/net/ieee802154/mrf24j40.c +++ b/drivers/net/ieee802154/mrf24j40.c @@ -82,7 +82,6 @@ struct mrf24j40 {  	struct mutex buffer_mutex; /* only used to protect buf */  	struct completion tx_complete; -	struct work_struct irqwork;  	u8 *buf; /* 3 bytes. Used for SPI single-register transfers. */  }; @@ -344,6 +343,8 @@ static int mrf24j40_tx(struct ieee802154_dev *dev, struct sk_buff *skb)  	if (ret)  		goto err; +	reinit_completion(&devrec->tx_complete); +  	/* Set TXNTRIG bit of TXNCON to send packet */  	ret = read_short_reg(devrec, REG_TXNCON, &val);  	if (ret) @@ -354,8 +355,6 @@ static int mrf24j40_tx(struct ieee802154_dev *dev, struct sk_buff *skb)  		val |= 0x4;  	write_short_reg(devrec, REG_TXNCON, val); -	INIT_COMPLETION(devrec->tx_complete); -  	/* Wait for the device to send the TX complete interrupt. */  	ret = wait_for_completion_interruptible_timeout(  						&devrec->tx_complete, @@ -466,8 +465,8 @@ static int mrf24j40_filter(struct ieee802154_dev *dev,  	if (changed & IEEE802515_AFILT_SADDR_CHANGED) {  		/* Short Addr */  		u8 addrh, addrl; -		addrh = filt->short_addr >> 8 & 0xff; -		addrl = filt->short_addr & 0xff; +		addrh = le16_to_cpu(filt->short_addr) >> 8 & 0xff; +		addrl = le16_to_cpu(filt->short_addr) & 0xff;  		write_short_reg(devrec, REG_SADRH, addrh);  		write_short_reg(devrec, REG_SADRL, addrl); @@ -477,15 +476,16 @@ static int mrf24j40_filter(struct ieee802154_dev *dev,  	if (changed & IEEE802515_AFILT_IEEEADDR_CHANGED) {  		/* Device Address */ -		int i; +		u8 i, addr[8]; + +		memcpy(addr, &filt->ieee_addr, 8);  		for (i = 0; i < 8; i++) -			write_short_reg(devrec, REG_EADR0+i, -					filt->ieee_addr[7-i]); +			write_short_reg(devrec, REG_EADR0 + i, addr[i]);  #ifdef DEBUG  		printk(KERN_DEBUG "Set long addr to: ");  		for (i = 0; i < 8; i++) -			printk("%02hhx ", filt->ieee_addr[i]); +			printk("%02hhx ", addr[7 - i]);  		printk(KERN_DEBUG "\n");  #endif  	} @@ -493,8 +493,8 @@ static int mrf24j40_filter(struct ieee802154_dev *dev,  	if (changed & IEEE802515_AFILT_PANID_CHANGED) {  		/* PAN ID */  		u8 panidl, panidh; -		panidh = filt->pan_id >> 8 & 0xff; -		panidl = filt->pan_id & 0xff; +		panidh = le16_to_cpu(filt->pan_id) >> 8 & 0xff; +		panidl = le16_to_cpu(filt->pan_id) & 0xff;  		write_short_reg(devrec, REG_PANIDH, panidh);  		write_short_reg(devrec, REG_PANIDL, panidl); @@ -590,17 +590,6 @@ static struct ieee802154_ops mrf24j40_ops = {  static irqreturn_t mrf24j40_isr(int irq, void *data)  {  	struct mrf24j40 *devrec = data; - -	disable_irq_nosync(irq); - -	schedule_work(&devrec->irqwork); - -	return IRQ_HANDLED; -} - -static void mrf24j40_isrwork(struct work_struct *work) -{ -	struct mrf24j40 *devrec = container_of(work, struct mrf24j40, irqwork);  	u8 intstat;  	int ret; @@ -618,7 +607,7 @@ static void mrf24j40_isrwork(struct work_struct *work)  		mrf24j40_handle_rx(devrec);  out: -	enable_irq(devrec->spi->irq); +	return IRQ_HANDLED;  }  static int mrf24j40_probe(struct spi_device *spi) @@ -629,12 +618,12 @@ static int mrf24j40_probe(struct spi_device *spi)  	printk(KERN_INFO "mrf24j40: probe(). IRQ: %d\n", spi->irq); -	devrec = kzalloc(sizeof(struct mrf24j40), GFP_KERNEL); +	devrec = devm_kzalloc(&spi->dev, sizeof(struct mrf24j40), GFP_KERNEL);  	if (!devrec) -		goto err_devrec; -	devrec->buf = kzalloc(3, GFP_KERNEL); +		goto err_ret; +	devrec->buf = devm_kzalloc(&spi->dev, 3, GFP_KERNEL);  	if (!devrec->buf) -		goto err_buf; +		goto err_ret;  	spi->mode = SPI_MODE_0; /* TODO: Is this appropriate for right here? */  	if (spi->max_speed_hz > MAX_SPI_SPEED_HZ) @@ -642,7 +631,6 @@ static int mrf24j40_probe(struct spi_device *spi)  	mutex_init(&devrec->buffer_mutex);  	init_completion(&devrec->tx_complete); -	INIT_WORK(&devrec->irqwork, mrf24j40_isrwork);  	devrec->spi = spi;  	spi_set_drvdata(spi, devrec); @@ -650,7 +638,7 @@ static int mrf24j40_probe(struct spi_device *spi)  	devrec->dev = ieee802154_alloc_device(0, &mrf24j40_ops);  	if (!devrec->dev) -		goto err_alloc_dev; +		goto err_ret;  	devrec->dev->priv = devrec;  	devrec->dev->parent = &devrec->spi->dev; @@ -688,11 +676,13 @@ static int mrf24j40_probe(struct spi_device *spi)  	val &= ~0x3; /* Clear RX mode (normal) */  	write_short_reg(devrec, REG_RXMCR, val); -	ret = request_irq(spi->irq, -			  mrf24j40_isr, -			  IRQF_TRIGGER_FALLING, -			  dev_name(&spi->dev), -			  devrec); +	ret = devm_request_threaded_irq(&spi->dev, +					spi->irq, +					NULL, +					mrf24j40_isr, +					IRQF_TRIGGER_LOW|IRQF_ONESHOT, +					dev_name(&spi->dev), +					devrec);  	if (ret) {  		dev_err(printdev(devrec), "Unable to get IRQ"); @@ -706,11 +696,7 @@ err_read_reg:  	ieee802154_unregister_device(devrec->dev);  err_register_device:  	ieee802154_free_device(devrec->dev); -err_alloc_dev: -	kfree(devrec->buf); -err_buf: -	kfree(devrec); -err_devrec: +err_ret:  	return ret;  } @@ -720,17 +706,11 @@ static int mrf24j40_remove(struct spi_device *spi)  	dev_dbg(printdev(devrec), "remove\n"); -	free_irq(spi->irq, devrec); -	flush_work(&devrec->irqwork); /* TODO: Is this the right call? */  	ieee802154_unregister_device(devrec->dev);  	ieee802154_free_device(devrec->dev);  	/* TODO: Will ieee802154_free_device() wait until ->xmit() is  	 * complete? */ -	/* Clean up the SPI stuff. */ -	spi_set_drvdata(spi, NULL); -	kfree(devrec->buf); -	kfree(devrec);  	return 0;  }  | 
