Created
September 27, 2012 14:26
-
-
Save NeoCat/3794284 to your computer and use it in GitHub Desktop.
HDD Spin down driver for marvell SATA controller (mvSATA) in LS-GL
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <linux/module.h> | |
#include <linux/kernel.h> | |
#include <scsi/scsi_host.h> | |
#define MV_LINUX | |
#define MV_ARM | |
#define MV_CPU_LE | |
#include "mvSata.h" | |
#include "mvLinuxIalHt.h" | |
void (*activate_edma)(MV_SATA_ADAPTER *pAdapter, MV_U8 ch) = (void*)0xc021f9d0; | |
void (*deactivate_edma)(MV_SATA_ADAPTER *pAdapter, MV_U8 ch) = (void*)0xc021f688; | |
void (*enable_edma)(MV_SATA_ADAPTER *pAdapter, MV_U8 ch) = (void*)0xc0223180; | |
void (*disable_edma)(MV_SATA_ADAPTER *pAdapter, MV_U8 ch) = (void*)0xc022325c; | |
void (*disable_interupts)(MV_SATA_ADAPTER *pAdapter, MV_U8 ch) = (void*)0xc021f57c; | |
void (*enable_interupts)(MV_SATA_ADAPTER *pAdapter, MV_U8 ch) = (void*)0xc021f5d0; | |
MV_U8 (*nr_cmd)(MV_SATA_ADAPTER *pAdapter, MV_U8 ch) = (void*)0xc0223410; | |
MV_BOOLEAN (*execute)(MV_SATA_ADAPTER *pAdapter, | |
MV_U8 channelIndex, | |
MV_U8 PMPort, | |
MV_NON_UDMA_PROTOCOL protocolType, | |
MV_BOOLEAN isEXT, | |
MV_U16_PTR bufPtr, MV_U32 count, | |
MV_U16 features, | |
MV_U16 sectorCount, | |
MV_U16 lbaLow, MV_U16 lbaMid, | |
MV_U16 lbaHigh, MV_U8 device, | |
MV_U8 command) = (void*)0xc02271c4; | |
static int __init mvidle_init( void ) | |
{ | |
int i, w; | |
MV_BOOL ret; | |
MV_SATA_ADAPTER* p; | |
struct Scsi_Host *host = scsi_host_lookup(1); | |
if (!host) | |
return -ENODEV; | |
p = &MV_IAL_ADAPTER(host)->mvSataAdapter; | |
printk(KERN_DEBUG "host = %p\n", p); | |
for (w = 0; w < 100; w++) { | |
i = nr_cmd(p, 1); | |
if (i > 0) { | |
schedule_timeout(10); | |
} else break; | |
} | |
if (i > 0) | |
return -EBUSY; | |
printk(KERN_DEBUG "wait %d\n", w); | |
deactivate_edma(p, 1); | |
disable_edma(p, 1); | |
disable_interupts(p, 1); | |
ret = execute(p, 1, 0, MV_NON_UDMA_PROTOCOL_NON_DATA, MV_FALSE, NULL, 0, | |
0, 120, 0, 0, 0, 0, MV_ATA_COMMAND_STANDBY/*_IMMEDIATE*/); | |
printk(KERN_DEBUG "Send IDLE => %d\n", ret); | |
enable_interupts(p, 1); | |
enable_edma(p, 1); | |
activate_edma(p, 1); | |
return -EL2HLT; | |
} | |
static void __exit mvidle_exit( void ) | |
{ | |
} | |
module_init( mvidle_init ); | |
module_exit( mvidle_exit ); | |
MODULE_DESCRIPTION("MV Idle"); | |
MODULE_LICENSE("GPL"); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment