Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'upstream-fixes' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/libata-dev

+33 -8
+27 -5
drivers/scsi/ahci.c
··· 134 134 PORT_IRQ_D2H_REG_FIS, 135 135 136 136 /* PORT_CMD bits */ 137 + PORT_CMD_ATAPI = (1 << 24), /* Device is ATAPI */ 137 138 PORT_CMD_LIST_ON = (1 << 15), /* cmd list DMA engine running */ 138 139 PORT_CMD_FIS_ON = (1 << 14), /* FIS DMA engine running */ 139 140 PORT_CMD_FIS_RX = (1 << 4), /* Enable FIS receive DMA engine */ ··· 442 441 void __iomem *port_mmio = (void __iomem *) ap->ioaddr.cmd_addr; 443 442 struct ata_taskfile tf; 444 443 struct ata_device *dev = &ap->device[0]; 445 - u32 tmp; 444 + u32 new_tmp, tmp; 446 445 447 446 __sata_phy_reset(ap); 448 447 ··· 456 455 tf.nsect = (tmp) & 0xff; 457 456 458 457 dev->class = ata_dev_classify(&tf); 459 - if (!ata_dev_present(dev)) 458 + if (!ata_dev_present(dev)) { 460 459 ata_port_disable(ap); 460 + return; 461 + } 462 + 463 + /* Make sure port's ATAPI bit is set appropriately */ 464 + new_tmp = tmp = readl(port_mmio + PORT_CMD); 465 + if (dev->class == ATA_DEV_ATAPI) 466 + new_tmp |= PORT_CMD_ATAPI; 467 + else 468 + new_tmp &= ~PORT_CMD_ATAPI; 469 + if (new_tmp != tmp) { 470 + writel(new_tmp, port_mmio + PORT_CMD); 471 + readl(port_mmio + PORT_CMD); /* flush */ 472 + } 461 473 } 462 474 463 475 static u8 ahci_check_status(struct ata_port *ap) ··· 488 474 ata_tf_from_fis(d2h_fis, tf); 489 475 } 490 476 491 - static void ahci_fill_sg(struct ata_queued_cmd *qc) 477 + static unsigned int ahci_fill_sg(struct ata_queued_cmd *qc) 492 478 { 493 479 struct ahci_port_priv *pp = qc->ap->private_data; 494 480 struct scatterlist *sg; 495 481 struct ahci_sg *ahci_sg; 482 + unsigned int n_sg = 0; 496 483 497 484 VPRINTK("ENTER\n"); 498 485 ··· 508 493 ahci_sg->addr = cpu_to_le32(addr & 0xffffffff); 509 494 ahci_sg->addr_hi = cpu_to_le32((addr >> 16) >> 16); 510 495 ahci_sg->flags_size = cpu_to_le32(sg_len - 1); 496 + 511 497 ahci_sg++; 498 + n_sg++; 512 499 } 500 + 501 + return n_sg; 513 502 } 514 503 515 504 static void ahci_qc_prep(struct ata_queued_cmd *qc) ··· 522 503 struct ahci_port_priv *pp = ap->private_data; 523 504 u32 opts; 524 505 const u32 cmd_fis_len = 5; /* five dwords */ 506 + unsigned int n_elem; 525 507 526 508 /* 527 509 * Fill in command slot information (currently only one slot, 528 510 * slot 0, is currently since we don't do queueing) 529 511 */ 530 512 531 - opts = (qc->n_elem << 16) | cmd_fis_len; 513 + opts = cmd_fis_len; 532 514 if (qc->tf.flags & ATA_TFLAG_WRITE) 533 515 opts |= AHCI_CMD_WRITE; 534 516 if (is_atapi_taskfile(&qc->tf)) ··· 553 533 if (!(qc->flags & ATA_QCFLAG_DMAMAP)) 554 534 return; 555 535 556 - ahci_fill_sg(qc); 536 + n_elem = ahci_fill_sg(qc); 537 + 538 + pp->cmd_slot[0].opts |= cpu_to_le32(n_elem << 16); 557 539 } 558 540 559 541 static void ahci_intr_error(struct ata_port *ap, u32 irq_stat)
+6 -3
drivers/scsi/sata_qstor.c
··· 268 268 writel(val, (void __iomem *)(ap->ioaddr.scr_addr + (sc_reg * 8))); 269 269 } 270 270 271 - static void qs_fill_sg(struct ata_queued_cmd *qc) 271 + static unsigned int qs_fill_sg(struct ata_queued_cmd *qc) 272 272 { 273 273 struct scatterlist *sg; 274 274 struct ata_port *ap = qc->ap; ··· 296 296 (unsigned long long)addr, len); 297 297 nelem++; 298 298 } 299 + 300 + return nelem; 299 301 } 300 302 301 303 static void qs_qc_prep(struct ata_queued_cmd *qc) ··· 306 304 u8 dflags = QS_DF_PORD, *buf = pp->pkt; 307 305 u8 hflags = QS_HF_DAT | QS_HF_IEN | QS_HF_VLD; 308 306 u64 addr; 307 + unsigned int nelem; 309 308 310 309 VPRINTK("ENTER\n"); 311 310 ··· 316 313 return; 317 314 } 318 315 319 - qs_fill_sg(qc); 316 + nelem = qs_fill_sg(qc); 320 317 321 318 if ((qc->tf.flags & ATA_TFLAG_WRITE)) 322 319 hflags |= QS_HF_DIRO; ··· 327 324 buf[ 0] = QS_HCB_HDR; 328 325 buf[ 1] = hflags; 329 326 *(__le32 *)(&buf[ 4]) = cpu_to_le32(qc->nsect * ATA_SECT_SIZE); 330 - *(__le32 *)(&buf[ 8]) = cpu_to_le32(qc->n_elem); 327 + *(__le32 *)(&buf[ 8]) = cpu_to_le32(nelem); 331 328 addr = ((u64)pp->pkt_dma) + QS_CPB_BYTES; 332 329 *(__le64 *)(&buf[16]) = cpu_to_le64(addr); 333 330