aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/ata/sata_sil.c23
1 files changed, 19 insertions, 4 deletions
diff --git a/drivers/ata/sata_sil.c b/drivers/ata/sata_sil.c
index 170d36e6260f..466b05b67115 100644
--- a/drivers/ata/sata_sil.c
+++ b/drivers/ata/sata_sil.c
@@ -46,7 +46,7 @@
46#include <linux/libata.h> 46#include <linux/libata.h>
47 47
48#define DRV_NAME "sata_sil" 48#define DRV_NAME "sata_sil"
49#define DRV_VERSION "2.1" 49#define DRV_VERSION "2.2"
50 50
51enum { 51enum {
52 SIL_MMIO_BAR = 5, 52 SIL_MMIO_BAR = 5,
@@ -117,7 +117,7 @@ static int sil_pci_device_resume(struct pci_dev *pdev);
117static void sil_dev_config(struct ata_device *dev); 117static void sil_dev_config(struct ata_device *dev);
118static u32 sil_scr_read (struct ata_port *ap, unsigned int sc_reg); 118static u32 sil_scr_read (struct ata_port *ap, unsigned int sc_reg);
119static void sil_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val); 119static void sil_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val);
120static void sil_post_set_mode (struct ata_port *ap); 120static int sil_set_mode (struct ata_port *ap, struct ata_device **r_failed);
121static irqreturn_t sil_interrupt(int irq, void *dev_instance); 121static irqreturn_t sil_interrupt(int irq, void *dev_instance);
122static void sil_freeze(struct ata_port *ap); 122static void sil_freeze(struct ata_port *ap);
123static void sil_thaw(struct ata_port *ap); 123static void sil_thaw(struct ata_port *ap);
@@ -197,7 +197,7 @@ static const struct ata_port_operations sil_ops = {
197 .check_status = ata_check_status, 197 .check_status = ata_check_status,
198 .exec_command = ata_exec_command, 198 .exec_command = ata_exec_command,
199 .dev_select = ata_std_dev_select, 199 .dev_select = ata_std_dev_select,
200 .post_set_mode = sil_post_set_mode, 200 .set_mode = sil_set_mode,
201 .bmdma_setup = ata_bmdma_setup, 201 .bmdma_setup = ata_bmdma_setup,
202 .bmdma_start = ata_bmdma_start, 202 .bmdma_start = ata_bmdma_start,
203 .bmdma_stop = ata_bmdma_stop, 203 .bmdma_stop = ata_bmdma_stop,
@@ -297,7 +297,16 @@ static unsigned char sil_get_device_cache_line(struct pci_dev *pdev)
297 return cache_line; 297 return cache_line;
298} 298}
299 299
300static void sil_post_set_mode (struct ata_port *ap) 300/**
301 * sil_set_mode - wrap set_mode functions
302 * @ap: port to set up
303 * @r_failed: returned device when we fail
304 *
305 * Wrap the libata method for device setup as after the setup we need
306 * to inspect the results and do some configuration work
307 */
308
309static int sil_set_mode (struct ata_port *ap, struct ata_device **r_failed)
301{ 310{
302 struct ata_host *host = ap->host; 311 struct ata_host *host = ap->host;
303 struct ata_device *dev; 312 struct ata_device *dev;
@@ -305,6 +314,11 @@ static void sil_post_set_mode (struct ata_port *ap)
305 void __iomem *addr = mmio_base + sil_port[ap->port_no].xfer_mode; 314 void __iomem *addr = mmio_base + sil_port[ap->port_no].xfer_mode;
306 u32 tmp, dev_mode[2]; 315 u32 tmp, dev_mode[2];
307 unsigned int i; 316 unsigned int i;
317 int rc;
318
319 rc = ata_do_set_mode(ap, r_failed);
320 if (rc)
321 return rc;
308 322
309 for (i = 0; i < 2; i++) { 323 for (i = 0; i < 2; i++) {
310 dev = &ap->device[i]; 324 dev = &ap->device[i];
@@ -323,6 +337,7 @@ static void sil_post_set_mode (struct ata_port *ap)
323 tmp |= (dev_mode[1] << 4); 337 tmp |= (dev_mode[1] << 4);
324 writel(tmp, addr); 338 writel(tmp, addr);
325 readl(addr); /* flush */ 339 readl(addr); /* flush */
340 return 0;
326} 341}
327 342
328static inline void __iomem *sil_scr_addr(struct ata_port *ap, unsigned int sc_reg) 343static inline void __iomem *sil_scr_addr(struct ata_port *ap, unsigned int sc_reg)