setup.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:19k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * BK Id: SCCS/s.setup.c 1.67 12/01/01 20:09:07 benh
  3.  */
  4. /*
  5.  * Common prep/pmac/chrp boot and setup code.
  6.  */
  7. #include <linux/config.h>
  8. #include <linux/module.h>
  9. #include <linux/string.h>
  10. #include <linux/sched.h>
  11. #include <linux/init.h>
  12. #include <linux/reboot.h>
  13. #include <linux/delay.h>
  14. #include <linux/blk.h>
  15. #include <linux/ide.h>
  16. #include <linux/tty.h>
  17. #include <linux/bootmem.h>
  18. #include <linux/seq_file.h>
  19. #include <asm/residual.h>
  20. #include <asm/io.h>
  21. #include <asm/prom.h>
  22. #include <asm/processor.h>
  23. #include <asm/pgtable.h>
  24. #include <asm/bootinfo.h>
  25. #include <asm/setup.h>
  26. #include <asm/amigappc.h>
  27. #include <asm/smp.h>
  28. #include <asm/elf.h>
  29. #include <asm/cputable.h>
  30. #ifdef CONFIG_8xx
  31. #include <asm/mpc8xx.h>
  32. #include <asm/8xx_immap.h>
  33. #endif
  34. #ifdef CONFIG_8260
  35. #include <asm/mpc8260.h>
  36. #include <asm/immap_8260.h>
  37. #endif
  38. #ifdef CONFIG_4xx
  39. #include <asm/ppc4xx.h>
  40. #endif
  41. #include <asm/bootx.h>
  42. #include <asm/btext.h>
  43. #include <asm/machdep.h>
  44. #include <asm/uaccess.h>
  45. #include <asm/system.h>
  46. #include <asm/pmac_feature.h>
  47. extern void platform_init(unsigned long r3, unsigned long r4,
  48. unsigned long r5, unsigned long r6, unsigned long r7);
  49. extern void bootx_init(unsigned long r4, unsigned long phys);
  50. extern unsigned long reloc_offset(void);
  51. extern void identify_cpu(unsigned long offset, unsigned long cpu);
  52. extern void do_cpu_ftr_fixups(unsigned long offset);
  53. #ifdef CONFIG_XMON
  54. extern void xmon_map_scc(void);
  55. #endif
  56. extern boot_infos_t *boot_infos;
  57. char saved_command_line[256];
  58. unsigned char aux_device_present;
  59. struct ide_machdep_calls ppc_ide_md;
  60. char *sysmap;
  61. unsigned long sysmap_size;
  62. /* Used with the BI_MEMSIZE bootinfo parameter to store the memory
  63.    size value reported by the boot loader. */ 
  64. unsigned int boot_mem_size;
  65. int parse_bootinfo(void);
  66. unsigned long ISA_DMA_THRESHOLD;
  67. unsigned long DMA_MODE_READ, DMA_MODE_WRITE;
  68. #ifdef CONFIG_ALL_PPC
  69. int _machine = 0;
  70. extern void prep_init(unsigned long r3, unsigned long r4,
  71. unsigned long r5, unsigned long r6, unsigned long r7);
  72. extern void pmac_init(unsigned long r3, unsigned long r4,
  73. unsigned long r5, unsigned long r6, unsigned long r7);
  74. extern void chrp_init(unsigned long r3, unsigned long r4,
  75. unsigned long r5, unsigned long r6, unsigned long r7);
  76. #endif /* CONFIG_ALL_PPC */
  77. #ifdef CONFIG_MAGIC_SYSRQ
  78. unsigned long SYSRQ_KEY;
  79. #endif /* CONFIG_MAGIC_SYSRQ */
  80. #ifdef CONFIG_VGA_CONSOLE
  81. unsigned long vgacon_remap_base;
  82. #endif
  83. struct machdep_calls ppc_md;
  84. /*
  85.  * These are used in binfmt_elf.c to put aux entries on the stack
  86.  * for each elf executable being started.
  87.  */
  88. int dcache_bsize;
  89. int icache_bsize;
  90. int ucache_bsize;
  91. #ifdef CONFIG_VGA_CONSOLE
  92. struct screen_info screen_info = {
  93. 0, 25, /* orig-x, orig-y */
  94. 0, /* unused */
  95. 0, /* orig-video-page */
  96. 0, /* orig-video-mode */
  97. 80, /* orig-video-cols */
  98. 0,0,0, /* ega_ax, ega_bx, ega_cx */
  99. 25, /* orig-video-lines */
  100. 1, /* orig-video-isVGA */
  101. 16 /* orig-video-points */
  102. };
  103. #endif /* CONFIG_VGA_CONSOLE */
  104. void machine_restart(char *cmd)
  105. {
  106. ppc_md.restart(cmd);
  107. }
  108.   
  109. void machine_power_off(void)
  110. {
  111. ppc_md.power_off();
  112. }
  113.   
  114. void machine_halt(void)
  115. {
  116. ppc_md.halt();
  117. }
  118. #ifdef CONFIG_TAU
  119. extern u32 cpu_temp(unsigned long cpu);
  120. extern u32 cpu_temp_both(unsigned long cpu);
  121. #endif /* CONFIG_TAU */
  122. int show_cpuinfo(struct seq_file *m, void *v)
  123. {
  124. int i = (int) v - 1;
  125. int err = 0;
  126. unsigned int pvr;
  127. unsigned short maj, min;
  128. unsigned long lpj;
  129. if (i >= NR_CPUS) {
  130. /* Show summary information */
  131. #ifdef CONFIG_SMP
  132. unsigned long bogosum = 0;
  133. for (i = 0; i < smp_num_cpus; ++i)
  134. if (cpu_online_map & (1 << i))
  135. bogosum += cpu_data[i].loops_per_jiffy;
  136. seq_printf(m, "total bogomipst: %lu.%02lun",
  137.    bogosum/(500000/HZ), bogosum/(5000/HZ) % 100);
  138. #endif /* CONFIG_SMP */
  139. if (ppc_md.show_cpuinfo != NULL)
  140. err = ppc_md.show_cpuinfo(m);
  141. return err;
  142. }
  143. #ifdef CONFIG_SMP
  144. if (!(cpu_online_map & (1 << i)))
  145. return 0;
  146. pvr = cpu_data[i].pvr;
  147. lpj = cpu_data[i].loops_per_jiffy;
  148. seq_printf(m, "processort: %lun", i);
  149. #else
  150. pvr = mfspr(PVR);
  151. lpj = loops_per_jiffy;
  152. #endif
  153. seq_printf(m, "cputt: ");
  154. if (cur_cpu_spec[i]->pvr_mask)
  155. seq_printf(m, "%s", cur_cpu_spec[i]->cpu_name);
  156. else
  157. seq_printf(m, "unknown (%08x)", pvr);
  158. #ifdef CONFIG_ALTIVEC
  159. if (cur_cpu_spec[i]->cpu_features & CPU_FTR_ALTIVEC)
  160. seq_printf(m, ", altivec supported");
  161. #endif
  162. seq_printf(m, "n");
  163. #ifdef CONFIG_TAU
  164. if (cur_cpu_spec[i]->cpu_features & CPU_FTR_TAU) {
  165. #ifdef CONFIG_TAU_AVERAGE
  166. /* more straightforward, but potentially misleading */
  167. seq_printf(m,  "temperature t: %u C (uncalibrated)n",
  168.    cpu_temp(i));
  169. #else
  170. /* show the actual temp sensor range */
  171. u32 temp;
  172. temp = cpu_temp_both(i);
  173. seq_printf(m, "temperature t: %u-%u C (uncalibrated)n",
  174.    temp & 0xff, temp >> 16);
  175. #endif
  176. }
  177. #endif /* CONFIG_TAU */
  178. if (ppc_md.show_percpuinfo != NULL) {
  179. err = ppc_md.show_percpuinfo(m, i);
  180. if (err)
  181. return err;
  182. }
  183. switch (PVR_VER(pvr)) {
  184. case 0x0020: /* 403 family */
  185. maj = PVR_MAJ(pvr) + 1;
  186. min = PVR_MIN(pvr);
  187. break;
  188. case 0x1008: /* 740P/750P ?? */
  189. maj = ((pvr >> 8) & 0xFF) - 1;
  190. min = pvr & 0xFF;
  191. break;
  192. default:
  193. maj = (pvr >> 8) & 0xFF;
  194. min = pvr & 0xFF;
  195. break;
  196. }
  197. seq_printf(m, "revisiont: %hd.%hd (pvr %04x %04x)n", 
  198.    maj, min, PVR_VER(pvr), PVR_REV(pvr));
  199. seq_printf(m, "bogomipst: %lu.%02lun",
  200.    lpj / (500000/HZ), (lpj / (5000/HZ)) % 100);
  201. #ifdef CONFIG_SMP
  202. seq_printf(m, "n");
  203. #endif
  204. return 0;
  205. }
  206. static void *c_start(struct seq_file *m, loff_t *pos)
  207. {
  208. int i = *pos;
  209. return i <= NR_CPUS? (void *) (i + 1): NULL;
  210. }
  211. static void *c_next(struct seq_file *m, void *v, loff_t *pos)
  212. {
  213. ++*pos;
  214. return c_start(m, pos);
  215. }
  216. static void c_stop(struct seq_file *m, void *v)
  217. {
  218. }
  219. struct seq_operations cpuinfo_op = {
  220. start: c_start,
  221. next: c_next,
  222. stop: c_stop,
  223. show: show_cpuinfo,
  224. };
  225. /*
  226.  * We're called here very early in the boot.  We determine the machine
  227.  * type and call the appropriate low-level setup functions.
  228.  *  -- Cort <cort@fsmlabs.com>
  229.  *
  230.  * Note that the kernel may be running at an address which is different
  231.  * from the address that it was linked at, so we must use RELOC/PTRRELOC
  232.  * to access static data (including strings).  -- paulus
  233.  */
  234. __init
  235. unsigned long
  236. early_init(int r3, int r4, int r5)
  237. {
  238. extern char __bss_start, _end;
  239.   unsigned long phys;
  240. unsigned long offset = reloc_offset();
  241.   /* Default */
  242.   phys = offset + KERNELBASE;
  243. /* First zero the BSS -- use memset, some arches don't have
  244.  * caches on yet */
  245. memset_io(PTRRELOC(&__bss_start), 0, &_end - &__bss_start);
  246. /*
  247.  * Identify the CPU type and fix up code sections
  248.  * that depend on which cpu we have.
  249.  */
  250. identify_cpu(offset, 0);
  251. do_cpu_ftr_fixups(offset);
  252. #if defined(CONFIG_ALL_PPC)
  253. /* If we came here from BootX, clear the screen,
  254.  * set up some pointers and return. */
  255. if ((r3 == 0x426f6f58) && (r5 == 0)) {
  256. bootx_init(r4, phys);
  257. return phys;
  258. }
  259. /* check if we're prep, return if we are */
  260. if ( *(unsigned long *)(0) == 0xdeadc0de )
  261. return phys;
  262. /* 
  263.  * for now, don't use bootinfo because it breaks yaboot 0.5
  264.  * and assume that if we didn't find a magic number, we have OF
  265.  */
  266. phys = prom_init(r3, r4, (prom_entry)r5);
  267. #endif
  268. return phys;
  269. }
  270. #ifdef CONFIG_ALL_PPC
  271. void __init
  272. intuit_machine_type(void)
  273. {
  274. char *model;
  275. struct device_node *root;
  276. /* ask the OF info if we're a chrp or pmac */
  277. root = find_path_device("/");
  278. if (root != 0) {
  279. /* assume pmac unless proven to be chrp -- Cort */
  280. _machine = _MACH_Pmac;
  281. model = get_property(root, "device_type", NULL);
  282. if (model && !strncmp("chrp", model, 4))
  283. _machine = _MACH_chrp;
  284. else {
  285. model = get_property(root, "model", NULL);
  286. if (model && !strncmp(model, "IBM", 3))
  287. _machine = _MACH_chrp;
  288. }
  289. }
  290. }
  291. /*
  292.  * The ALL_PPC version of platform_init...
  293.  */
  294. void __init
  295. platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
  296.       unsigned long r6, unsigned long r7)
  297. {
  298. #ifdef CONFIG_BOOTX_TEXT
  299. extern boot_infos_t *disp_bi;
  300. if (disp_bi) {
  301. btext_clearscreen();
  302. btext_welcome(disp_bi);
  303. }
  304. #endif
  305. /* if we didn't get any bootinfo telling us what we are... */
  306. if (_machine == 0) {
  307. /* prep boot loader tells us if we're prep or not */
  308. if ( *(unsigned long *)(KERNELBASE) == (0xdeadc0de) )
  309. _machine = _MACH_prep;
  310. }
  311. /* not much more to do here, if prep */
  312. if (_machine == _MACH_prep) {
  313. prep_init(r3, r4, r5, r6, r7);
  314. return;
  315. }
  316. /* prom_init has already been called from __start */
  317. if (boot_infos)
  318. relocate_nodes();
  319. /* If we aren't PReP, we can find out if we're Pmac
  320.  * or CHRP with this. */
  321. if (_machine == 0)
  322. intuit_machine_type();
  323. /* finish_device_tree may need _machine defined. */
  324. finish_device_tree();
  325. /*
  326.  * If we were booted via quik, r3 points to the physical
  327.  * address of the command-line parameters.
  328.  * If we were booted from an xcoff image (i.e. netbooted or
  329.  * booted from floppy), we get the command line from the
  330.  * bootargs property of the /chosen node.
  331.  * If an initial ramdisk is present, r3 and r4
  332.  * are used for initrd_start and initrd_size,
  333.  * otherwise they contain 0xdeadbeef.  
  334.  */
  335. if (r3 >= 0x4000 && r3 < 0x800000 && r4 == 0) {
  336. cmd_line[0] = 0;
  337. strncpy(cmd_line, (char *)r3 + KERNELBASE,
  338. sizeof(cmd_line));
  339. } else if (boot_infos != 0) {
  340. /* booted by BootX - check for ramdisk */
  341. if (boot_infos->kernelParamsOffset != 0)
  342. strncpy(cmd_line, (char *) boot_infos
  343. + boot_infos->kernelParamsOffset,
  344. sizeof(cmd_line));
  345. #ifdef CONFIG_BLK_DEV_INITRD
  346. if (boot_infos->ramDisk) {
  347. initrd_start = (unsigned long) boot_infos
  348. + boot_infos->ramDisk;
  349. initrd_end = initrd_start + boot_infos->ramDiskSize;
  350. initrd_below_start_ok = 1;
  351. }
  352. #endif
  353. } else {
  354. struct device_node *chosen;
  355. char *p;
  356. #ifdef CONFIG_BLK_DEV_INITRD
  357. if (r3 && r4 && r4 != 0xdeadbeef)
  358. {
  359. if (r3 < KERNELBASE)
  360. r3 += KERNELBASE;
  361. initrd_start = r3;
  362. initrd_end = r3 + r4;
  363. ROOT_DEV = MKDEV(RAMDISK_MAJOR, 0);
  364. initrd_below_start_ok = 1;
  365. }
  366. #endif
  367. chosen = find_devices("chosen");
  368. if (chosen != NULL) {
  369. p = get_property(chosen, "bootargs", NULL);
  370. if (p && *p) {
  371. cmd_line[0] = 0;
  372. strncpy(cmd_line, p, sizeof(cmd_line));
  373. }
  374. }
  375. }
  376. cmd_line[sizeof(cmd_line) - 1] = 0;
  377. switch (_machine) {
  378. case _MACH_Pmac:
  379. pmac_init(r3, r4, r5, r6, r7);
  380. break;
  381. case _MACH_chrp:
  382. chrp_init(r3, r4, r5, r6, r7);
  383. break;
  384. }
  385. }
  386. #endif /* CONFIG_ALL_PPC */
  387. int parse_bootinfo(void)
  388. {
  389. struct bi_record *rec;
  390. extern char __bss_start[];
  391. rec = (struct bi_record *)_ALIGN((ulong)__bss_start+(1<<20)-1,(1<<20));
  392. if ( rec->tag != BI_FIRST ) {
  393. /*
  394.  * This 0x10000 offset is a terrible hack but it will go away when
  395.  * we have the bootloader handle all the relocation and
  396.  * prom calls -- Cort
  397.  */
  398. rec = (struct bi_record *)_ALIGN((ulong)__bss_start+0x10000+(1<<20)-1,(1<<20));
  399. if ( rec->tag != BI_FIRST )
  400. return -1;
  401. }
  402. for ( ; rec->tag != BI_LAST ;
  403.       rec = (struct bi_record *)((ulong)rec + rec->size) )
  404. {
  405. ulong *data = rec->data;
  406. switch (rec->tag) {
  407. case BI_CMD_LINE:
  408. memcpy(cmd_line, (void *)data, rec->size);
  409. break;
  410. case BI_SYSMAP:
  411. sysmap = (char *)((data[0] >= (KERNELBASE)) ? data[0] :
  412.   (data[0]+KERNELBASE));
  413. sysmap_size = data[1];
  414. break;
  415. #ifdef CONFIG_BLK_DEV_INITRD
  416. case BI_INITRD:
  417. initrd_start = data[0] + KERNELBASE;
  418. initrd_end = data[0] + data[1] + KERNELBASE;
  419. break;
  420. #endif /* CONFIG_BLK_DEV_INITRD */
  421. #ifdef CONFIG_ALL_PPC
  422. case BI_MACHTYPE:
  423. _machine = data[0];
  424. break;
  425. #endif /* CONFIG_ALL_PPC */
  426. case BI_MEMSIZE:
  427. boot_mem_size = data[0];
  428. break;
  429. }
  430. }
  431. return 0;
  432. }
  433. /*
  434.  * Find out what kind of machine we're on and save any data we need
  435.  * from the early boot process (devtree is copied on pmac by prom_init()).
  436.  * This is called very early on the boot process, after a minimal
  437.  * MMU environment has been set up but before MMU_init is called.
  438.  */
  439. void __init
  440. machine_init(unsigned long r3, unsigned long r4, unsigned long r5,
  441.      unsigned long r6, unsigned long r7)
  442. {
  443. #ifdef CONFIG_CMDLINE
  444. strcpy(cmd_line, CONFIG_CMDLINE);
  445. #endif /* CONFIG_CMDLINE */
  446. parse_bootinfo();
  447. platform_init(r3, r4, r5, r6, r7);
  448. if (ppc_md.progress)
  449. ppc_md.progress("id mach(): done", 0x200);
  450. }
  451. /* Checks "l2cr=xxxx" command-line option */
  452. int __init ppc_setup_l2cr(char *str)
  453. {
  454. if (cur_cpu_spec[0]->cpu_features & CPU_FTR_L2CR) {
  455. unsigned long val = simple_strtoul(str, NULL, 0);
  456. printk(KERN_INFO "l2cr set to %lxn", val);
  457.                 _set_L2CR(0);           /* force invalidate by disable cache */
  458.                 _set_L2CR(val);         /* and enable it */
  459. }
  460. return 1;
  461. }
  462. __setup("l2cr=", ppc_setup_l2cr);
  463. void __init ppc_init(void)
  464. {
  465. /* clear the progress line */
  466. if ( ppc_md.progress ) ppc_md.progress("             ", 0xffff);
  467. if (ppc_md.init != NULL) {
  468. ppc_md.init();
  469. }
  470. }
  471. /* Warning, IO base is not yet inited */
  472. void __init setup_arch(char **cmdline_p)
  473. {
  474. extern int panic_timeout;
  475. extern char _etext[], _edata[];
  476. extern char *klimit;
  477. extern void do_init_bootmem(void);
  478. /* so udelay does something sensible, assume <= 1000 bogomips */
  479. loops_per_jiffy = 500000000 / HZ;
  480. #ifdef CONFIG_ALL_PPC
  481. /* This could be called "early setup arch", it must be done
  482.  * now because xmon need it
  483.  */
  484. if (_machine == _MACH_Pmac)
  485. pmac_feature_init(); /* New cool way */
  486. #endif /* CONFIG_ALL_PPC */
  487. #ifdef CONFIG_XMON
  488. xmon_map_scc();
  489. if (strstr(cmd_line, "xmon"))
  490. xmon(0);
  491. #endif /* CONFIG_XMON */
  492. if ( ppc_md.progress ) ppc_md.progress("setup_arch: enter", 0x3eab);
  493. #if defined(CONFIG_KGDB)
  494. kgdb_map_scc();
  495. set_debug_traps();
  496. breakpoint();
  497. #endif
  498. /*
  499.  * Set cache line size based on type of cpu as a default.
  500.  * Systems with OF can look in the properties on the cpu node(s)
  501.  * for a possibly more accurate value.
  502.  */
  503. if (cur_cpu_spec[0]->cpu_features & CPU_FTR_SPLIT_ID_CACHE) {
  504. dcache_bsize = cur_cpu_spec[0]->dcache_bsize;
  505. icache_bsize = cur_cpu_spec[0]->icache_bsize;
  506. ucache_bsize = 0;
  507. } else
  508. ucache_bsize = dcache_bsize = icache_bsize
  509. = cur_cpu_spec[0]->dcache_bsize;
  510. /* reboot on panic */
  511. panic_timeout = 180;
  512. init_mm.start_code = PAGE_OFFSET;
  513. init_mm.end_code = (unsigned long) _etext;
  514. init_mm.end_data = (unsigned long) _edata;
  515. init_mm.brk = (unsigned long) klimit;
  516. /* Save unparsed command line copy for /proc/cmdline */
  517. strcpy(saved_command_line, cmd_line);
  518. *cmdline_p = cmd_line;
  519. /* set up the bootmem stuff with available memory */
  520. do_init_bootmem();
  521. if ( ppc_md.progress ) ppc_md.progress("setup_arch: bootmem", 0x3eab);
  522. ppc_md.setup_arch();
  523. if ( ppc_md.progress ) ppc_md.progress("arch: exit", 0x3eab);
  524. #if defined(CONFIG_PCI) && defined(CONFIG_ALL_PPC)
  525. /* We create the "pci-OF-bus-map" property now so it appear in the
  526.  * /proc device tree
  527.  */
  528. if (have_of) {
  529. struct property* of_prop;
  530. of_prop = (struct property*)alloc_bootmem(sizeof(struct property) + 256);
  531. if (of_prop && find_path_device("/")) {
  532. memset(of_prop, -1, sizeof(struct property) + 256);
  533. of_prop->name = "pci-OF-bus-map";
  534. of_prop->length = 256;
  535. of_prop->value = (unsigned char *)&of_prop[1];
  536. prom_add_property(find_path_device("/"), of_prop);
  537. }
  538. }
  539. #endif /* CONFIG_PCI && CONFIG_ALL_PPC */
  540. paging_init();
  541. sort_exception_table();
  542. /* this is for modules since _machine can be a define -- Cort */
  543. ppc_md.ppc_machine = _machine;
  544. }
  545. /* Convert the shorts/longs in hd_driveid from little to big endian;
  546.  * chars are endian independant, of course, but strings need to be flipped.
  547.  * (Despite what it says in drivers/block/ide.h, they come up as little
  548.  * endian...)
  549.  *
  550.  * Changes to linux/hdreg.h may require changes here. */
  551. void ppc_generic_ide_fix_driveid(struct hd_driveid *id)
  552. {
  553.         int i;
  554. unsigned short *stringcast;
  555. id->config         = __le16_to_cpu(id->config);
  556. id->cyls           = __le16_to_cpu(id->cyls);
  557. id->reserved2      = __le16_to_cpu(id->reserved2);
  558. id->heads          = __le16_to_cpu(id->heads);
  559. id->track_bytes    = __le16_to_cpu(id->track_bytes);
  560. id->sector_bytes   = __le16_to_cpu(id->sector_bytes);
  561. id->sectors        = __le16_to_cpu(id->sectors);
  562. id->vendor0        = __le16_to_cpu(id->vendor0);
  563. id->vendor1        = __le16_to_cpu(id->vendor1);
  564. id->vendor2        = __le16_to_cpu(id->vendor2);
  565. stringcast = (unsigned short *)&id->serial_no[0];
  566. for (i = 0; i < (20/2); i++)
  567.         stringcast[i] = __le16_to_cpu(stringcast[i]);
  568. id->buf_type       = __le16_to_cpu(id->buf_type);
  569. id->buf_size       = __le16_to_cpu(id->buf_size);
  570. id->ecc_bytes      = __le16_to_cpu(id->ecc_bytes);
  571. stringcast = (unsigned short *)&id->fw_rev[0];
  572. for (i = 0; i < (8/2); i++)
  573.         stringcast[i] = __le16_to_cpu(stringcast[i]);
  574. stringcast = (unsigned short *)&id->model[0];
  575. for (i = 0; i < (40/2); i++)
  576.         stringcast[i] = __le16_to_cpu(stringcast[i]);
  577. id->dword_io       = __le16_to_cpu(id->dword_io);
  578. id->reserved50     = __le16_to_cpu(id->reserved50);
  579. id->field_valid    = __le16_to_cpu(id->field_valid);
  580. id->cur_cyls       = __le16_to_cpu(id->cur_cyls);
  581. id->cur_heads      = __le16_to_cpu(id->cur_heads);
  582. id->cur_sectors    = __le16_to_cpu(id->cur_sectors);
  583. id->cur_capacity0  = __le16_to_cpu(id->cur_capacity0);
  584. id->cur_capacity1  = __le16_to_cpu(id->cur_capacity1);
  585. id->lba_capacity   = __le32_to_cpu(id->lba_capacity);
  586. id->dma_1word      = __le16_to_cpu(id->dma_1word);
  587. id->dma_mword      = __le16_to_cpu(id->dma_mword);
  588. id->eide_pio_modes = __le16_to_cpu(id->eide_pio_modes);
  589. id->eide_dma_min   = __le16_to_cpu(id->eide_dma_min);
  590. id->eide_dma_time  = __le16_to_cpu(id->eide_dma_time);
  591. id->eide_pio       = __le16_to_cpu(id->eide_pio);
  592. id->eide_pio_iordy = __le16_to_cpu(id->eide_pio_iordy);
  593. for (i = 0; i < 2; i++)
  594. id->words69_70[i] = __le16_to_cpu(id->words69_70[i]);
  595.         for (i = 0; i < 4; i++)
  596.                 id->words71_74[i] = __le16_to_cpu(id->words71_74[i]);
  597. id->queue_depth    = __le16_to_cpu(id->queue_depth);
  598. for (i = 0; i < 4; i++)
  599. id->words76_79[i] = __le16_to_cpu(id->words76_79[i]);
  600. id->major_rev_num  = __le16_to_cpu(id->major_rev_num);
  601. id->minor_rev_num  = __le16_to_cpu(id->minor_rev_num);
  602. id->command_set_1  = __le16_to_cpu(id->command_set_1);
  603. id->command_set_2  = __le16_to_cpu(id->command_set_2);
  604. id->cfsse          = __le16_to_cpu(id->cfsse);
  605. id->cfs_enable_1   = __le16_to_cpu(id->cfs_enable_1);
  606. id->cfs_enable_2   = __le16_to_cpu(id->cfs_enable_2);
  607. id->csf_default    = __le16_to_cpu(id->csf_default);
  608. id->dma_ultra      = __le16_to_cpu(id->dma_ultra);
  609. id->word89         = __le16_to_cpu(id->word89);
  610. id->word90         = __le16_to_cpu(id->word90);
  611. id->CurAPMvalues   = __le16_to_cpu(id->CurAPMvalues);
  612. id->word92         = __le16_to_cpu(id->word92);
  613. id->hw_config      = __le16_to_cpu(id->hw_config);
  614. for (i = 0; i < 32; i++)
  615. id->words94_125[i]  = __le16_to_cpu(id->words94_125[i]);
  616. id->last_lun       = __le16_to_cpu(id->last_lun);
  617. id->word127        = __le16_to_cpu(id->word127);
  618. id->dlf            = __le16_to_cpu(id->dlf);
  619. id->csfo           = __le16_to_cpu(id->csfo);
  620. for (i = 0; i < 26; i++)
  621. id->words130_155[i] = __le16_to_cpu(id->words130_155[i]);
  622. id->word156        = __le16_to_cpu(id->word156);
  623. for (i = 0; i < 3; i++)
  624. id->words157_159[i] = __le16_to_cpu(id->words157_159[i]);
  625. for (i = 0; i < 96; i++)
  626. id->words160_255[i] = __le16_to_cpu(id->words160_255[i]);
  627. }