amcc5920.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:2k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* -*- linux-c -*- */
  2. /*
  3.  * Copyright (C) 2001 By Joachim Martillo, Telford Tools, Inc.
  4.  *
  5.  * This program is free software; you can redistribute it and/or
  6.  * modify it under the terms of the GNU General Public License
  7.  * as published by the Free Software Foundation; either version
  8.  * 2 of the License, or (at your option) any later version.
  9.  *
  10.  */
  11. /* This file is linked in, but I am
  12.    not sure there is ever any
  13.    reason directly to read the
  14.    serial eprom on the multichannel
  15.    server host card. */
  16. /* We handle PCI devices */
  17. #include <linux/pci.h>      
  18. /* We need to use ioremap */ 
  19. #include <asm/io.h>
  20. #include <linux/delay.h>
  21. #include "8253xmcs.h"
  22. #include "8253xctl.h"
  23. /* read a byte out of the serial eeprom/nvram by means of
  24.  * 16 short commands */
  25. static unsigned int amcc_nvram_breadw(unsigned char *bridge_space, 
  26.       unsigned short address,
  27.       unsigned char *value)
  28. {
  29. unsigned int count;
  30. unsigned rhr;
  31. for(count = 0; count < 20000; ++count)
  32. {
  33. rhr = readl(bridge_space + AMCC_RCR);
  34. if((rhr & AMCC_NVRBUSY) == 0)
  35. {
  36. break;
  37. }
  38. udelay(1);
  39. }
  40. if(count >= 20000)
  41. {
  42. return FALSE;
  43. }
  44. rhr = AMCC_NVRWRLA | ((address & 0x00FF) << 16);
  45. writel(rhr, bridge_space + AMCC_RCR);
  46. rhr = AMCC_NVRWRHA | ((address & 0xFF00) << 8);
  47. writel(rhr, bridge_space + AMCC_RCR);
  48. writel(AMCC_NVRRDDB, bridge_space + AMCC_RCR);
  49. for(count = 0; count < 20000; ++count)
  50. {
  51. rhr = readl(bridge_space + AMCC_RCR);
  52. if((rhr & AMCC_NVRBUSY) == 0)
  53. {
  54. break;
  55. }
  56. udelay(1);
  57. }
  58. if(count >= 20000)
  59. {
  60. return FALSE;
  61. }
  62. if(rhr & AMCC_NVRACCFAIL)
  63. {
  64. return FALSE;
  65. }
  66. *value = (unsigned char) (rhr >> 16);
  67. return TRUE;
  68. }
  69. /* read the whole serial eeprom from the host card */
  70. unsigned int amcc_read_nvram(unsigned char* buffer, unsigned length, unsigned char *bridge_space)
  71. {
  72. unsigned int count;
  73. length <<= 1; /* covert words to bytes */
  74. for(count = 0; count < length; ++count)
  75. {
  76. if(amcc_nvram_breadw(bridge_space, count, &buffer[count]) == FALSE)
  77. {
  78. return FALSE;
  79. }
  80. }
  81. return TRUE;
  82. }