diff options
Diffstat (limited to 'drivers/rapidio/devices/tsi721.c')
| -rw-r--r-- | drivers/rapidio/devices/tsi721.c | 41 | 
1 files changed, 21 insertions, 20 deletions
diff --git a/drivers/rapidio/devices/tsi721.c b/drivers/rapidio/devices/tsi721.c index 5225930a10c..691b1ab1a3d 100644 --- a/drivers/rapidio/devices/tsi721.c +++ b/drivers/rapidio/devices/tsi721.c @@ -851,14 +851,12 @@ static int tsi721_doorbell_init(struct tsi721_device *priv)  	INIT_WORK(&priv->idb_work, tsi721_db_dpc);  	/* Allocate buffer for inbound doorbells queue */ -	priv->idb_base = dma_alloc_coherent(&priv->pdev->dev, +	priv->idb_base = dma_zalloc_coherent(&priv->pdev->dev,  				IDB_QSIZE * TSI721_IDB_ENTRY_SIZE,  				&priv->idb_dma, GFP_KERNEL);  	if (!priv->idb_base)  		return -ENOMEM; -	memset(priv->idb_base, 0, IDB_QSIZE * TSI721_IDB_ENTRY_SIZE); -  	dev_dbg(&priv->pdev->dev, "Allocated IDB buffer @ %p (phys = %llx)\n",  		priv->idb_base, (unsigned long long)priv->idb_dma); @@ -904,7 +902,7 @@ static int tsi721_bdma_ch_init(struct tsi721_device *priv, int chnum)  	 */  	/* Allocate space for DMA descriptors */ -	bd_ptr = dma_alloc_coherent(&priv->pdev->dev, +	bd_ptr = dma_zalloc_coherent(&priv->pdev->dev,  					bd_num * sizeof(struct tsi721_dma_desc),  					&bd_phys, GFP_KERNEL);  	if (!bd_ptr) @@ -913,8 +911,6 @@ static int tsi721_bdma_ch_init(struct tsi721_device *priv, int chnum)  	priv->bdma[chnum].bd_phys = bd_phys;  	priv->bdma[chnum].bd_base = bd_ptr; -	memset(bd_ptr, 0, bd_num * sizeof(struct tsi721_dma_desc)); -  	dev_dbg(&priv->pdev->dev, "DMA descriptors @ %p (phys = %llx)\n",  		bd_ptr, (unsigned long long)bd_phys); @@ -922,7 +918,7 @@ static int tsi721_bdma_ch_init(struct tsi721_device *priv, int chnum)  	sts_size = (bd_num >= TSI721_DMA_MINSTSSZ) ?  					bd_num : TSI721_DMA_MINSTSSZ;  	sts_size = roundup_pow_of_two(sts_size); -	sts_ptr = dma_alloc_coherent(&priv->pdev->dev, +	sts_ptr = dma_zalloc_coherent(&priv->pdev->dev,  				     sts_size * sizeof(struct tsi721_dma_sts),  				     &sts_phys, GFP_KERNEL);  	if (!sts_ptr) { @@ -938,8 +934,6 @@ static int tsi721_bdma_ch_init(struct tsi721_device *priv, int chnum)  	priv->bdma[chnum].sts_base = sts_ptr;  	priv->bdma[chnum].sts_size = sts_size; -	memset(sts_ptr, 0, sts_size); -  	dev_dbg(&priv->pdev->dev,  		"desc status FIFO @ %p (phys = %llx) size=0x%x\n",  		sts_ptr, (unsigned long long)sts_phys, sts_size); @@ -1400,7 +1394,7 @@ static int tsi721_open_outb_mbox(struct rio_mport *mport, void *dev_id,  	/* Outbound message descriptor status FIFO allocation */  	priv->omsg_ring[mbox].sts_size = roundup_pow_of_two(entries + 1); -	priv->omsg_ring[mbox].sts_base = dma_alloc_coherent(&priv->pdev->dev, +	priv->omsg_ring[mbox].sts_base = dma_zalloc_coherent(&priv->pdev->dev,  			priv->omsg_ring[mbox].sts_size *  						sizeof(struct tsi721_dma_sts),  			&priv->omsg_ring[mbox].sts_phys, GFP_KERNEL); @@ -1412,9 +1406,6 @@ static int tsi721_open_outb_mbox(struct rio_mport *mport, void *dev_id,  		goto out_desc;  	} -	memset(priv->omsg_ring[mbox].sts_base, 0, -		entries * sizeof(struct tsi721_dma_sts)); -  	/*  	 * Configure Outbound Messaging Engine  	 */ @@ -2116,8 +2107,8 @@ static int __devinit tsi721_setup_mport(struct tsi721_device *priv)  	INIT_LIST_HEAD(&mport->dbells);  	rio_init_dbell_res(&mport->riores[RIO_DOORBELL_RESOURCE], 0, 0xffff); -	rio_init_mbox_res(&mport->riores[RIO_INB_MBOX_RESOURCE], 0, 0); -	rio_init_mbox_res(&mport->riores[RIO_OUTB_MBOX_RESOURCE], 0, 0); +	rio_init_mbox_res(&mport->riores[RIO_INB_MBOX_RESOURCE], 0, 3); +	rio_init_mbox_res(&mport->riores[RIO_OUTB_MBOX_RESOURCE], 0, 3);  	strcpy(mport->name, "Tsi721 mport");  	/* Hook up interrupt handler */ @@ -2163,7 +2154,7 @@ static int __devinit tsi721_probe(struct pci_dev *pdev,  				  const struct pci_device_id *id)  {  	struct tsi721_device *priv; -	int i; +	int i, cap;  	int err;  	u32 regval; @@ -2271,10 +2262,20 @@ static int __devinit tsi721_probe(struct pci_dev *pdev,  			dev_info(&pdev->dev, "Unable to set consistent DMA mask\n");  	} -	/* Clear "no snoop" and "relaxed ordering" bits. */ -	pci_read_config_dword(pdev, 0x40 + PCI_EXP_DEVCTL, ®val); -	regval &= ~(PCI_EXP_DEVCTL_RELAX_EN | PCI_EXP_DEVCTL_NOSNOOP_EN); -	pci_write_config_dword(pdev, 0x40 + PCI_EXP_DEVCTL, regval); +	cap = pci_pcie_cap(pdev); +	BUG_ON(cap == 0); + +	/* Clear "no snoop" and "relaxed ordering" bits, use default MRRS. */ +	pci_read_config_dword(pdev, cap + PCI_EXP_DEVCTL, ®val); +	regval &= ~(PCI_EXP_DEVCTL_READRQ | PCI_EXP_DEVCTL_RELAX_EN | +		    PCI_EXP_DEVCTL_NOSNOOP_EN); +	regval |= 0x2 << MAX_READ_REQUEST_SZ_SHIFT; +	pci_write_config_dword(pdev, cap + PCI_EXP_DEVCTL, regval); + +	/* Adjust PCIe completion timeout. */ +	pci_read_config_dword(pdev, cap + PCI_EXP_DEVCTL2, ®val); +	regval &= ~(0x0f); +	pci_write_config_dword(pdev, cap + PCI_EXP_DEVCTL2, regval | 0x2);  	/*  	 * FIXUP: correct offsets of MSI-X tables in the MSI-X Capability Block  |