⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hd.c

📁 linux0.11 version(301k)
💻 C
📖 第 1 页 / 共 3 页
字号:
<a name=L101 href="source/kernel/blk_drv/hd.c#L101">101</a>         }<a name=L102 href="source/kernel/blk_drv/hd.c#L102">102</a> <a name=L103 href="source/kernel/blk_drv/hd.c#L103">103</a>         <b><i>/*</i></b><a name=L104 href="source/kernel/blk_drv/hd.c#L104">104</a> <b><i>                We querry CMOS about hard disks : it could be that </i></b><a name=L105 href="source/kernel/blk_drv/hd.c#L105">105</a> <b><i>                we have a SCSI/ESDI/etc controller that is BIOS</i></b><a name=L106 href="source/kernel/blk_drv/hd.c#L106">106</a> <b><i>                compatable with ST-506, and thus showing up in our</i></b><a name=L107 href="source/kernel/blk_drv/hd.c#L107">107</a> <b><i>                BIOS table, but not register compatable, and therefore</i></b><a name=L108 href="source/kernel/blk_drv/hd.c#L108">108</a> <b><i>                not present in CMOS.</i></b><a name=L109 href="source/kernel/blk_drv/hd.c#L109">109</a> <b><i></i></b><a name=L110 href="source/kernel/blk_drv/hd.c#L110">110</a> <b><i>                Furthurmore, we will assume that our ST-506 drives</i></b><a name=L111 href="source/kernel/blk_drv/hd.c#L111">111</a> <b><i>                &lt;if any&gt; are the primary drives in the system, and </i></b><a name=L112 href="source/kernel/blk_drv/hd.c#L112">112</a> <b><i>                the ones reflected as drive 1 or 2.</i></b><a name=L113 href="source/kernel/blk_drv/hd.c#L113">113</a> <b><i></i></b><a name=L114 href="source/kernel/blk_drv/hd.c#L114">114</a> <b><i>                The first drive is stored in the high nibble of CMOS</i></b><a name=L115 href="source/kernel/blk_drv/hd.c#L115">115</a> <b><i>                byte 0x12, the second in the low nibble.  This will be</i></b><a name=L116 href="source/kernel/blk_drv/hd.c#L116">116</a> <b><i>                either a 4 bit drive type or 0xf indicating use byte 0x19 </i></b><a name=L117 href="source/kernel/blk_drv/hd.c#L117">117</a> <b><i>                for an 8 bit type, drive 1, 0x1a for drive 2 in CMOS.</i></b><a name=L118 href="source/kernel/blk_drv/hd.c#L118">118</a> <b><i></i></b><a name=L119 href="source/kernel/blk_drv/hd.c#L119">119</a> <b><i>                Needless to say, a non-zero value means we have </i></b><a name=L120 href="source/kernel/blk_drv/hd.c#L120">120</a> <b><i>                an AT controller hard disk for that drive.</i></b><a name=L121 href="source/kernel/blk_drv/hd.c#L121">121</a> <b><i></i></b><a name=L122 href="source/kernel/blk_drv/hd.c#L122">122</a> <b><i>                </i></b><a name=L123 href="source/kernel/blk_drv/hd.c#L123">123</a> <b><i>        */</i></b><a name=L124 href="source/kernel/blk_drv/hd.c#L124">124</a> <a name=L125 href="source/kernel/blk_drv/hd.c#L125">125</a>         if ((cmos_disks = <a href="ident?i=CMOS_READ">CMOS_READ</a>(0x12)) &amp; 0xf0)<a name=L126 href="source/kernel/blk_drv/hd.c#L126">126</a>                 if (cmos_disks &amp; 0x0f)<a name=L127 href="source/kernel/blk_drv/hd.c#L127">127</a>                         <a href="ident?i=NR_HD">NR_HD</a> = 2;<a name=L128 href="source/kernel/blk_drv/hd.c#L128">128</a>                 else<a name=L129 href="source/kernel/blk_drv/hd.c#L129">129</a>                         <a href="ident?i=NR_HD">NR_HD</a> = 1;<a name=L130 href="source/kernel/blk_drv/hd.c#L130">130</a>         else<a name=L131 href="source/kernel/blk_drv/hd.c#L131">131</a>                 <a href="ident?i=NR_HD">NR_HD</a> = 0;<a name=L132 href="source/kernel/blk_drv/hd.c#L132">132</a>         for (i = <a href="ident?i=NR_HD">NR_HD</a> ; i &lt; 2 ; i++) {<a name=L133 href="source/kernel/blk_drv/hd.c#L133">133</a>                 <a href="ident?i=hd">hd</a>[i*5].start_sect = 0;<a name=L134 href="source/kernel/blk_drv/hd.c#L134">134</a>                 <a href="ident?i=hd">hd</a>[i*5].nr_sects = 0;<a name=L135 href="source/kernel/blk_drv/hd.c#L135">135</a>         }<a name=L136 href="source/kernel/blk_drv/hd.c#L136">136</a>         for (drive=0 ; drive&lt;<a href="ident?i=NR_HD">NR_HD</a> ; drive++) {<a name=L137 href="source/kernel/blk_drv/hd.c#L137">137</a>                 if (!(bh = <a href="ident?i=bread">bread</a>(0x300 + drive*5,0))) {<a name=L138 href="source/kernel/blk_drv/hd.c#L138">138</a>                         <a href="ident?i=printk">printk</a>(<i>"Unable to read partition table of drive %d\n\r"</i>,<a name=L139 href="source/kernel/blk_drv/hd.c#L139">139</a>                                 drive);<a name=L140 href="source/kernel/blk_drv/hd.c#L140">140</a>                         <a href="ident?i=panic">panic</a>(<i>""</i>);<a name=L141 href="source/kernel/blk_drv/hd.c#L141">141</a>                 }<a name=L142 href="source/kernel/blk_drv/hd.c#L142">142</a>                 if (bh-&gt;b_data[510] != 0x55 || (unsigned char)<a name=L143 href="source/kernel/blk_drv/hd.c#L143">143</a>                     bh-&gt;b_data[511] != 0xAA) {<a name=L144 href="source/kernel/blk_drv/hd.c#L144">144</a>                         <a href="ident?i=printk">printk</a>(<i>"Bad partition table on drive %d\n\r"</i>,drive);<a name=L145 href="source/kernel/blk_drv/hd.c#L145">145</a>                         <a href="ident?i=panic">panic</a>(<i>""</i>);<a name=L146 href="source/kernel/blk_drv/hd.c#L146">146</a>                 }<a name=L147 href="source/kernel/blk_drv/hd.c#L147">147</a>                 p = 0x1BE + (void *)bh-&gt;b_data;<a name=L148 href="source/kernel/blk_drv/hd.c#L148">148</a>                 for (i=1;i&lt;5;i++,p++) {<a name=L149 href="source/kernel/blk_drv/hd.c#L149">149</a>                         <a href="ident?i=hd">hd</a>[i+5*drive].start_sect = p-&gt;start_sect;<a name=L150 href="source/kernel/blk_drv/hd.c#L150">150</a>                         <a href="ident?i=hd">hd</a>[i+5*drive].nr_sects = p-&gt;nr_sects;<a name=L151 href="source/kernel/blk_drv/hd.c#L151">151</a>                 }<a name=L152 href="source/kernel/blk_drv/hd.c#L152">152</a>                 <a href="ident?i=brelse">brelse</a>(bh);<a name=L153 href="source/kernel/blk_drv/hd.c#L153">153</a>         }<a name=L154 href="source/kernel/blk_drv/hd.c#L154">154</a>         if (<a href="ident?i=NR_HD">NR_HD</a>)<a name=L155 href="source/kernel/blk_drv/hd.c#L155">155</a>                 <a href="ident?i=printk">printk</a>(<i>"Partition table%s ok.\n\r"</i>,(<a href="ident?i=NR_HD">NR_HD</a>&gt;1)?<i>"s"</i>:<i>""</i>);<a name=L156 href="source/kernel/blk_drv/hd.c#L156">156</a>         <a href="ident?i=rd_load">rd_load</a>();<a name=L157 href="source/kernel/blk_drv/hd.c#L157">157</a>         <a href="ident?i=mount_root">mount_root</a>();<a name=L158 href="source/kernel/blk_drv/hd.c#L158">158</a>         return (0);<a name=L159 href="source/kernel/blk_drv/hd.c#L159">159</a> }<a name=L160 href="source/kernel/blk_drv/hd.c#L160">160</a> <a name=L161 href="source/kernel/blk_drv/hd.c#L161">161</a> static int <a href="ident?i=controller_ready">controller_ready</a>(void)<a name=L162 href="source/kernel/blk_drv/hd.c#L162">162</a> {<a name=L163 href="source/kernel/blk_drv/hd.c#L163">163</a>         int retries=10000;<a name=L164 href="source/kernel/blk_drv/hd.c#L164">164</a> <a name=L165 href="source/kernel/blk_drv/hd.c#L165">165</a>         while (--retries &amp;&amp; (<a href="ident?i=inb_p">inb_p</a>(<a href="ident?i=HD_STATUS">HD_STATUS</a>)&amp;0xc0)!=0x40);<a name=L166 href="source/kernel/blk_drv/hd.c#L166">166</a>         return (retries);<a name=L167 href="source/kernel/blk_drv/hd.c#L167">167</a> }<a name=L168 href="source/kernel/blk_drv/hd.c#L168">168</a> <a name=L169 href="source/kernel/blk_drv/hd.c#L169">169</a> static int <a href="ident?i=win_result">win_result</a>(void)<a name=L170 href="source/kernel/blk_drv/hd.c#L170">170</a> {<a name=L171 href="source/kernel/blk_drv/hd.c#L171">171</a>         int i=<a href="ident?i=inb_p">inb_p</a>(<a href="ident?i=HD_STATUS">HD_STATUS</a>);<a name=L172 href="source/kernel/blk_drv/hd.c#L172">172</a> <a name=L173 href="source/kernel/blk_drv/hd.c#L173">173</a>         if ((i &amp; (<a href="ident?i=BUSY_STAT">BUSY_STAT</a> | <a href="ident?i=READY_STAT">READY_STAT</a> | <a href="ident?i=WRERR_STAT">WRERR_STAT</a> | <a href="ident?i=SEEK_STAT">SEEK_STAT</a> | <a href="ident?i=ERR_STAT">ERR_STAT</a>))<a name=L174 href="source/kernel/blk_drv/hd.c#L174">174</a>                 == (<a href="ident?i=READY_STAT">READY_STAT</a> | <a href="ident?i=SEEK_STAT">SEEK_STAT</a>))<a name=L175 href="source/kernel/blk_drv/hd.c#L175">175</a>                 return(0); <b><i>/* ok */</i></b><a name=L176 href="source/kernel/blk_drv/hd.c#L176">176</a>         if (i&amp;1) i=<a href="ident?i=inb">inb</a>(<a href="ident?i=HD_ERROR">HD_ERROR</a>);<a name=L177 href="source/kernel/blk_drv/hd.c#L177">177</a>         return (1);<a name=L178 href="source/kernel/blk_drv/hd.c#L178">178</a> }<a name=L179 href="source/kernel/blk_drv/hd.c#L179">179</a> <a name=L180 href="source/kernel/blk_drv/hd.c#L180">180</a> static void <a href="ident?i=hd_out">hd_out</a>(unsigned int drive,unsigned int nsect,unsigned int sect,<a name=L181 href="source/kernel/blk_drv/hd.c#L181">181</a>                 unsigned int <a href="ident?i=head">head</a>,unsigned int cyl,unsigned int cmd,<a name=L182 href="source/kernel/blk_drv/hd.c#L182">182</a>                 void (*intr_addr)(void))<a name=L183 href="source/kernel/blk_drv/hd.c#L183">183</a> {<a name=L184 href="source/kernel/blk_drv/hd.c#L184">184</a>         register int port asm(<i>"dx"</i>);<a name=L185 href="source/kernel/blk_drv/hd.c#L185">185</a> <a name=L186 href="source/kernel/blk_drv/hd.c#L186">186</a>         if (drive&gt;1 || <a href="ident?i=head">head</a>&gt;15)<a name=L187 href="source/kernel/blk_drv/hd.c#L187">187</a>                 <a href="ident?i=panic">panic</a>(<i>"Trying to write bad sector"</i>);<a name=L188 href="source/kernel/blk_drv/hd.c#L188">188</a>         if (!<a href="ident?i=controller_ready">controller_ready</a>())<a name=L189 href="source/kernel/blk_drv/hd.c#L189">189</a>                 <a href="ident?i=panic">panic</a>(<i>"HD controller not ready"</i>);<a name=L190 href="source/kernel/blk_drv/hd.c#L190">190</a>         do_hd = intr_addr;<a name=L191 href="source/kernel/blk_drv/hd.c#L191">191</a>         <a href="ident?i=outb_p">outb_p</a>(<a href="ident?i=hd_info">hd_info</a>[drive].ctl,<a href="ident?i=HD_CMD">HD_CMD</a>);<a name=L192 href="source/kernel/blk_drv/hd.c#L192">192</a>         port=<a href="ident?i=HD_DATA">HD_DATA</a>;<a name=L193 href="source/kernel/blk_drv/hd.c#L193">193</a>         <a href="ident?i=outb_p">outb_p</a>(<a href="ident?i=hd_info">hd_info</a>[drive].wpcom&gt;&gt;2,++port);<a name=L194 href="source/kernel/blk_drv/hd.c#L194">194</a>         <a href="ident?i=outb_p">outb_p</a>(nsect,++port);<a name=L195 href="source/kernel/blk_drv/hd.c#L195">195</a>         <a href="ident?i=outb_p">outb_p</a>(sect,++port);<a name=L196 href="source/kernel/blk_drv/hd.c#L196">196</a>         <a href="ident?i=outb_p">outb_p</a>(cyl,++port);<a name=L197 href="source/kernel/blk_drv/hd.c#L197">197</a>         <a href="ident?i=outb_p">outb_p</a>(cyl&gt;&gt;8,++port);<a name=L198 href="source/kernel/blk_drv/hd.c#L198">198</a>         <a href="ident?i=outb_p">outb_p</a>(0xA0|(drive&lt;&lt;4)|<a href="ident?i=head">head</a>,++port);<a name=L199 href="source/kernel/blk_drv/hd.c#L199">199</a>         <a href="ident?i=outb">outb</a>(cmd,++port);<a name=L200 href="source/kernel/blk_drv/hd.c#L200">200</a> }<a name=L201 href="source/kernel/blk_drv/hd.c#L201">201</a> <a name=L202 href="source/kernel/blk_drv/hd.c#L202">202</a> static int <a href="ident?i=drive_busy">drive_busy</a>(void)<a name=L203 href="source/kernel/blk_drv/hd.c#L203">203</a> {<a name=L204 href="source/kernel/blk_drv/hd.c#L204">204</a>         unsigned int i;<a name=L205 href="source/kernel/blk_drv/hd.c#L205">205</a> <a name=L206 href="source/kernel/blk_drv/hd.c#L206">206</a>         for (i = 0; i &lt; 10000; i++)<a name=L207 href="source/kernel/blk_drv/hd.c#L207">207</a>                 if (<a href="ident?i=READY_STAT">READY_STAT</a> == (<a href="ident?i=inb_p">inb_p</a>(<a href="ident?i=HD_STATUS">HD_STATUS</a>) &amp; (<a href="ident?i=BUSY_STAT">BUSY_STAT</a>|<a href="ident?i=READY_STAT">READY_STAT</a>)))<a name=L208 href="source/kernel/blk_drv/hd.c#L208">208</a>                         break;<a name=L209 href="source/kernel/blk_drv/hd.c#L209">209</a>         i = <a href="ident?i=inb">inb</a>(<a href="ident?i=HD_STATUS">HD_STATUS</a>);<a name=L210 href="source/kernel/blk_drv/hd.c#L210">210</a>         i &amp;= <a href="ident?i=BUSY_STAT">BUSY_STAT</a> | <a href="ident?i=READY_STAT">READY_STAT</a> | <a href="ident?i=SEEK_STAT">SEEK_STAT</a>;<a name=L211 href="source/kernel/blk_drv/hd.c#L211">211</a>         if (i == <a href="ident?i=READY_STAT">READY_STAT</a> | <a href="ident?i=SEEK_STAT">SEEK_STAT</a>)<a name=L212 href="source/kernel/blk_drv/hd.c#L212">212</a>                 return(0);<a name=L213 href="source/kernel/blk_drv/hd.c#L213">213</a>         <a href="ident?i=printk">printk</a>(<i>"HD controller times out\n\r"</i>);<a name=L214 href="source/kernel/blk_drv/hd.c#L214">214</a>         return(1);<a name=L215 href="source/kernel/blk_drv/hd.c#L215">215</a> }<a name=L216 href="source/kernel/blk_drv/hd.c#L216">216</a> <a name=L217 href="source/kernel/blk_drv/hd.c#L217">217</a> static void <a href="ident?i=reset_controller">reset_controller</a>(void)<a name=L218 href="source/kernel/blk_drv/hd.c#L218">218</a> {<a name=L219 href="source/kernel/blk_drv/hd.c#L219">219</a>         int     i;<a name=L220 href="source/kernel/blk_drv/hd.c#L220">220</a> <a name=L221 href="source/kernel/blk_drv/hd.c#L221">221</a>         <a href="ident?i=outb">outb</a>(4,<a href="ident?i=HD_CMD">HD_CMD</a>);<a name=L222 href="source/kernel/blk_drv/hd.c#L222">222</a>         for(i = 0; i &lt; 100; i++) <a href="ident?i=nop">nop</a>();<a name=L223 href="source/kernel/blk_drv/hd.c#L223">223</a>         <a href="ident?i=outb">outb</a>(<a href="ident?i=hd_info">hd_info</a>[0].ctl &amp; 0x0f ,<a href="ident?i=HD_CMD">HD_CMD</a>);<a name=L224 href="source/kernel/blk_drv/hd.c#L224">224</a>         if (<a href="ident?i=drive_busy">drive_busy</a>())<a name=L225 href="source/kernel/blk_drv/hd.c#L225">225</a>                 <a href="ident?i=printk">printk</a>(<i>"HD-controller still busy\n\r"</i>);<a name=L226 href="source/kernel/blk_drv/hd.c#L226">226</a>         if ((i = <a href="ident?i=inb">inb</a>(<a href="ident?i=HD_ERROR">HD_ERROR</a>)) != 1)<a name=L227 href="source/kernel/blk_drv/hd.c#L227">227</a>                 <a href="ident?i=printk">printk</a>(<i>"HD-controller reset failed: %02x\n\r"</i>,i);<a name=L228 href="source/kernel/blk_drv/hd.c#L228">228</a> }<a name=L229 href="source/kernel/blk_drv/hd.c#L229">229</a> <a name=L230 href="source/kernel/blk_drv/hd.c#L230">230</a> static void <a href="ident?i=reset_hd">reset_hd</a>(int nr)<a name=L231 href="source/kernel/blk_drv/hd.c#L231">231</a> {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -