Auto-update from upstream
This commit is contained in:
commit
5b2db367a2
|
@ -101,6 +101,8 @@ apply_relocate(Elf32_Shdr *sechdrs, const char *strtab, unsigned int symindex,
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case R_ARM_PC24:
|
case R_ARM_PC24:
|
||||||
|
case R_ARM_CALL:
|
||||||
|
case R_ARM_JUMP24:
|
||||||
offset = (*(u32 *)loc & 0x00ffffff) << 2;
|
offset = (*(u32 *)loc & 0x00ffffff) << 2;
|
||||||
if (offset & 0x02000000)
|
if (offset & 0x02000000)
|
||||||
offset -= 0x04000000;
|
offset -= 0x04000000;
|
||||||
|
|
|
@ -155,19 +155,20 @@ int pxa_pm_enter(suspend_state_t state)
|
||||||
PSPR = 0;
|
PSPR = 0;
|
||||||
|
|
||||||
/* restore registers */
|
/* restore registers */
|
||||||
|
RESTORE_GPLEVEL(0); RESTORE_GPLEVEL(1); RESTORE_GPLEVEL(2);
|
||||||
|
RESTORE(GPDR0); RESTORE(GPDR1); RESTORE(GPDR2);
|
||||||
RESTORE(GAFR0_L); RESTORE(GAFR0_U);
|
RESTORE(GAFR0_L); RESTORE(GAFR0_U);
|
||||||
RESTORE(GAFR1_L); RESTORE(GAFR1_U);
|
RESTORE(GAFR1_L); RESTORE(GAFR1_U);
|
||||||
RESTORE(GAFR2_L); RESTORE(GAFR2_U);
|
RESTORE(GAFR2_L); RESTORE(GAFR2_U);
|
||||||
RESTORE_GPLEVEL(0); RESTORE_GPLEVEL(1); RESTORE_GPLEVEL(2);
|
|
||||||
RESTORE(GPDR0); RESTORE(GPDR1); RESTORE(GPDR2);
|
|
||||||
RESTORE(GRER0); RESTORE(GRER1); RESTORE(GRER2);
|
RESTORE(GRER0); RESTORE(GRER1); RESTORE(GRER2);
|
||||||
RESTORE(GFER0); RESTORE(GFER1); RESTORE(GFER2);
|
RESTORE(GFER0); RESTORE(GFER1); RESTORE(GFER2);
|
||||||
RESTORE(PGSR0); RESTORE(PGSR1); RESTORE(PGSR2);
|
RESTORE(PGSR0); RESTORE(PGSR1); RESTORE(PGSR2);
|
||||||
|
|
||||||
#ifdef CONFIG_PXA27x
|
#ifdef CONFIG_PXA27x
|
||||||
RESTORE(MDREFR);
|
RESTORE(MDREFR);
|
||||||
RESTORE(GAFR3_L); RESTORE(GAFR3_U); RESTORE_GPLEVEL(3);
|
RESTORE_GPLEVEL(3); RESTORE(GPDR3);
|
||||||
RESTORE(GPDR3); RESTORE(GRER3); RESTORE(GFER3); RESTORE(PGSR3);
|
RESTORE(GAFR3_L); RESTORE(GAFR3_U);
|
||||||
|
RESTORE(GRER3); RESTORE(GFER3); RESTORE(PGSR3);
|
||||||
RESTORE(PWER); RESTORE(PCFR); RESTORE(PRER);
|
RESTORE(PWER); RESTORE(PCFR); RESTORE(PRER);
|
||||||
RESTORE(PFER); RESTORE(PKWR);
|
RESTORE(PFER); RESTORE(PKWR);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -721,11 +721,13 @@ flush_thread (void)
|
||||||
/* drop floating-point and debug-register state if it exists: */
|
/* drop floating-point and debug-register state if it exists: */
|
||||||
current->thread.flags &= ~(IA64_THREAD_FPH_VALID | IA64_THREAD_DBG_VALID);
|
current->thread.flags &= ~(IA64_THREAD_FPH_VALID | IA64_THREAD_DBG_VALID);
|
||||||
ia64_drop_fpu(current);
|
ia64_drop_fpu(current);
|
||||||
|
#ifdef CONFIG_IA32_SUPPORT
|
||||||
if (IS_IA32_PROCESS(ia64_task_regs(current))) {
|
if (IS_IA32_PROCESS(ia64_task_regs(current))) {
|
||||||
ia32_drop_partial_page_list(current);
|
ia32_drop_partial_page_list(current);
|
||||||
current->thread.task_size = IA32_PAGE_OFFSET;
|
current->thread.task_size = IA32_PAGE_OFFSET;
|
||||||
set_fs(USER_DS);
|
set_fs(USER_DS);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -807,14 +807,6 @@ config BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA
|
||||||
depends on SOC_AU1200 && BLK_DEV_IDE_AU1XXX
|
depends on SOC_AU1200 && BLK_DEV_IDE_AU1XXX
|
||||||
endchoice
|
endchoice
|
||||||
|
|
||||||
config BLK_DEV_IDE_AU1XXX_BURSTABLE_ON
|
|
||||||
bool "Enable burstable Mode on DbDMA"
|
|
||||||
default false
|
|
||||||
depends BLK_DEV_IDE_AU1XXX
|
|
||||||
help
|
|
||||||
This option enable the burstable Flag on DbDMA controller
|
|
||||||
(cf. "AMD Alchemy 'Au1200' Processor Data Book - PRELIMINARY").
|
|
||||||
|
|
||||||
config BLK_DEV_IDE_AU1XXX_SEQTS_PER_RQ
|
config BLK_DEV_IDE_AU1XXX_SEQTS_PER_RQ
|
||||||
int "Maximum transfer size (KB) per request (up to 128)"
|
int "Maximum transfer size (KB) per request (up to 128)"
|
||||||
default "128"
|
default "128"
|
||||||
|
@ -940,7 +932,7 @@ config BLK_DEV_Q40IDE
|
||||||
|
|
||||||
config BLK_DEV_MPC8xx_IDE
|
config BLK_DEV_MPC8xx_IDE
|
||||||
bool "MPC8xx IDE support"
|
bool "MPC8xx IDE support"
|
||||||
depends on 8xx
|
depends on 8xx && IDE=y && BLK_DEV_IDE=y
|
||||||
help
|
help
|
||||||
This option provides support for IDE on Motorola MPC8xx Systems.
|
This option provides support for IDE on Motorola MPC8xx Systems.
|
||||||
Please see 'Type of MPC8xx IDE interface' for details.
|
Please see 'Type of MPC8xx IDE interface' for details.
|
||||||
|
|
|
@ -1292,7 +1292,6 @@ static ide_startstop_t cdrom_start_seek (ide_drive_t *drive, unsigned int block)
|
||||||
struct cdrom_info *info = drive->driver_data;
|
struct cdrom_info *info = drive->driver_data;
|
||||||
|
|
||||||
info->dma = 0;
|
info->dma = 0;
|
||||||
info->cmd = 0;
|
|
||||||
info->start_seek = jiffies;
|
info->start_seek = jiffies;
|
||||||
return cdrom_start_packet_command(drive, 0, cdrom_start_seek_continuation);
|
return cdrom_start_packet_command(drive, 0, cdrom_start_seek_continuation);
|
||||||
}
|
}
|
||||||
|
@ -1344,8 +1343,6 @@ static ide_startstop_t cdrom_start_read (ide_drive_t *drive, unsigned int block)
|
||||||
(rq->nr_sectors & (sectors_per_frame - 1)))
|
(rq->nr_sectors & (sectors_per_frame - 1)))
|
||||||
info->dma = 0;
|
info->dma = 0;
|
||||||
|
|
||||||
info->cmd = READ;
|
|
||||||
|
|
||||||
/* Start sending the read request to the drive. */
|
/* Start sending the read request to the drive. */
|
||||||
return cdrom_start_packet_command(drive, 32768, cdrom_start_read_continuation);
|
return cdrom_start_packet_command(drive, 32768, cdrom_start_read_continuation);
|
||||||
}
|
}
|
||||||
|
@ -1484,7 +1481,6 @@ static ide_startstop_t cdrom_do_packet_command (ide_drive_t *drive)
|
||||||
struct cdrom_info *info = drive->driver_data;
|
struct cdrom_info *info = drive->driver_data;
|
||||||
|
|
||||||
info->dma = 0;
|
info->dma = 0;
|
||||||
info->cmd = 0;
|
|
||||||
rq->flags &= ~REQ_FAILED;
|
rq->flags &= ~REQ_FAILED;
|
||||||
len = rq->data_len;
|
len = rq->data_len;
|
||||||
|
|
||||||
|
@ -1891,7 +1887,6 @@ static ide_startstop_t cdrom_start_write(ide_drive_t *drive, struct request *rq)
|
||||||
/* use dma, if possible. we don't need to check more, since we
|
/* use dma, if possible. we don't need to check more, since we
|
||||||
* know that the transfer is always (at least!) frame aligned */
|
* know that the transfer is always (at least!) frame aligned */
|
||||||
info->dma = drive->using_dma ? 1 : 0;
|
info->dma = drive->using_dma ? 1 : 0;
|
||||||
info->cmd = WRITE;
|
|
||||||
|
|
||||||
info->devinfo.media_written = 1;
|
info->devinfo.media_written = 1;
|
||||||
|
|
||||||
|
@ -1916,7 +1911,6 @@ static ide_startstop_t cdrom_do_block_pc(ide_drive_t *drive, struct request *rq)
|
||||||
rq->flags |= REQ_QUIET;
|
rq->flags |= REQ_QUIET;
|
||||||
|
|
||||||
info->dma = 0;
|
info->dma = 0;
|
||||||
info->cmd = 0;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* sg request
|
* sg request
|
||||||
|
@ -1925,7 +1919,6 @@ static ide_startstop_t cdrom_do_block_pc(ide_drive_t *drive, struct request *rq)
|
||||||
int mask = drive->queue->dma_alignment;
|
int mask = drive->queue->dma_alignment;
|
||||||
unsigned long addr = (unsigned long) page_address(bio_page(rq->bio));
|
unsigned long addr = (unsigned long) page_address(bio_page(rq->bio));
|
||||||
|
|
||||||
info->cmd = rq_data_dir(rq);
|
|
||||||
info->dma = drive->using_dma;
|
info->dma = drive->using_dma;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -480,7 +480,6 @@ struct cdrom_info {
|
||||||
|
|
||||||
struct request request_sense_request;
|
struct request request_sense_request;
|
||||||
int dma;
|
int dma;
|
||||||
int cmd;
|
|
||||||
unsigned long last_block;
|
unsigned long last_block;
|
||||||
unsigned long start_seek;
|
unsigned long start_seek;
|
||||||
/* Buffer to hold mechanism status and changer slot table. */
|
/* Buffer to hold mechanism status and changer slot table. */
|
||||||
|
|
|
@ -1034,12 +1034,12 @@ static int ide_disk_remove(struct device *dev)
|
||||||
struct ide_disk_obj *idkp = drive->driver_data;
|
struct ide_disk_obj *idkp = drive->driver_data;
|
||||||
struct gendisk *g = idkp->disk;
|
struct gendisk *g = idkp->disk;
|
||||||
|
|
||||||
ide_cacheflush_p(drive);
|
|
||||||
|
|
||||||
ide_unregister_subdriver(drive, idkp->driver);
|
ide_unregister_subdriver(drive, idkp->driver);
|
||||||
|
|
||||||
del_gendisk(g);
|
del_gendisk(g);
|
||||||
|
|
||||||
|
ide_cacheflush_p(drive);
|
||||||
|
|
||||||
ide_disk_put(idkp);
|
ide_disk_put(idkp);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -90,11 +90,6 @@
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
#include <asm/irq.h>
|
#include <asm/irq.h>
|
||||||
|
|
||||||
struct drive_list_entry {
|
|
||||||
const char *id_model;
|
|
||||||
const char *id_firmware;
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct drive_list_entry drive_whitelist [] = {
|
static const struct drive_list_entry drive_whitelist [] = {
|
||||||
|
|
||||||
{ "Micropolis 2112A" , "ALL" },
|
{ "Micropolis 2112A" , "ALL" },
|
||||||
|
@ -139,7 +134,7 @@ static const struct drive_list_entry drive_blacklist [] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* in_drive_list - look for drive in black/white list
|
* ide_in_drive_list - look for drive in black/white list
|
||||||
* @id: drive identifier
|
* @id: drive identifier
|
||||||
* @drive_table: list to inspect
|
* @drive_table: list to inspect
|
||||||
*
|
*
|
||||||
|
@ -147,7 +142,7 @@ static const struct drive_list_entry drive_blacklist [] = {
|
||||||
* Returns 1 if the drive is found in the table.
|
* Returns 1 if the drive is found in the table.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static int in_drive_list(struct hd_driveid *id, const struct drive_list_entry *drive_table)
|
int ide_in_drive_list(struct hd_driveid *id, const struct drive_list_entry *drive_table)
|
||||||
{
|
{
|
||||||
for ( ; drive_table->id_model ; drive_table++)
|
for ( ; drive_table->id_model ; drive_table++)
|
||||||
if ((!strcmp(drive_table->id_model, id->model)) &&
|
if ((!strcmp(drive_table->id_model, id->model)) &&
|
||||||
|
@ -157,6 +152,8 @@ static int in_drive_list(struct hd_driveid *id, const struct drive_list_entry *d
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EXPORT_SYMBOL_GPL(ide_in_drive_list);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ide_dma_intr - IDE DMA interrupt handler
|
* ide_dma_intr - IDE DMA interrupt handler
|
||||||
* @drive: the drive the interrupt is for
|
* @drive: the drive the interrupt is for
|
||||||
|
@ -663,7 +660,7 @@ int __ide_dma_bad_drive (ide_drive_t *drive)
|
||||||
{
|
{
|
||||||
struct hd_driveid *id = drive->id;
|
struct hd_driveid *id = drive->id;
|
||||||
|
|
||||||
int blacklist = in_drive_list(id, drive_blacklist);
|
int blacklist = ide_in_drive_list(id, drive_blacklist);
|
||||||
if (blacklist) {
|
if (blacklist) {
|
||||||
printk(KERN_WARNING "%s: Disabling (U)DMA for %s (blacklisted)\n",
|
printk(KERN_WARNING "%s: Disabling (U)DMA for %s (blacklisted)\n",
|
||||||
drive->name, id->model);
|
drive->name, id->model);
|
||||||
|
@ -677,7 +674,7 @@ EXPORT_SYMBOL(__ide_dma_bad_drive);
|
||||||
int __ide_dma_good_drive (ide_drive_t *drive)
|
int __ide_dma_good_drive (ide_drive_t *drive)
|
||||||
{
|
{
|
||||||
struct hd_driveid *id = drive->id;
|
struct hd_driveid *id = drive->id;
|
||||||
return in_drive_list(id, drive_whitelist);
|
return ide_in_drive_list(id, drive_whitelist);
|
||||||
}
|
}
|
||||||
|
|
||||||
EXPORT_SYMBOL(__ide_dma_good_drive);
|
EXPORT_SYMBOL(__ide_dma_good_drive);
|
||||||
|
|
|
@ -1 +1,4 @@
|
||||||
obj-$(CONFIG_BLK_DEV_IDE_SWARM) += swarm.o
|
obj-$(CONFIG_BLK_DEV_IDE_SWARM) += swarm.o
|
||||||
|
obj-$(CONFIG_BLK_DEV_IDE_AU1XXX) += au1xxx-ide.o
|
||||||
|
|
||||||
|
EXTRA_CFLAGS := -Idrivers/ide
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -622,12 +622,18 @@ sgiioc4_ide_setup_pci_device(struct pci_dev *dev, ide_pci_device_t * d)
|
||||||
ide_hwif_t *hwif;
|
ide_hwif_t *hwif;
|
||||||
int h;
|
int h;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Find an empty HWIF; if none available, return -ENOMEM.
|
||||||
|
*/
|
||||||
for (h = 0; h < MAX_HWIFS; ++h) {
|
for (h = 0; h < MAX_HWIFS; ++h) {
|
||||||
hwif = &ide_hwifs[h];
|
hwif = &ide_hwifs[h];
|
||||||
/* Find an empty HWIF */
|
|
||||||
if (hwif->chipset == ide_unknown)
|
if (hwif->chipset == ide_unknown)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (h == MAX_HWIFS) {
|
||||||
|
printk(KERN_ERR "%s: too many IDE interfaces, no room in table\n", d->name);
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
/* Get the CmdBlk and CtrlBlk Base Registers */
|
/* Get the CmdBlk and CtrlBlk Base Registers */
|
||||||
base = pci_resource_start(dev, 0) + IOC4_CMD_OFFSET;
|
base = pci_resource_start(dev, 0) + IOC4_CMD_OFFSET;
|
||||||
|
|
|
@ -80,6 +80,7 @@ static struct via_isa_bridge {
|
||||||
u16 flags;
|
u16 flags;
|
||||||
} via_isa_bridges[] = {
|
} via_isa_bridges[] = {
|
||||||
{ "vt6410", PCI_DEVICE_ID_VIA_6410, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST },
|
{ "vt6410", PCI_DEVICE_ID_VIA_6410, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST },
|
||||||
|
{ "vt8251", PCI_DEVICE_ID_VIA_8251, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST },
|
||||||
{ "vt8237", PCI_DEVICE_ID_VIA_8237, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST },
|
{ "vt8237", PCI_DEVICE_ID_VIA_8237, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST },
|
||||||
{ "vt8235", PCI_DEVICE_ID_VIA_8235, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST },
|
{ "vt8235", PCI_DEVICE_ID_VIA_8235, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST },
|
||||||
{ "vt8233a", PCI_DEVICE_ID_VIA_8233A, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST },
|
{ "vt8233a", PCI_DEVICE_ID_VIA_8233A, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST },
|
||||||
|
|
|
@ -42,7 +42,7 @@ static struct alps_model_info alps_model_data[] = {
|
||||||
{ { 0x53, 0x02, 0x14 }, 0xf8, 0xf8, 0 },
|
{ { 0x53, 0x02, 0x14 }, 0xf8, 0xf8, 0 },
|
||||||
{ { 0x63, 0x02, 0x0a }, 0xf8, 0xf8, 0 },
|
{ { 0x63, 0x02, 0x0a }, 0xf8, 0xf8, 0 },
|
||||||
{ { 0x63, 0x02, 0x14 }, 0xf8, 0xf8, 0 },
|
{ { 0x63, 0x02, 0x14 }, 0xf8, 0xf8, 0 },
|
||||||
{ { 0x63, 0x02, 0x28 }, 0xf8, 0xf8, 0 },
|
{ { 0x63, 0x02, 0x28 }, 0xf8, 0xf8, ALPS_FW_BK_2 }, /* Fujitsu Siemens S6010 */
|
||||||
{ { 0x63, 0x02, 0x3c }, 0x8f, 0x8f, ALPS_WHEEL }, /* Toshiba Satellite S2400-103 */
|
{ { 0x63, 0x02, 0x3c }, 0x8f, 0x8f, ALPS_WHEEL }, /* Toshiba Satellite S2400-103 */
|
||||||
{ { 0x63, 0x02, 0x50 }, 0xef, 0xef, ALPS_FW_BK_1 }, /* NEC Versa L320 */
|
{ { 0x63, 0x02, 0x50 }, 0xef, 0xef, ALPS_FW_BK_1 }, /* NEC Versa L320 */
|
||||||
{ { 0x63, 0x02, 0x64 }, 0xf8, 0xf8, 0 },
|
{ { 0x63, 0x02, 0x64 }, 0xf8, 0xf8, 0 },
|
||||||
|
|
|
@ -679,7 +679,15 @@ static void mmc_idle_cards(struct mmc_host *host)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Apply power to the MMC stack.
|
* Apply power to the MMC stack. This is a two-stage process.
|
||||||
|
* First, we enable power to the card without the clock running.
|
||||||
|
* We then wait a bit for the power to stabilise. Finally,
|
||||||
|
* enable the bus drivers and clock to the card.
|
||||||
|
*
|
||||||
|
* We must _NOT_ enable the clock prior to power stablising.
|
||||||
|
*
|
||||||
|
* If a host does all the power sequencing itself, ignore the
|
||||||
|
* initial MMC_POWER_UP stage.
|
||||||
*/
|
*/
|
||||||
static void mmc_power_up(struct mmc_host *host)
|
static void mmc_power_up(struct mmc_host *host)
|
||||||
{
|
{
|
||||||
|
|
|
@ -100,7 +100,7 @@ int ibmvscsi_init_crq_queue(struct crq_queue *queue,
|
||||||
void ibmvscsi_release_crq_queue(struct crq_queue *queue,
|
void ibmvscsi_release_crq_queue(struct crq_queue *queue,
|
||||||
struct ibmvscsi_host_data *hostdata,
|
struct ibmvscsi_host_data *hostdata,
|
||||||
int max_requests);
|
int max_requests);
|
||||||
void ibmvscsi_reset_crq_queue(struct crq_queue *queue,
|
int ibmvscsi_reset_crq_queue(struct crq_queue *queue,
|
||||||
struct ibmvscsi_host_data *hostdata);
|
struct ibmvscsi_host_data *hostdata);
|
||||||
|
|
||||||
void ibmvscsi_handle_crq(struct viosrp_crq *crq,
|
void ibmvscsi_handle_crq(struct viosrp_crq *crq,
|
||||||
|
|
|
@ -117,9 +117,10 @@ void ibmvscsi_release_crq_queue(struct crq_queue *queue,
|
||||||
*
|
*
|
||||||
* no-op for iSeries
|
* no-op for iSeries
|
||||||
*/
|
*/
|
||||||
void ibmvscsi_reset_crq_queue(struct crq_queue *queue,
|
int ibmvscsi_reset_crq_queue(struct crq_queue *queue,
|
||||||
struct ibmvscsi_host_data *hostdata)
|
struct ibmvscsi_host_data *hostdata)
|
||||||
{
|
{
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -230,6 +230,11 @@ int ibmvscsi_init_crq_queue(struct crq_queue *queue,
|
||||||
rc = plpar_hcall_norets(H_REG_CRQ,
|
rc = plpar_hcall_norets(H_REG_CRQ,
|
||||||
vdev->unit_address,
|
vdev->unit_address,
|
||||||
queue->msg_token, PAGE_SIZE);
|
queue->msg_token, PAGE_SIZE);
|
||||||
|
if (rc == H_Resource)
|
||||||
|
/* maybe kexecing and resource is busy. try a reset */
|
||||||
|
rc = ibmvscsi_reset_crq_queue(queue,
|
||||||
|
hostdata);
|
||||||
|
|
||||||
if (rc == 2) {
|
if (rc == 2) {
|
||||||
/* Adapter is good, but other end is not ready */
|
/* Adapter is good, but other end is not ready */
|
||||||
printk(KERN_WARNING "ibmvscsi: Partner adapter not ready\n");
|
printk(KERN_WARNING "ibmvscsi: Partner adapter not ready\n");
|
||||||
|
@ -281,7 +286,7 @@ int ibmvscsi_init_crq_queue(struct crq_queue *queue,
|
||||||
* @hostdata: ibmvscsi_host_data of host
|
* @hostdata: ibmvscsi_host_data of host
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
void ibmvscsi_reset_crq_queue(struct crq_queue *queue,
|
int ibmvscsi_reset_crq_queue(struct crq_queue *queue,
|
||||||
struct ibmvscsi_host_data *hostdata)
|
struct ibmvscsi_host_data *hostdata)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
|
@ -309,4 +314,5 @@ void ibmvscsi_reset_crq_queue(struct crq_queue *queue,
|
||||||
printk(KERN_WARNING
|
printk(KERN_WARNING
|
||||||
"ibmvscsi: couldn't register crq--rc 0x%x\n", rc);
|
"ibmvscsi: couldn't register crq--rc 0x%x\n", rc);
|
||||||
}
|
}
|
||||||
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
|
@ -664,7 +664,7 @@ mega_build_cmd(adapter_t *adapter, Scsi_Cmnd *cmd, int *busy)
|
||||||
sg->offset;
|
sg->offset;
|
||||||
} else
|
} else
|
||||||
buf = cmd->request_buffer;
|
buf = cmd->request_buffer;
|
||||||
memset(cmd->request_buffer, 0, cmd->cmnd[4]);
|
memset(buf, 0, cmd->cmnd[4]);
|
||||||
if (cmd->use_sg) {
|
if (cmd->use_sg) {
|
||||||
struct scatterlist *sg;
|
struct scatterlist *sg;
|
||||||
|
|
||||||
|
|
|
@ -2476,17 +2476,9 @@ typedef struct scsi_qla_host {
|
||||||
*/
|
*/
|
||||||
#define LOOP_TRANSITION(ha) \
|
#define LOOP_TRANSITION(ha) \
|
||||||
(test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags) || \
|
(test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags) || \
|
||||||
test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags))
|
test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags) || \
|
||||||
|
|
||||||
#define LOOP_NOT_READY(ha) \
|
|
||||||
((test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags) || \
|
|
||||||
test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags) || \
|
|
||||||
test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags) || \
|
|
||||||
test_bit(LOOP_RESYNC_ACTIVE, &ha->dpc_flags)) || \
|
|
||||||
atomic_read(&ha->loop_state) == LOOP_DOWN)
|
atomic_read(&ha->loop_state) == LOOP_DOWN)
|
||||||
|
|
||||||
#define LOOP_RDY(ha) (!LOOP_NOT_READY(ha))
|
|
||||||
|
|
||||||
#define TGT_Q(ha, t) (ha->otgt[t])
|
#define TGT_Q(ha, t) (ha->otgt[t])
|
||||||
|
|
||||||
#define to_qla_host(x) ((scsi_qla_host_t *) (x)->hostdata)
|
#define to_qla_host(x) ((scsi_qla_host_t *) (x)->hostdata)
|
||||||
|
|
|
@ -1259,7 +1259,7 @@ qla2x00_configure_hba(scsi_qla_host_t *ha)
|
||||||
rval = qla2x00_get_adapter_id(ha,
|
rval = qla2x00_get_adapter_id(ha,
|
||||||
&loop_id, &al_pa, &area, &domain, &topo);
|
&loop_id, &al_pa, &area, &domain, &topo);
|
||||||
if (rval != QLA_SUCCESS) {
|
if (rval != QLA_SUCCESS) {
|
||||||
if (LOOP_NOT_READY(ha) || atomic_read(&ha->loop_down_timer) ||
|
if (LOOP_TRANSITION(ha) || atomic_read(&ha->loop_down_timer) ||
|
||||||
(rval == QLA_COMMAND_ERROR && loop_id == 0x7)) {
|
(rval == QLA_COMMAND_ERROR && loop_id == 0x7)) {
|
||||||
DEBUG2(printk("%s(%ld) Loop is in a transition state\n",
|
DEBUG2(printk("%s(%ld) Loop is in a transition state\n",
|
||||||
__func__, ha->host_no));
|
__func__, ha->host_no));
|
||||||
|
@ -1796,7 +1796,7 @@ qla2x00_configure_loop(scsi_qla_host_t *ha)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rval == QLA_SUCCESS && test_bit(RSCN_UPDATE, &flags)) {
|
if (rval == QLA_SUCCESS && test_bit(RSCN_UPDATE, &flags)) {
|
||||||
if (LOOP_NOT_READY(ha)) {
|
if (LOOP_TRANSITION(ha)) {
|
||||||
rval = QLA_FUNCTION_FAILED;
|
rval = QLA_FUNCTION_FAILED;
|
||||||
} else {
|
} else {
|
||||||
rval = qla2x00_configure_fabric(ha);
|
rval = qla2x00_configure_fabric(ha);
|
||||||
|
@ -2369,7 +2369,7 @@ qla2x00_find_all_fabric_devs(scsi_qla_host_t *ha, struct list_head *new_fcports)
|
||||||
if (qla2x00_is_reserved_id(ha, loop_id))
|
if (qla2x00_is_reserved_id(ha, loop_id))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (atomic_read(&ha->loop_down_timer) || LOOP_NOT_READY(ha))
|
if (atomic_read(&ha->loop_down_timer) || LOOP_TRANSITION(ha))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (swl != NULL) {
|
if (swl != NULL) {
|
||||||
|
|
|
@ -909,6 +909,21 @@ qla2x00_status_entry(scsi_qla_host_t *ha, void *pkt)
|
||||||
resid = resid_len;
|
resid = resid_len;
|
||||||
cp->resid = resid;
|
cp->resid = resid;
|
||||||
CMD_RESID_LEN(cp) = resid;
|
CMD_RESID_LEN(cp) = resid;
|
||||||
|
|
||||||
|
if (!lscsi_status &&
|
||||||
|
((unsigned)(cp->request_bufflen - resid) <
|
||||||
|
cp->underflow)) {
|
||||||
|
qla_printk(KERN_INFO, ha,
|
||||||
|
"scsi(%ld:%d:%d:%d): Mid-layer underflow "
|
||||||
|
"detected (%x of %x bytes)...returning "
|
||||||
|
"error status.\n", ha->host_no,
|
||||||
|
cp->device->channel, cp->device->id,
|
||||||
|
cp->device->lun, resid,
|
||||||
|
cp->request_bufflen);
|
||||||
|
|
||||||
|
cp->result = DID_ERROR << 16;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
cp->result = DID_OK << 16 | lscsi_status;
|
cp->result = DID_OK << 16 | lscsi_status;
|
||||||
|
|
||||||
|
|
|
@ -422,10 +422,15 @@ static int scsi_eh_completed_normally(struct scsi_cmnd *scmd)
|
||||||
**/
|
**/
|
||||||
static void scsi_eh_done(struct scsi_cmnd *scmd)
|
static void scsi_eh_done(struct scsi_cmnd *scmd)
|
||||||
{
|
{
|
||||||
|
struct completion *eh_action;
|
||||||
|
|
||||||
SCSI_LOG_ERROR_RECOVERY(3,
|
SCSI_LOG_ERROR_RECOVERY(3,
|
||||||
printk("%s scmd: %p result: %x\n",
|
printk("%s scmd: %p result: %x\n",
|
||||||
__FUNCTION__, scmd, scmd->result));
|
__FUNCTION__, scmd, scmd->result));
|
||||||
complete(scmd->device->host->eh_action);
|
|
||||||
|
eh_action = scmd->device->host->eh_action;
|
||||||
|
if (eh_action)
|
||||||
|
complete(eh_action);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1085,6 +1085,26 @@ static void scsi_generic_done(struct scsi_cmnd *cmd)
|
||||||
scsi_io_completion(cmd, cmd->result == 0 ? cmd->bufflen : 0, 0);
|
scsi_io_completion(cmd, cmd->result == 0 ? cmd->bufflen : 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void scsi_setup_blk_pc_cmnd(struct scsi_cmnd *cmd, int retries)
|
||||||
|
{
|
||||||
|
struct request *req = cmd->request;
|
||||||
|
|
||||||
|
BUG_ON(sizeof(req->cmd) > sizeof(cmd->cmnd));
|
||||||
|
memcpy(cmd->cmnd, req->cmd, sizeof(cmd->cmnd));
|
||||||
|
cmd->cmd_len = req->cmd_len;
|
||||||
|
if (!req->data_len)
|
||||||
|
cmd->sc_data_direction = DMA_NONE;
|
||||||
|
else if (rq_data_dir(req) == WRITE)
|
||||||
|
cmd->sc_data_direction = DMA_TO_DEVICE;
|
||||||
|
else
|
||||||
|
cmd->sc_data_direction = DMA_FROM_DEVICE;
|
||||||
|
|
||||||
|
cmd->transfersize = req->data_len;
|
||||||
|
cmd->allowed = retries;
|
||||||
|
cmd->timeout_per_command = req->timeout;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(scsi_setup_blk_pc_cmnd);
|
||||||
|
|
||||||
static int scsi_prep_fn(struct request_queue *q, struct request *req)
|
static int scsi_prep_fn(struct request_queue *q, struct request *req)
|
||||||
{
|
{
|
||||||
struct scsi_device *sdev = q->queuedata;
|
struct scsi_device *sdev = q->queuedata;
|
||||||
|
@ -1220,18 +1240,7 @@ static int scsi_prep_fn(struct request_queue *q, struct request *req)
|
||||||
goto kill;
|
goto kill;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
memcpy(cmd->cmnd, req->cmd, sizeof(cmd->cmnd));
|
scsi_setup_blk_pc_cmnd(cmd, 3);
|
||||||
cmd->cmd_len = req->cmd_len;
|
|
||||||
if (rq_data_dir(req) == WRITE)
|
|
||||||
cmd->sc_data_direction = DMA_TO_DEVICE;
|
|
||||||
else if (req->data_len)
|
|
||||||
cmd->sc_data_direction = DMA_FROM_DEVICE;
|
|
||||||
else
|
|
||||||
cmd->sc_data_direction = DMA_NONE;
|
|
||||||
|
|
||||||
cmd->transfersize = req->data_len;
|
|
||||||
cmd->allowed = 3;
|
|
||||||
cmd->timeout_per_command = req->timeout;
|
|
||||||
cmd->done = scsi_generic_done;
|
cmd->done = scsi_generic_done;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -245,24 +245,10 @@ static int sd_init_command(struct scsi_cmnd * SCpnt)
|
||||||
* SG_IO from block layer already setup, just copy cdb basically
|
* SG_IO from block layer already setup, just copy cdb basically
|
||||||
*/
|
*/
|
||||||
if (blk_pc_request(rq)) {
|
if (blk_pc_request(rq)) {
|
||||||
if (sizeof(rq->cmd) > sizeof(SCpnt->cmnd))
|
scsi_setup_blk_pc_cmnd(SCpnt, SD_PASSTHROUGH_RETRIES);
|
||||||
return 0;
|
|
||||||
|
|
||||||
memcpy(SCpnt->cmnd, rq->cmd, sizeof(SCpnt->cmnd));
|
|
||||||
SCpnt->cmd_len = rq->cmd_len;
|
|
||||||
if (rq_data_dir(rq) == WRITE)
|
|
||||||
SCpnt->sc_data_direction = DMA_TO_DEVICE;
|
|
||||||
else if (rq->data_len)
|
|
||||||
SCpnt->sc_data_direction = DMA_FROM_DEVICE;
|
|
||||||
else
|
|
||||||
SCpnt->sc_data_direction = DMA_NONE;
|
|
||||||
|
|
||||||
this_count = rq->data_len;
|
|
||||||
if (rq->timeout)
|
if (rq->timeout)
|
||||||
timeout = rq->timeout;
|
timeout = rq->timeout;
|
||||||
|
|
||||||
SCpnt->transfersize = rq->data_len;
|
|
||||||
SCpnt->allowed = SD_PASSTHROUGH_RETRIES;
|
|
||||||
goto queue;
|
goto queue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -320,25 +320,11 @@ static int sr_init_command(struct scsi_cmnd * SCpnt)
|
||||||
* these are already setup, just copy cdb basically
|
* these are already setup, just copy cdb basically
|
||||||
*/
|
*/
|
||||||
if (SCpnt->request->flags & REQ_BLOCK_PC) {
|
if (SCpnt->request->flags & REQ_BLOCK_PC) {
|
||||||
struct request *rq = SCpnt->request;
|
scsi_setup_blk_pc_cmnd(SCpnt, MAX_RETRIES);
|
||||||
|
|
||||||
if (sizeof(rq->cmd) > sizeof(SCpnt->cmnd))
|
if (SCpnt->timeout_per_command)
|
||||||
return 0;
|
timeout = SCpnt->timeout_per_command;
|
||||||
|
|
||||||
memcpy(SCpnt->cmnd, rq->cmd, sizeof(SCpnt->cmnd));
|
|
||||||
SCpnt->cmd_len = rq->cmd_len;
|
|
||||||
if (!rq->data_len)
|
|
||||||
SCpnt->sc_data_direction = DMA_NONE;
|
|
||||||
else if (rq_data_dir(rq) == WRITE)
|
|
||||||
SCpnt->sc_data_direction = DMA_TO_DEVICE;
|
|
||||||
else
|
|
||||||
SCpnt->sc_data_direction = DMA_FROM_DEVICE;
|
|
||||||
|
|
||||||
this_count = rq->data_len;
|
|
||||||
if (rq->timeout)
|
|
||||||
timeout = rq->timeout;
|
|
||||||
|
|
||||||
SCpnt->transfersize = rq->data_len;
|
|
||||||
goto queue;
|
goto queue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4194,27 +4194,10 @@ static void st_intr(struct scsi_cmnd *SCpnt)
|
||||||
*/
|
*/
|
||||||
static int st_init_command(struct scsi_cmnd *SCpnt)
|
static int st_init_command(struct scsi_cmnd *SCpnt)
|
||||||
{
|
{
|
||||||
struct request *rq;
|
|
||||||
|
|
||||||
if (!(SCpnt->request->flags & REQ_BLOCK_PC))
|
if (!(SCpnt->request->flags & REQ_BLOCK_PC))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
rq = SCpnt->request;
|
scsi_setup_blk_pc_cmnd(SCpnt, 0);
|
||||||
if (sizeof(rq->cmd) > sizeof(SCpnt->cmnd))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
memcpy(SCpnt->cmnd, rq->cmd, sizeof(SCpnt->cmnd));
|
|
||||||
SCpnt->cmd_len = rq->cmd_len;
|
|
||||||
|
|
||||||
if (rq_data_dir(rq) == WRITE)
|
|
||||||
SCpnt->sc_data_direction = DMA_TO_DEVICE;
|
|
||||||
else if (rq->data_len)
|
|
||||||
SCpnt->sc_data_direction = DMA_FROM_DEVICE;
|
|
||||||
else
|
|
||||||
SCpnt->sc_data_direction = DMA_NONE;
|
|
||||||
|
|
||||||
SCpnt->timeout_per_command = rq->timeout;
|
|
||||||
SCpnt->transfersize = rq->data_len;
|
|
||||||
SCpnt->done = st_intr;
|
SCpnt->done = st_intr;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1405,7 +1405,6 @@ static void sym_check_goals(struct sym_hcb *np, struct scsi_target *starget,
|
||||||
goal->iu = 0;
|
goal->iu = 0;
|
||||||
goal->dt = 0;
|
goal->dt = 0;
|
||||||
goal->qas = 0;
|
goal->qas = 0;
|
||||||
goal->period = 0;
|
|
||||||
goal->offset = 0;
|
goal->offset = 0;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1465,7 +1464,8 @@ static int sym_prepare_nego(struct sym_hcb *np, struct sym_ccb *cp, u_char *msgp
|
||||||
* Many devices implement PPR in a buggy way, so only use it if we
|
* Many devices implement PPR in a buggy way, so only use it if we
|
||||||
* really want to.
|
* really want to.
|
||||||
*/
|
*/
|
||||||
if (goal->iu || goal->dt || goal->qas || (goal->period < 0xa)) {
|
if (goal->offset &&
|
||||||
|
(goal->iu || goal->dt || goal->qas || (goal->period < 0xa))) {
|
||||||
nego = NS_PPR;
|
nego = NS_PPR;
|
||||||
} else if (spi_width(starget) != goal->width) {
|
} else if (spi_width(starget) != goal->width) {
|
||||||
nego = NS_WIDE;
|
nego = NS_WIDE;
|
||||||
|
|
|
@ -32,6 +32,7 @@ void reiserfs_delete_inode(struct inode *inode)
|
||||||
JOURNAL_PER_BALANCE_CNT * 2 +
|
JOURNAL_PER_BALANCE_CNT * 2 +
|
||||||
2 * REISERFS_QUOTA_INIT_BLOCKS(inode->i_sb);
|
2 * REISERFS_QUOTA_INIT_BLOCKS(inode->i_sb);
|
||||||
struct reiserfs_transaction_handle th;
|
struct reiserfs_transaction_handle th;
|
||||||
|
int err;
|
||||||
|
|
||||||
truncate_inode_pages(&inode->i_data, 0);
|
truncate_inode_pages(&inode->i_data, 0);
|
||||||
|
|
||||||
|
@ -49,15 +50,13 @@ void reiserfs_delete_inode(struct inode *inode)
|
||||||
}
|
}
|
||||||
reiserfs_update_inode_transaction(inode);
|
reiserfs_update_inode_transaction(inode);
|
||||||
|
|
||||||
if (reiserfs_delete_object(&th, inode)) {
|
err = reiserfs_delete_object(&th, inode);
|
||||||
up(&inode->i_sem);
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Do quota update inside a transaction for journaled quotas. We must do that
|
/* Do quota update inside a transaction for journaled quotas. We must do that
|
||||||
* after delete_object so that quota updates go into the same transaction as
|
* after delete_object so that quota updates go into the same transaction as
|
||||||
* stat data deletion */
|
* stat data deletion */
|
||||||
DQUOT_FREE_INODE(inode);
|
if (!err)
|
||||||
|
DQUOT_FREE_INODE(inode);
|
||||||
|
|
||||||
if (journal_end(&th, inode->i_sb, jbegin_count)) {
|
if (journal_end(&th, inode->i_sb, jbegin_count)) {
|
||||||
up(&inode->i_sem);
|
up(&inode->i_sem);
|
||||||
|
@ -66,6 +65,12 @@ void reiserfs_delete_inode(struct inode *inode)
|
||||||
|
|
||||||
up(&inode->i_sem);
|
up(&inode->i_sem);
|
||||||
|
|
||||||
|
/* check return value from reiserfs_delete_object after
|
||||||
|
* ending the transaction
|
||||||
|
*/
|
||||||
|
if (err)
|
||||||
|
goto out;
|
||||||
|
|
||||||
/* all items of file are deleted, so we can remove "save" link */
|
/* all items of file are deleted, so we can remove "save" link */
|
||||||
remove_save_link(inode, 0 /* not truncate */ ); /* we can't do anything
|
remove_save_link(inode, 0 /* not truncate */ ); /* we can't do anything
|
||||||
* about an error here */
|
* about an error here */
|
||||||
|
@ -2099,6 +2104,7 @@ int reiserfs_truncate_file(struct inode *p_s_inode, int update_timestamps)
|
||||||
struct page *page = NULL;
|
struct page *page = NULL;
|
||||||
int error;
|
int error;
|
||||||
struct buffer_head *bh = NULL;
|
struct buffer_head *bh = NULL;
|
||||||
|
int err2;
|
||||||
|
|
||||||
reiserfs_write_lock(p_s_inode->i_sb);
|
reiserfs_write_lock(p_s_inode->i_sb);
|
||||||
|
|
||||||
|
@ -2136,14 +2142,18 @@ int reiserfs_truncate_file(struct inode *p_s_inode, int update_timestamps)
|
||||||
transaction of truncating gets committed - on reboot the file
|
transaction of truncating gets committed - on reboot the file
|
||||||
either appears truncated properly or not truncated at all */
|
either appears truncated properly or not truncated at all */
|
||||||
add_save_link(&th, p_s_inode, 1);
|
add_save_link(&th, p_s_inode, 1);
|
||||||
error = reiserfs_do_truncate(&th, p_s_inode, page, update_timestamps);
|
err2 = reiserfs_do_truncate(&th, p_s_inode, page, update_timestamps);
|
||||||
if (error)
|
|
||||||
goto out;
|
|
||||||
error =
|
error =
|
||||||
journal_end(&th, p_s_inode->i_sb, JOURNAL_PER_BALANCE_CNT * 2 + 1);
|
journal_end(&th, p_s_inode->i_sb, JOURNAL_PER_BALANCE_CNT * 2 + 1);
|
||||||
if (error)
|
if (error)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
/* check reiserfs_do_truncate after ending the transaction */
|
||||||
|
if (err2) {
|
||||||
|
error = err2;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
if (update_timestamps) {
|
if (update_timestamps) {
|
||||||
error = remove_save_link(p_s_inode, 1 /* truncate */ );
|
error = remove_save_link(p_s_inode, 1 /* truncate */ );
|
||||||
if (error)
|
if (error)
|
||||||
|
|
|
@ -1039,6 +1039,10 @@ static int flush_commit_list(struct super_block *s,
|
||||||
}
|
}
|
||||||
atomic_dec(&journal->j_async_throttle);
|
atomic_dec(&journal->j_async_throttle);
|
||||||
|
|
||||||
|
/* We're skipping the commit if there's an error */
|
||||||
|
if (retval || reiserfs_is_journal_aborted(journal))
|
||||||
|
barrier = 0;
|
||||||
|
|
||||||
/* wait on everything written so far before writing the commit
|
/* wait on everything written so far before writing the commit
|
||||||
* if we are in barrier mode, send the commit down now
|
* if we are in barrier mode, send the commit down now
|
||||||
*/
|
*/
|
||||||
|
@ -1077,10 +1081,16 @@ static int flush_commit_list(struct super_block *s,
|
||||||
BUG_ON(atomic_read(&(jl->j_commit_left)) != 1);
|
BUG_ON(atomic_read(&(jl->j_commit_left)) != 1);
|
||||||
|
|
||||||
if (!barrier) {
|
if (!barrier) {
|
||||||
if (buffer_dirty(jl->j_commit_bh))
|
/* If there was a write error in the journal - we can't commit
|
||||||
BUG();
|
* this transaction - it will be invalid and, if successful,
|
||||||
mark_buffer_dirty(jl->j_commit_bh);
|
* will just end up propogating the write error out to
|
||||||
sync_dirty_buffer(jl->j_commit_bh);
|
* the file system. */
|
||||||
|
if (likely(!retval && !reiserfs_is_journal_aborted (journal))) {
|
||||||
|
if (buffer_dirty(jl->j_commit_bh))
|
||||||
|
BUG();
|
||||||
|
mark_buffer_dirty(jl->j_commit_bh) ;
|
||||||
|
sync_dirty_buffer(jl->j_commit_bh) ;
|
||||||
|
}
|
||||||
} else
|
} else
|
||||||
wait_on_buffer(jl->j_commit_bh);
|
wait_on_buffer(jl->j_commit_bh);
|
||||||
|
|
||||||
|
|
|
@ -22,6 +22,8 @@ typedef unsigned long elf_freg_t[3];
|
||||||
#define R_ARM_NONE 0
|
#define R_ARM_NONE 0
|
||||||
#define R_ARM_PC24 1
|
#define R_ARM_PC24 1
|
||||||
#define R_ARM_ABS32 2
|
#define R_ARM_ABS32 2
|
||||||
|
#define R_ARM_CALL 28
|
||||||
|
#define R_ARM_JUMP24 29
|
||||||
|
|
||||||
#define ELF_NGREG (sizeof (struct pt_regs) / sizeof(elf_greg_t))
|
#define ELF_NGREG (sizeof (struct pt_regs) / sizeof(elf_greg_t))
|
||||||
typedef elf_greg_t elf_gregset_t[ELF_NGREG];
|
typedef elf_greg_t elf_gregset_t[ELF_NGREG];
|
||||||
|
|
|
@ -74,9 +74,6 @@ typedef struct
|
||||||
u8 white_list, black_list;
|
u8 white_list, black_list;
|
||||||
struct dbdma_cmd *dma_table_cpu;
|
struct dbdma_cmd *dma_table_cpu;
|
||||||
dma_addr_t dma_table_dma;
|
dma_addr_t dma_table_dma;
|
||||||
struct scatterlist *sg_table;
|
|
||||||
int sg_nents;
|
|
||||||
int sg_dma_direction;
|
|
||||||
#endif
|
#endif
|
||||||
struct device *dev;
|
struct device *dev;
|
||||||
int irq;
|
int irq;
|
||||||
|
@ -87,11 +84,6 @@ typedef struct
|
||||||
} _auide_hwif;
|
} _auide_hwif;
|
||||||
|
|
||||||
#ifdef CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA
|
#ifdef CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA
|
||||||
struct drive_list_entry {
|
|
||||||
const char * id_model;
|
|
||||||
const char * id_firmware;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* HD white list */
|
/* HD white list */
|
||||||
static const struct drive_list_entry dma_white_list [] = {
|
static const struct drive_list_entry dma_white_list [] = {
|
||||||
/*
|
/*
|
||||||
|
@ -167,13 +159,9 @@ int __init auide_probe(void);
|
||||||
* Multi-Word DMA + DbDMA functions
|
* Multi-Word DMA + DbDMA functions
|
||||||
*/
|
*/
|
||||||
#ifdef CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA
|
#ifdef CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA
|
||||||
|
|
||||||
static int in_drive_list(struct hd_driveid *id,
|
|
||||||
const struct drive_list_entry *drive_table);
|
|
||||||
static int auide_build_sglist(ide_drive_t *drive, struct request *rq);
|
static int auide_build_sglist(ide_drive_t *drive, struct request *rq);
|
||||||
static int auide_build_dmatable(ide_drive_t *drive);
|
static int auide_build_dmatable(ide_drive_t *drive);
|
||||||
static int auide_dma_end(ide_drive_t *drive);
|
static int auide_dma_end(ide_drive_t *drive);
|
||||||
static void auide_dma_start(ide_drive_t *drive );
|
|
||||||
ide_startstop_t auide_dma_intr (ide_drive_t *drive);
|
ide_startstop_t auide_dma_intr (ide_drive_t *drive);
|
||||||
static void auide_dma_exec_cmd(ide_drive_t *drive, u8 command);
|
static void auide_dma_exec_cmd(ide_drive_t *drive, u8 command);
|
||||||
static int auide_dma_setup(ide_drive_t *drive);
|
static int auide_dma_setup(ide_drive_t *drive);
|
||||||
|
@ -188,8 +176,6 @@ int __init auide_probe(void);
|
||||||
static void auide_ddma_rx_callback(int irq, void *param,
|
static void auide_ddma_rx_callback(int irq, void *param,
|
||||||
struct pt_regs *regs);
|
struct pt_regs *regs);
|
||||||
static int auide_dma_off_quietly(ide_drive_t *drive);
|
static int auide_dma_off_quietly(ide_drive_t *drive);
|
||||||
static int auide_dma_timeout(ide_drive_t *drive);
|
|
||||||
|
|
||||||
#endif /* end CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA */
|
#endif /* end CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA */
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
|
@ -299,3 +285,11 @@ int __init auide_probe(void);
|
||||||
#define SBC_IDE_MDMA2_TPM (0x00<<6)
|
#define SBC_IDE_MDMA2_TPM (0x00<<6)
|
||||||
#define SBC_IDE_MDMA2_TA (0x12<<0)
|
#define SBC_IDE_MDMA2_TA (0x12<<0)
|
||||||
|
|
||||||
|
#define SBC_IDE_TIMING(mode) \
|
||||||
|
SBC_IDE_##mode##_TWCS | \
|
||||||
|
SBC_IDE_##mode##_TCSH | \
|
||||||
|
SBC_IDE_##mode##_TCSOFF | \
|
||||||
|
SBC_IDE_##mode##_TWP | \
|
||||||
|
SBC_IDE_##mode##_TCSW | \
|
||||||
|
SBC_IDE_##mode##_TPM | \
|
||||||
|
SBC_IDE_##mode##_TA
|
||||||
|
|
|
@ -23,17 +23,6 @@
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
#include <asm/semaphore.h>
|
#include <asm/semaphore.h>
|
||||||
|
|
||||||
/*
|
|
||||||
* This is the multiple IDE interface driver, as evolved from hd.c.
|
|
||||||
* It supports up to four IDE interfaces, on one or more IRQs (usually 14 & 15).
|
|
||||||
* There can be up to two drives per interface, as per the ATA-2 spec.
|
|
||||||
*
|
|
||||||
* Primary i/f: ide0: major=3; (hda) minor=0; (hdb) minor=64
|
|
||||||
* Secondary i/f: ide1: major=22; (hdc or hd1a) minor=0; (hdd or hd1b) minor=64
|
|
||||||
* Tertiary i/f: ide2: major=33; (hde) minor=0; (hdf) minor=64
|
|
||||||
* Quaternary i/f: ide3: major=34; (hdg) minor=0; (hdh) minor=64
|
|
||||||
*/
|
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* IDE driver configuration options (play with these as desired):
|
* IDE driver configuration options (play with these as desired):
|
||||||
*
|
*
|
||||||
|
@ -193,11 +182,6 @@ typedef unsigned char byte; /* used everywhere */
|
||||||
#define WAIT_CMD (10*HZ) /* 10sec - maximum wait for an IRQ to happen */
|
#define WAIT_CMD (10*HZ) /* 10sec - maximum wait for an IRQ to happen */
|
||||||
#define WAIT_MIN_SLEEP (2*HZ/100) /* 20msec - minimum sleep time */
|
#define WAIT_MIN_SLEEP (2*HZ/100) /* 20msec - minimum sleep time */
|
||||||
|
|
||||||
#define HOST(hwif,chipset) \
|
|
||||||
{ \
|
|
||||||
return ((hwif)->chipset == chipset) ? 1 : 0; \
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check for an interrupt and acknowledge the interrupt status
|
* Check for an interrupt and acknowledge the interrupt status
|
||||||
*/
|
*/
|
||||||
|
@ -390,45 +374,6 @@ typedef union {
|
||||||
} b;
|
} b;
|
||||||
} ata_nsector_t, ata_data_t, atapi_bcount_t, ata_index_t;
|
} ata_nsector_t, ata_data_t, atapi_bcount_t, ata_index_t;
|
||||||
|
|
||||||
/*
|
|
||||||
* ATA-IDE Error Register
|
|
||||||
*
|
|
||||||
* mark : Bad address mark
|
|
||||||
* tzero : Couldn't find track 0
|
|
||||||
* abrt : Aborted Command
|
|
||||||
* mcr : Media Change Request
|
|
||||||
* id : ID field not found
|
|
||||||
* mce : Media Change Event
|
|
||||||
* ecc : Uncorrectable ECC error
|
|
||||||
* bdd : dual meaing
|
|
||||||
*/
|
|
||||||
typedef union {
|
|
||||||
unsigned all :8;
|
|
||||||
struct {
|
|
||||||
#if defined(__LITTLE_ENDIAN_BITFIELD)
|
|
||||||
unsigned mark :1;
|
|
||||||
unsigned tzero :1;
|
|
||||||
unsigned abrt :1;
|
|
||||||
unsigned mcr :1;
|
|
||||||
unsigned id :1;
|
|
||||||
unsigned mce :1;
|
|
||||||
unsigned ecc :1;
|
|
||||||
unsigned bdd :1;
|
|
||||||
#elif defined(__BIG_ENDIAN_BITFIELD)
|
|
||||||
unsigned bdd :1;
|
|
||||||
unsigned ecc :1;
|
|
||||||
unsigned mce :1;
|
|
||||||
unsigned id :1;
|
|
||||||
unsigned mcr :1;
|
|
||||||
unsigned abrt :1;
|
|
||||||
unsigned tzero :1;
|
|
||||||
unsigned mark :1;
|
|
||||||
#else
|
|
||||||
#error "Please fix <asm/byteorder.h>"
|
|
||||||
#endif
|
|
||||||
} b;
|
|
||||||
} ata_error_t;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ATA-IDE Select Register, aka Device-Head
|
* ATA-IDE Select Register, aka Device-Head
|
||||||
*
|
*
|
||||||
|
@ -503,39 +448,6 @@ typedef union {
|
||||||
} b;
|
} b;
|
||||||
} ata_status_t, atapi_status_t;
|
} ata_status_t, atapi_status_t;
|
||||||
|
|
||||||
/*
|
|
||||||
* ATA-IDE Control Register
|
|
||||||
*
|
|
||||||
* bit0 : Should be set to zero
|
|
||||||
* nIEN : device INTRQ to host
|
|
||||||
* SRST : host soft reset bit
|
|
||||||
* bit3 : ATA-2 thingy, Should be set to 1
|
|
||||||
* reserved456 : Reserved
|
|
||||||
* HOB : 48-bit address ordering, High Ordered Bit
|
|
||||||
*/
|
|
||||||
typedef union {
|
|
||||||
unsigned all : 8;
|
|
||||||
struct {
|
|
||||||
#if defined(__LITTLE_ENDIAN_BITFIELD)
|
|
||||||
unsigned bit0 : 1;
|
|
||||||
unsigned nIEN : 1;
|
|
||||||
unsigned SRST : 1;
|
|
||||||
unsigned bit3 : 1;
|
|
||||||
unsigned reserved456 : 3;
|
|
||||||
unsigned HOB : 1;
|
|
||||||
#elif defined(__BIG_ENDIAN_BITFIELD)
|
|
||||||
unsigned HOB : 1;
|
|
||||||
unsigned reserved456 : 3;
|
|
||||||
unsigned bit3 : 1;
|
|
||||||
unsigned SRST : 1;
|
|
||||||
unsigned nIEN : 1;
|
|
||||||
unsigned bit0 : 1;
|
|
||||||
#else
|
|
||||||
#error "Please fix <asm/byteorder.h>"
|
|
||||||
#endif
|
|
||||||
} b;
|
|
||||||
} ata_control_t;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ATAPI Feature Register
|
* ATAPI Feature Register
|
||||||
*
|
*
|
||||||
|
@ -617,39 +529,6 @@ typedef union {
|
||||||
} b;
|
} b;
|
||||||
} atapi_error_t;
|
} atapi_error_t;
|
||||||
|
|
||||||
/*
|
|
||||||
* ATAPI floppy Drive Select Register
|
|
||||||
*
|
|
||||||
* sam_lun : Logical unit number
|
|
||||||
* reserved3 : Reserved
|
|
||||||
* drv : The responding drive will be drive 0 (0) or drive 1 (1)
|
|
||||||
* one5 : Should be set to 1
|
|
||||||
* reserved6 : Reserved
|
|
||||||
* one7 : Should be set to 1
|
|
||||||
*/
|
|
||||||
typedef union {
|
|
||||||
unsigned all :8;
|
|
||||||
struct {
|
|
||||||
#if defined(__LITTLE_ENDIAN_BITFIELD)
|
|
||||||
unsigned sam_lun :3;
|
|
||||||
unsigned reserved3 :1;
|
|
||||||
unsigned drv :1;
|
|
||||||
unsigned one5 :1;
|
|
||||||
unsigned reserved6 :1;
|
|
||||||
unsigned one7 :1;
|
|
||||||
#elif defined(__BIG_ENDIAN_BITFIELD)
|
|
||||||
unsigned one7 :1;
|
|
||||||
unsigned reserved6 :1;
|
|
||||||
unsigned one5 :1;
|
|
||||||
unsigned drv :1;
|
|
||||||
unsigned reserved3 :1;
|
|
||||||
unsigned sam_lun :3;
|
|
||||||
#else
|
|
||||||
#error "Please fix <asm/byteorder.h>"
|
|
||||||
#endif
|
|
||||||
} b;
|
|
||||||
} atapi_select_t;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Status returned from various ide_ functions
|
* Status returned from various ide_ functions
|
||||||
*/
|
*/
|
||||||
|
@ -1101,10 +980,7 @@ typedef struct ide_driver_s {
|
||||||
int (*end_request)(ide_drive_t *, int, int);
|
int (*end_request)(ide_drive_t *, int, int);
|
||||||
ide_startstop_t (*error)(ide_drive_t *, struct request *rq, u8, u8);
|
ide_startstop_t (*error)(ide_drive_t *, struct request *rq, u8, u8);
|
||||||
ide_startstop_t (*abort)(ide_drive_t *, struct request *rq);
|
ide_startstop_t (*abort)(ide_drive_t *, struct request *rq);
|
||||||
int (*ioctl)(ide_drive_t *, struct inode *, struct file *, unsigned int, unsigned long);
|
|
||||||
ide_proc_entry_t *proc;
|
ide_proc_entry_t *proc;
|
||||||
void (*ata_prebuilder)(ide_drive_t *);
|
|
||||||
void (*atapi_prebuilder)(ide_drive_t *);
|
|
||||||
struct device_driver gen_driver;
|
struct device_driver gen_driver;
|
||||||
} ide_driver_t;
|
} ide_driver_t;
|
||||||
|
|
||||||
|
@ -1298,7 +1174,6 @@ extern int ide_spin_wait_hwgroup(ide_drive_t *);
|
||||||
extern void ide_timer_expiry(unsigned long);
|
extern void ide_timer_expiry(unsigned long);
|
||||||
extern irqreturn_t ide_intr(int irq, void *dev_id, struct pt_regs *regs);
|
extern irqreturn_t ide_intr(int irq, void *dev_id, struct pt_regs *regs);
|
||||||
extern void do_ide_request(request_queue_t *);
|
extern void do_ide_request(request_queue_t *);
|
||||||
extern void ide_init_subdrivers(void);
|
|
||||||
|
|
||||||
void ide_init_disk(struct gendisk *, ide_drive_t *);
|
void ide_init_disk(struct gendisk *, ide_drive_t *);
|
||||||
|
|
||||||
|
@ -1371,6 +1246,12 @@ void ide_init_sg_cmd(ide_drive_t *, struct request *);
|
||||||
#define GOOD_DMA_DRIVE 1
|
#define GOOD_DMA_DRIVE 1
|
||||||
|
|
||||||
#ifdef CONFIG_BLK_DEV_IDEDMA
|
#ifdef CONFIG_BLK_DEV_IDEDMA
|
||||||
|
struct drive_list_entry {
|
||||||
|
const char *id_model;
|
||||||
|
const char *id_firmware;
|
||||||
|
};
|
||||||
|
|
||||||
|
int ide_in_drive_list(struct hd_driveid *, const struct drive_list_entry *);
|
||||||
int __ide_dma_bad_drive(ide_drive_t *);
|
int __ide_dma_bad_drive(ide_drive_t *);
|
||||||
int __ide_dma_good_drive(ide_drive_t *);
|
int __ide_dma_good_drive(ide_drive_t *);
|
||||||
int ide_use_dma(ide_drive_t *);
|
int ide_use_dma(ide_drive_t *);
|
||||||
|
|
|
@ -1244,6 +1244,7 @@
|
||||||
#define PCI_DEVICE_ID_VIA_8378_0 0x3205
|
#define PCI_DEVICE_ID_VIA_8378_0 0x3205
|
||||||
#define PCI_DEVICE_ID_VIA_8783_0 0x3208
|
#define PCI_DEVICE_ID_VIA_8783_0 0x3208
|
||||||
#define PCI_DEVICE_ID_VIA_8237 0x3227
|
#define PCI_DEVICE_ID_VIA_8237 0x3227
|
||||||
|
#define PCI_DEVICE_ID_VIA_8251 0x3287
|
||||||
#define PCI_DEVICE_ID_VIA_3296_0 0x0296
|
#define PCI_DEVICE_ID_VIA_3296_0 0x0296
|
||||||
#define PCI_DEVICE_ID_VIA_8231 0x8231
|
#define PCI_DEVICE_ID_VIA_8231 0x8231
|
||||||
#define PCI_DEVICE_ID_VIA_8231_4 0x8235
|
#define PCI_DEVICE_ID_VIA_8231_4 0x8235
|
||||||
|
|
|
@ -151,5 +151,6 @@ extern struct scsi_cmnd *scsi_get_command(struct scsi_device *, gfp_t);
|
||||||
extern void scsi_put_command(struct scsi_cmnd *);
|
extern void scsi_put_command(struct scsi_cmnd *);
|
||||||
extern void scsi_io_completion(struct scsi_cmnd *, unsigned int, unsigned int);
|
extern void scsi_io_completion(struct scsi_cmnd *, unsigned int, unsigned int);
|
||||||
extern void scsi_finish_command(struct scsi_cmnd *cmd);
|
extern void scsi_finish_command(struct scsi_cmnd *cmd);
|
||||||
|
extern void scsi_setup_blk_pc_cmnd(struct scsi_cmnd *cmd, int retries);
|
||||||
|
|
||||||
#endif /* _SCSI_SCSI_CMND_H */
|
#endif /* _SCSI_SCSI_CMND_H */
|
||||||
|
|
26
init/Kconfig
26
init/Kconfig
|
@ -256,6 +256,20 @@ config CPUSETS
|
||||||
|
|
||||||
source "usr/Kconfig"
|
source "usr/Kconfig"
|
||||||
|
|
||||||
|
config CC_OPTIMIZE_FOR_SIZE
|
||||||
|
bool "Optimize for size (Look out for broken compilers!)"
|
||||||
|
default y
|
||||||
|
depends on ARM || H8300 || EXPERIMENTAL
|
||||||
|
depends on !SPARC64
|
||||||
|
help
|
||||||
|
Enabling this option will pass "-Os" instead of "-O2" to gcc
|
||||||
|
resulting in a smaller kernel.
|
||||||
|
|
||||||
|
WARNING: some versions of gcc may generate incorrect code with this
|
||||||
|
option. If problems are observed, a gcc upgrade may be needed.
|
||||||
|
|
||||||
|
If unsure, say N.
|
||||||
|
|
||||||
menuconfig EMBEDDED
|
menuconfig EMBEDDED
|
||||||
bool "Configure standard kernel features (for small systems)"
|
bool "Configure standard kernel features (for small systems)"
|
||||||
help
|
help
|
||||||
|
@ -338,18 +352,6 @@ config EPOLL
|
||||||
Disabling this option will cause the kernel to be built without
|
Disabling this option will cause the kernel to be built without
|
||||||
support for epoll family of system calls.
|
support for epoll family of system calls.
|
||||||
|
|
||||||
config CC_OPTIMIZE_FOR_SIZE
|
|
||||||
bool "Optimize for size"
|
|
||||||
default y if ARM || H8300
|
|
||||||
help
|
|
||||||
Enabling this option will pass "-Os" instead of "-O2" to gcc
|
|
||||||
resulting in a smaller kernel.
|
|
||||||
|
|
||||||
WARNING: some versions of gcc may generate incorrect code with this
|
|
||||||
option. If problems are observed, a gcc upgrade may be needed.
|
|
||||||
|
|
||||||
If unsure, say N.
|
|
||||||
|
|
||||||
config SHMEM
|
config SHMEM
|
||||||
bool "Use full shmem filesystem" if EMBEDDED
|
bool "Use full shmem filesystem" if EMBEDDED
|
||||||
default y
|
default y
|
||||||
|
|
|
@ -165,6 +165,9 @@ int vlan_skb_recv(struct sk_buff *skb, struct net_device *dev,
|
||||||
|
|
||||||
skb_pull(skb, VLAN_HLEN); /* take off the VLAN header (4 bytes currently) */
|
skb_pull(skb, VLAN_HLEN); /* take off the VLAN header (4 bytes currently) */
|
||||||
|
|
||||||
|
/* Need to correct hardware checksum */
|
||||||
|
skb_postpull_rcsum(skb, vhdr, VLAN_HLEN);
|
||||||
|
|
||||||
/* Ok, lets check to make sure the device (dev) we
|
/* Ok, lets check to make sure the device (dev) we
|
||||||
* came in on is what this VLAN is attached to.
|
* came in on is what this VLAN is attached to.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -618,7 +618,7 @@ static int ipgre_rcv(struct sk_buff *skb)
|
||||||
|
|
||||||
skb->mac.raw = skb->nh.raw;
|
skb->mac.raw = skb->nh.raw;
|
||||||
skb->nh.raw = __pskb_pull(skb, offset);
|
skb->nh.raw = __pskb_pull(skb, offset);
|
||||||
skb_postpull_rcsum(skb, skb->mac.raw, offset);
|
skb_postpull_rcsum(skb, skb->h.raw, offset);
|
||||||
memset(&(IPCB(skb)->opt), 0, sizeof(struct ip_options));
|
memset(&(IPCB(skb)->opt), 0, sizeof(struct ip_options));
|
||||||
skb->pkt_type = PACKET_HOST;
|
skb->pkt_type = PACKET_HOST;
|
||||||
#ifdef CONFIG_NET_IPGRE_BROADCAST
|
#ifdef CONFIG_NET_IPGRE_BROADCAST
|
||||||
|
|
Loading…
Reference in a new issue