mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-31 04:01:48 -04:00
Automatic merge of rsync://rsync.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git branch HEAD
This commit is contained in:
commit
edb3e182b6
184 changed files with 16084 additions and 5078 deletions
|
|
@ -32,6 +32,7 @@
|
|||
#include <linux/delay.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include "scsi.h"
|
||||
#include <scsi/scsi_host.h>
|
||||
#include <linux/libata.h>
|
||||
|
|
@ -291,6 +292,8 @@ static void ahci_host_stop(struct ata_host_set *host_set)
|
|||
{
|
||||
struct ahci_host_priv *hpriv = host_set->private_data;
|
||||
kfree(hpriv);
|
||||
|
||||
ata_host_stop(host_set);
|
||||
}
|
||||
|
||||
static int ahci_port_start(struct ata_port *ap)
|
||||
|
|
|
|||
|
|
@ -2488,7 +2488,7 @@ ahd_linux_dv_thread(void *data)
|
|||
sprintf(current->comm, "ahd_dv_%d", ahd->unit);
|
||||
#else
|
||||
daemonize("ahd_dv_%d", ahd->unit);
|
||||
current->flags |= PF_FREEZE;
|
||||
current->flags |= PF_NOFREEZE;
|
||||
#endif
|
||||
unlock_kernel();
|
||||
|
||||
|
|
|
|||
|
|
@ -153,6 +153,7 @@ static struct ata_port_operations piix_pata_ops = {
|
|||
|
||||
.port_start = ata_port_start,
|
||||
.port_stop = ata_port_stop,
|
||||
.host_stop = ata_host_stop,
|
||||
};
|
||||
|
||||
static struct ata_port_operations piix_sata_ops = {
|
||||
|
|
@ -180,6 +181,7 @@ static struct ata_port_operations piix_sata_ops = {
|
|||
|
||||
.port_start = ata_port_start,
|
||||
.port_stop = ata_port_stop,
|
||||
.host_stop = ata_host_stop,
|
||||
};
|
||||
|
||||
static struct ata_port_info piix_port_info[] = {
|
||||
|
|
|
|||
|
|
@ -179,8 +179,18 @@ static void idescsi_input_buffers (ide_drive_t *drive, idescsi_pc_t *pc, unsigne
|
|||
return;
|
||||
}
|
||||
count = min(pc->sg->length - pc->b_count, bcount);
|
||||
buf = page_address(pc->sg->page) + pc->sg->offset;
|
||||
drive->hwif->atapi_input_bytes(drive, buf + pc->b_count, count);
|
||||
if (PageHighMem(pc->sg->page)) {
|
||||
unsigned long flags;
|
||||
|
||||
local_irq_save(flags);
|
||||
buf = kmap_atomic(pc->sg->page, KM_IRQ0) + pc->sg->offset;
|
||||
drive->hwif->atapi_input_bytes(drive, buf + pc->b_count, count);
|
||||
kunmap_atomic(buf - pc->sg->offset, KM_IRQ0);
|
||||
local_irq_restore(flags);
|
||||
} else {
|
||||
buf = page_address(pc->sg->page) + pc->sg->offset;
|
||||
drive->hwif->atapi_input_bytes(drive, buf + pc->b_count, count);
|
||||
}
|
||||
bcount -= count; pc->b_count += count;
|
||||
if (pc->b_count == pc->sg->length) {
|
||||
pc->sg++;
|
||||
|
|
@ -201,8 +211,18 @@ static void idescsi_output_buffers (ide_drive_t *drive, idescsi_pc_t *pc, unsign
|
|||
return;
|
||||
}
|
||||
count = min(pc->sg->length - pc->b_count, bcount);
|
||||
buf = page_address(pc->sg->page) + pc->sg->offset;
|
||||
drive->hwif->atapi_output_bytes(drive, buf + pc->b_count, count);
|
||||
if (PageHighMem(pc->sg->page)) {
|
||||
unsigned long flags;
|
||||
|
||||
local_irq_save(flags);
|
||||
buf = kmap_atomic(pc->sg->page, KM_IRQ0) + pc->sg->offset;
|
||||
drive->hwif->atapi_output_bytes(drive, buf + pc->b_count, count);
|
||||
kunmap_atomic(buf - pc->sg->offset, KM_IRQ0);
|
||||
local_irq_restore(flags);
|
||||
} else {
|
||||
buf = page_address(pc->sg->page) + pc->sg->offset;
|
||||
drive->hwif->atapi_output_bytes(drive, buf + pc->b_count, count);
|
||||
}
|
||||
bcount -= count; pc->b_count += count;
|
||||
if (pc->b_count == pc->sg->length) {
|
||||
pc->sg++;
|
||||
|
|
@ -713,7 +733,6 @@ static void idescsi_add_settings(ide_drive_t *drive)
|
|||
*/
|
||||
static void idescsi_setup (ide_drive_t *drive, idescsi_scsi_t *scsi)
|
||||
{
|
||||
DRIVER(drive)->busy++;
|
||||
if (drive->id && (drive->id->config & 0x0060) == 0x20)
|
||||
set_bit (IDESCSI_DRQ_INTERRUPT, &scsi->flags);
|
||||
set_bit(IDESCSI_TRANSFORM, &scsi->transform);
|
||||
|
|
@ -722,17 +741,16 @@ static void idescsi_setup (ide_drive_t *drive, idescsi_scsi_t *scsi)
|
|||
set_bit(IDESCSI_LOG_CMD, &scsi->log);
|
||||
#endif /* IDESCSI_DEBUG_LOG */
|
||||
idescsi_add_settings(drive);
|
||||
DRIVER(drive)->busy--;
|
||||
}
|
||||
|
||||
static int idescsi_cleanup (ide_drive_t *drive)
|
||||
static int ide_scsi_remove(struct device *dev)
|
||||
{
|
||||
ide_drive_t *drive = to_ide_device(dev);
|
||||
struct Scsi_Host *scsihost = drive->driver_data;
|
||||
struct ide_scsi_obj *scsi = scsihost_to_idescsi(scsihost);
|
||||
struct gendisk *g = scsi->disk;
|
||||
|
||||
if (ide_unregister_subdriver(drive))
|
||||
return 1;
|
||||
ide_unregister_subdriver(drive, scsi->driver);
|
||||
|
||||
ide_unregister_region(g);
|
||||
|
||||
|
|
@ -746,7 +764,7 @@ static int idescsi_cleanup (ide_drive_t *drive)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int idescsi_attach(ide_drive_t *drive);
|
||||
static int ide_scsi_probe(struct device *);
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
static ide_proc_entry_t idescsi_proc[] = {
|
||||
|
|
@ -757,24 +775,22 @@ static ide_proc_entry_t idescsi_proc[] = {
|
|||
# define idescsi_proc NULL
|
||||
#endif
|
||||
|
||||
/*
|
||||
* IDE subdriver functions, registered with ide.c
|
||||
*/
|
||||
static ide_driver_t idescsi_driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "ide-scsi",
|
||||
.gen_driver = {
|
||||
.name = "ide-scsi",
|
||||
.bus = &ide_bus_type,
|
||||
.probe = ide_scsi_probe,
|
||||
.remove = ide_scsi_remove,
|
||||
},
|
||||
.version = IDESCSI_VERSION,
|
||||
.media = ide_scsi,
|
||||
.busy = 0,
|
||||
.supports_dsc_overlap = 0,
|
||||
.proc = idescsi_proc,
|
||||
.attach = idescsi_attach,
|
||||
.cleanup = idescsi_cleanup,
|
||||
.do_request = idescsi_do_request,
|
||||
.end_request = idescsi_end_request,
|
||||
.error = idescsi_atapi_error,
|
||||
.abort = idescsi_atapi_abort,
|
||||
.drives = LIST_HEAD_INIT(idescsi_driver.drives),
|
||||
};
|
||||
|
||||
static int idescsi_ide_open(struct inode *inode, struct file *filp)
|
||||
|
|
@ -821,8 +837,6 @@ static struct block_device_operations idescsi_ops = {
|
|||
.ioctl = idescsi_ide_ioctl,
|
||||
};
|
||||
|
||||
static int idescsi_attach(ide_drive_t *drive);
|
||||
|
||||
static int idescsi_slave_configure(struct scsi_device * sdp)
|
||||
{
|
||||
/* Configure detected device */
|
||||
|
|
@ -1095,8 +1109,9 @@ static struct scsi_host_template idescsi_template = {
|
|||
.proc_name = "ide-scsi",
|
||||
};
|
||||
|
||||
static int idescsi_attach(ide_drive_t *drive)
|
||||
static int ide_scsi_probe(struct device *dev)
|
||||
{
|
||||
ide_drive_t *drive = to_ide_device(dev);
|
||||
idescsi_scsi_t *idescsi;
|
||||
struct Scsi_Host *host;
|
||||
struct gendisk *g;
|
||||
|
|
@ -1112,7 +1127,7 @@ static int idescsi_attach(ide_drive_t *drive)
|
|||
!drive->present ||
|
||||
drive->media == ide_disk ||
|
||||
!(host = scsi_host_alloc(&idescsi_template,sizeof(idescsi_scsi_t))))
|
||||
return 1;
|
||||
return -ENODEV;
|
||||
|
||||
g = alloc_disk(1 << PARTN_BITS);
|
||||
if (!g)
|
||||
|
|
@ -1138,20 +1153,19 @@ static int idescsi_attach(ide_drive_t *drive)
|
|||
idescsi->host = host;
|
||||
idescsi->disk = g;
|
||||
g->private_data = &idescsi->driver;
|
||||
err = ide_register_subdriver(drive, &idescsi_driver);
|
||||
ide_register_subdriver(drive, &idescsi_driver);
|
||||
err = 0;
|
||||
idescsi_setup(drive, idescsi);
|
||||
g->fops = &idescsi_ops;
|
||||
ide_register_region(g);
|
||||
err = scsi_add_host(host, &drive->gendev);
|
||||
if (!err) {
|
||||
idescsi_setup (drive, idescsi);
|
||||
g->fops = &idescsi_ops;
|
||||
ide_register_region(g);
|
||||
err = scsi_add_host(host, &drive->gendev);
|
||||
if (!err) {
|
||||
scsi_scan_host(host);
|
||||
return 0;
|
||||
}
|
||||
/* fall through on error */
|
||||
ide_unregister_region(g);
|
||||
ide_unregister_subdriver(drive);
|
||||
scsi_scan_host(host);
|
||||
return 0;
|
||||
}
|
||||
/* fall through on error */
|
||||
ide_unregister_region(g);
|
||||
ide_unregister_subdriver(drive, &idescsi_driver);
|
||||
|
||||
put_disk(g);
|
||||
out_host_put:
|
||||
|
|
@ -1161,12 +1175,12 @@ out_host_put:
|
|||
|
||||
static int __init init_idescsi_module(void)
|
||||
{
|
||||
return ide_register_driver(&idescsi_driver);
|
||||
return driver_register(&idescsi_driver.gen_driver);
|
||||
}
|
||||
|
||||
static void __exit exit_idescsi_module(void)
|
||||
{
|
||||
ide_unregister_driver(&idescsi_driver);
|
||||
driver_unregister(&idescsi_driver.gen_driver);
|
||||
}
|
||||
|
||||
module_init(init_idescsi_module);
|
||||
|
|
|
|||
|
|
@ -2071,7 +2071,7 @@ void ata_sg_init_one(struct ata_queued_cmd *qc, void *buf, unsigned int buflen)
|
|||
sg = qc->sg;
|
||||
sg->page = virt_to_page(buf);
|
||||
sg->offset = (unsigned long) buf & ~PAGE_MASK;
|
||||
sg_dma_len(sg) = buflen;
|
||||
sg->length = buflen;
|
||||
}
|
||||
|
||||
void ata_sg_init(struct ata_queued_cmd *qc, struct scatterlist *sg,
|
||||
|
|
@ -2101,11 +2101,12 @@ static int ata_sg_setup_one(struct ata_queued_cmd *qc)
|
|||
dma_addr_t dma_address;
|
||||
|
||||
dma_address = dma_map_single(ap->host_set->dev, qc->buf_virt,
|
||||
sg_dma_len(sg), dir);
|
||||
sg->length, dir);
|
||||
if (dma_mapping_error(dma_address))
|
||||
return -1;
|
||||
|
||||
sg_dma_address(sg) = dma_address;
|
||||
sg_dma_len(sg) = sg->length;
|
||||
|
||||
DPRINTK("mapped buffer of %d bytes for %s\n", sg_dma_len(sg),
|
||||
qc->tf.flags & ATA_TFLAG_WRITE ? "write" : "read");
|
||||
|
|
@ -2310,7 +2311,7 @@ static void ata_pio_sector(struct ata_queued_cmd *qc)
|
|||
qc->cursect++;
|
||||
qc->cursg_ofs++;
|
||||
|
||||
if ((qc->cursg_ofs * ATA_SECT_SIZE) == sg_dma_len(&sg[qc->cursg])) {
|
||||
if ((qc->cursg_ofs * ATA_SECT_SIZE) == (&sg[qc->cursg])->length) {
|
||||
qc->cursg++;
|
||||
qc->cursg_ofs = 0;
|
||||
}
|
||||
|
|
@ -2347,7 +2348,7 @@ next_page:
|
|||
page = nth_page(page, (offset >> PAGE_SHIFT));
|
||||
offset %= PAGE_SIZE;
|
||||
|
||||
count = min(sg_dma_len(sg) - qc->cursg_ofs, bytes);
|
||||
count = min(sg->length - qc->cursg_ofs, bytes);
|
||||
|
||||
/* don't cross page boundaries */
|
||||
count = min(count, (unsigned int)PAGE_SIZE - offset);
|
||||
|
|
@ -2358,7 +2359,7 @@ next_page:
|
|||
qc->curbytes += count;
|
||||
qc->cursg_ofs += count;
|
||||
|
||||
if (qc->cursg_ofs == sg_dma_len(sg)) {
|
||||
if (qc->cursg_ofs == sg->length) {
|
||||
qc->cursg++;
|
||||
qc->cursg_ofs = 0;
|
||||
}
|
||||
|
|
@ -2371,7 +2372,7 @@ next_page:
|
|||
kunmap(page);
|
||||
|
||||
if (bytes) {
|
||||
if (qc->cursg_ofs < sg_dma_len(sg))
|
||||
if (qc->cursg_ofs < sg->length)
|
||||
goto next_page;
|
||||
goto next_sg;
|
||||
}
|
||||
|
|
@ -3321,6 +3322,13 @@ void ata_port_stop (struct ata_port *ap)
|
|||
dma_free_coherent(dev, ATA_PRD_TBL_SZ, ap->prd, ap->prd_dma);
|
||||
}
|
||||
|
||||
void ata_host_stop (struct ata_host_set *host_set)
|
||||
{
|
||||
if (host_set->mmio_base)
|
||||
iounmap(host_set->mmio_base);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* ata_host_remove - Unregister SCSI host structure with upper layers
|
||||
* @ap: Port to unregister
|
||||
|
|
@ -3877,10 +3885,6 @@ void ata_pci_remove_one (struct pci_dev *pdev)
|
|||
}
|
||||
|
||||
free_irq(host_set->irq, host_set);
|
||||
if (host_set->ops->host_stop)
|
||||
host_set->ops->host_stop(host_set);
|
||||
if (host_set->mmio_base)
|
||||
iounmap(host_set->mmio_base);
|
||||
|
||||
for (i = 0; i < host_set->n_ports; i++) {
|
||||
ap = host_set->ports[i];
|
||||
|
|
@ -3899,6 +3903,9 @@ void ata_pci_remove_one (struct pci_dev *pdev)
|
|||
scsi_host_put(ap->host);
|
||||
}
|
||||
|
||||
if (host_set->ops->host_stop)
|
||||
host_set->ops->host_stop(host_set);
|
||||
|
||||
kfree(host_set);
|
||||
|
||||
pci_release_regions(pdev);
|
||||
|
|
@ -3996,6 +4003,7 @@ EXPORT_SYMBOL_GPL(ata_chk_err);
|
|||
EXPORT_SYMBOL_GPL(ata_exec_command);
|
||||
EXPORT_SYMBOL_GPL(ata_port_start);
|
||||
EXPORT_SYMBOL_GPL(ata_port_stop);
|
||||
EXPORT_SYMBOL_GPL(ata_host_stop);
|
||||
EXPORT_SYMBOL_GPL(ata_interrupt);
|
||||
EXPORT_SYMBOL_GPL(ata_qc_prep);
|
||||
EXPORT_SYMBOL_GPL(ata_bmdma_setup);
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@
|
|||
#define __LIBATA_H__
|
||||
|
||||
#define DRV_NAME "libata"
|
||||
#define DRV_VERSION "1.10" /* must be exactly four chars */
|
||||
#define DRV_VERSION "1.11" /* must be exactly four chars */
|
||||
|
||||
struct ata_scsi_args {
|
||||
u16 *id;
|
||||
|
|
|
|||
|
|
@ -329,6 +329,8 @@ static void nv_host_stop (struct ata_host_set *host_set)
|
|||
host->host_desc->disable_hotplug(host_set);
|
||||
|
||||
kfree(host);
|
||||
|
||||
ata_host_stop(host_set);
|
||||
}
|
||||
|
||||
static int nv_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
|
|
|
|||
|
|
@ -122,6 +122,7 @@ static struct ata_port_operations pdc_ata_ops = {
|
|||
.scr_write = pdc_sata_scr_write,
|
||||
.port_start = pdc_port_start,
|
||||
.port_stop = pdc_port_stop,
|
||||
.host_stop = ata_host_stop,
|
||||
};
|
||||
|
||||
static struct ata_port_info pdc_port_info[] = {
|
||||
|
|
|
|||
|
|
@ -536,6 +536,8 @@ static void qs_host_stop(struct ata_host_set *host_set)
|
|||
|
||||
writeb(0, mmio_base + QS_HCT_CTRL); /* disable host interrupts */
|
||||
writeb(QS_CNFG3_GSRST, mmio_base + QS_HCF_CNFG3); /* global reset */
|
||||
|
||||
ata_host_stop(host_set);
|
||||
}
|
||||
|
||||
static void qs_host_init(unsigned int chip_id, struct ata_probe_ent *pe)
|
||||
|
|
|
|||
|
|
@ -161,6 +161,7 @@ static struct ata_port_operations sil_ops = {
|
|||
.scr_write = sil_scr_write,
|
||||
.port_start = ata_port_start,
|
||||
.port_stop = ata_port_stop,
|
||||
.host_stop = ata_host_stop,
|
||||
};
|
||||
|
||||
static struct ata_port_info sil_port_info[] = {
|
||||
|
|
|
|||
|
|
@ -114,6 +114,7 @@ static struct ata_port_operations sis_ops = {
|
|||
.scr_write = sis_scr_write,
|
||||
.port_start = ata_port_start,
|
||||
.port_stop = ata_port_stop,
|
||||
.host_stop = ata_host_stop,
|
||||
};
|
||||
|
||||
static struct ata_port_info sis_port_info = {
|
||||
|
|
|
|||
|
|
@ -313,6 +313,7 @@ static struct ata_port_operations k2_sata_ops = {
|
|||
.scr_write = k2_sata_scr_write,
|
||||
.port_start = ata_port_start,
|
||||
.port_stop = ata_port_stop,
|
||||
.host_stop = ata_host_stop,
|
||||
};
|
||||
|
||||
static void k2_sata_setup_port(struct ata_ioports *port, unsigned long base)
|
||||
|
|
|
|||
|
|
@ -245,6 +245,8 @@ static void pdc20621_host_stop(struct ata_host_set *host_set)
|
|||
|
||||
iounmap(dimm_mmio);
|
||||
kfree(hpriv);
|
||||
|
||||
ata_host_stop(host_set);
|
||||
}
|
||||
|
||||
static int pdc_port_start(struct ata_port *ap)
|
||||
|
|
|
|||
|
|
@ -113,6 +113,7 @@ static struct ata_port_operations uli_ops = {
|
|||
|
||||
.port_start = ata_port_start,
|
||||
.port_stop = ata_port_stop,
|
||||
.host_stop = ata_host_stop,
|
||||
};
|
||||
|
||||
static struct ata_port_info uli_port_info = {
|
||||
|
|
|
|||
|
|
@ -134,6 +134,7 @@ static struct ata_port_operations svia_sata_ops = {
|
|||
|
||||
.port_start = ata_port_start,
|
||||
.port_stop = ata_port_stop,
|
||||
.host_stop = ata_host_stop,
|
||||
};
|
||||
|
||||
static struct ata_port_info svia_port_info = {
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@
|
|||
#include <linux/blkdev.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include "scsi.h"
|
||||
#include <scsi/scsi_host.h>
|
||||
#include <linux/libata.h>
|
||||
|
|
@ -230,6 +231,7 @@ static struct ata_port_operations vsc_sata_ops = {
|
|||
.scr_write = vsc_sata_scr_write,
|
||||
.port_start = ata_port_start,
|
||||
.port_stop = ata_port_stop,
|
||||
.host_stop = ata_host_stop,
|
||||
};
|
||||
|
||||
static void __devinit vsc_sata_setup_port(struct ata_ioports *port, unsigned long base)
|
||||
|
|
|
|||
Loading…
Reference in a new issue