drivers/scsi/aic7xxx/aic79xx_osm.c | 13 ++++++++----- drivers/scsi/aic7xxx/aic7xxx_osm.c | 14 +++++++++----- 2 files changed, 17 insertions(+), 10 deletions(-) diff -puN drivers/scsi/aic7xxx/aic79xx_osm.c~aic7xxx-fixes drivers/scsi/aic7xxx/aic79xx_osm.c --- 25/drivers/scsi/aic7xxx/aic79xx_osm.c~aic7xxx-fixes 2003-05-14 00:00:04.000000000 -0700 +++ 25-akpm/drivers/scsi/aic7xxx/aic79xx_osm.c 2003-05-14 00:00:04.000000000 -0700 @@ -760,8 +760,9 @@ ahd_linux_map_seg(struct ahd_softc *ahd, * Due to DAC restrictions, we can't * cross a 4GB boundary. */ - if ((addr ^ (addr + len - 1)) & ~0xFFFFFFFF) { + if ((addr ^ (addr + len - 1)) & 0xFFFFFFFF00000000ULL) { struct ahd_dma_seg *next_sg; + uint32_t first_len; uint32_t next_len; printf("Crossed Seg\n"); @@ -772,12 +773,14 @@ ahd_linux_map_seg(struct ahd_softc *ahd, consumed++; next_sg = sg + 1; next_sg->addr = 0; - next_len = 0x100000000 - (addr & 0xFFFFFFFF); - len -= next_len; - next_len |= ((addr >> 8) + 0x1000000) & 0x7F000000; + first_len = 0x100000000ULL - (addr & 0xFFFFFFFF); + next_len = len - first_len; + len = next_len; + next_len |= + ((addr >> 8) + 0x1000000) & AHD_SG_HIGH_ADDR_MASK; next_sg->len = ahd_htole32(next_len); } - len |= (addr >> 8) & 0x7F000000; + len |= (addr >> 8) & AHD_SG_HIGH_ADDR_MASK; } sg->len = ahd_htole32(len); return (consumed); diff -puN drivers/scsi/aic7xxx/aic7xxx_osm.c~aic7xxx-fixes drivers/scsi/aic7xxx/aic7xxx_osm.c --- 25/drivers/scsi/aic7xxx/aic7xxx_osm.c~aic7xxx-fixes 2003-05-14 00:00:04.000000000 -0700 +++ 25-akpm/drivers/scsi/aic7xxx/aic7xxx_osm.c 2003-05-14 00:00:04.000000000 -0700 @@ -747,12 +747,14 @@ ahc_linux_map_seg(struct ahc_softc *ahc, scb->platform_data->xfer_len += len; if (sizeof(bus_addr_t) > 4 && (ahc->flags & AHC_39BIT_ADDRESSING) != 0) { + /* * Due to DAC restrictions, we can't * cross a 4GB boundary. */ - if ((addr ^ (addr + len - 1)) & ~0xFFFFFFFF) { + if ((addr ^ (addr + len - 1)) & 0xFFFFFFFF00000000ULL) { struct ahc_dma_seg *next_sg; + uint32_t first_len; uint32_t next_len; printf("Crossed Seg\n"); @@ -763,12 +765,14 @@ ahc_linux_map_seg(struct ahc_softc *ahc, consumed++; next_sg = sg + 1; next_sg->addr = 0; - next_len = 0x100000000 - (addr & 0xFFFFFFFF); - len -= next_len; - next_len |= ((addr >> 8) + 0x1000000) & 0x7F000000; + first_len = 0x100000000ULL - (addr & 0xFFFFFFFF); + next_len = len - first_len; + len = first_len; + next_len |= + ((addr >> 8) + 0x1000000) & AHC_SG_HIGH_ADDR_MASK; next_sg->len = ahc_htole32(next_len); } - len |= (addr >> 8) & 0x7F000000; + len |= (addr >> 8) & AHC_SG_HIGH_ADDR_MASK; } sg->len = ahc_htole32(len); return (consumed); _