diff options
Diffstat (limited to 'include/linux')
524 files changed, 18358 insertions, 7381 deletions
diff --git a/include/linux/Kbuild b/include/linux/Kbuild index 2fc8e14cc24a..90e3ed3a3144 100644 --- a/include/linux/Kbuild +++ b/include/linux/Kbuild | |||
| @@ -15,377 +15,375 @@ header-y += netfilter_bridge/ | |||
| 15 | header-y += netfilter_ipv4/ | 15 | header-y += netfilter_ipv4/ |
| 16 | header-y += netfilter_ipv6/ | 16 | header-y += netfilter_ipv6/ |
| 17 | header-y += usb/ | 17 | header-y += usb/ |
| 18 | header-y += wimax/ | ||
| 19 | |||
| 20 | objhdr-y += version.h | ||
| 21 | |||
| 22 | ifneq ($(wildcard $(srctree)/arch/$(SRCARCH)/include/asm/a.out.h \ | ||
| 23 | $(srctree)/include/asm-$(SRCARCH)/a.out.h),) | ||
| 24 | header-y += a.out.h | ||
| 25 | endif | ||
| 26 | ifneq ($(wildcard $(srctree)/arch/$(SRCARCH)/include/asm/kvm.h \ | ||
| 27 | $(srctree)/include/asm-$(SRCARCH)/kvm.h),) | ||
| 28 | header-y += kvm.h | ||
| 29 | endif | ||
| 30 | ifneq ($(wildcard $(srctree)/arch/$(SRCARCH)/include/asm/kvm_para.h \ | ||
| 31 | $(srctree)/include/asm-$(SRCARCH)/kvm_para.h),) | ||
| 32 | header-y += kvm_para.h | ||
| 33 | endif | ||
| 18 | 34 | ||
| 35 | header-y += acct.h | ||
| 36 | header-y += adb.h | ||
| 37 | header-y += adfs_fs.h | ||
| 19 | header-y += affs_hardblocks.h | 38 | header-y += affs_hardblocks.h |
| 39 | header-y += agpgart.h | ||
| 20 | header-y += aio_abi.h | 40 | header-y += aio_abi.h |
| 41 | header-y += apm_bios.h | ||
| 21 | header-y += arcfb.h | 42 | header-y += arcfb.h |
| 43 | header-y += atalk.h | ||
| 44 | header-y += atm.h | ||
| 45 | header-y += atm_eni.h | ||
| 46 | header-y += atm_he.h | ||
| 47 | header-y += atm_idt77105.h | ||
| 48 | header-y += atm_nicstar.h | ||
| 49 | header-y += atm_tcp.h | ||
| 50 | header-y += atm_zatm.h | ||
| 22 | header-y += atmapi.h | 51 | header-y += atmapi.h |
| 23 | header-y += atmarp.h | 52 | header-y += atmarp.h |
| 24 | header-y += atmbr2684.h | 53 | header-y += atmbr2684.h |
| 25 | header-y += atmclip.h | 54 | header-y += atmclip.h |
| 26 | header-y += atm_eni.h | 55 | header-y += atmdev.h |
| 27 | header-y += atm_he.h | ||
| 28 | header-y += atm_idt77105.h | ||
| 29 | header-y += atmioc.h | 56 | header-y += atmioc.h |
| 30 | header-y += atmlec.h | 57 | header-y += atmlec.h |
| 31 | header-y += atmmpc.h | 58 | header-y += atmmpc.h |
| 32 | header-y += atm_nicstar.h | ||
| 33 | header-y += atmppp.h | 59 | header-y += atmppp.h |
| 34 | header-y += atmsap.h | 60 | header-y += atmsap.h |
| 35 | header-y += atmsvc.h | 61 | header-y += atmsvc.h |
| 36 | header-y += atm_zatm.h | 62 | header-y += audit.h |
| 63 | header-y += auto_fs.h | ||
| 37 | header-y += auto_fs4.h | 64 | header-y += auto_fs4.h |
| 65 | header-y += auxvec.h | ||
| 38 | header-y += ax25.h | 66 | header-y += ax25.h |
| 39 | header-y += b1lli.h | 67 | header-y += b1lli.h |
| 40 | header-y += baycom.h | 68 | header-y += baycom.h |
| 41 | header-y += bfs_fs.h | 69 | header-y += bfs_fs.h |
| 70 | header-y += binfmts.h | ||
| 71 | header-y += blk_types.h | ||
| 42 | header-y += blkpg.h | 72 | header-y += blkpg.h |
| 73 | header-y += blktrace_api.h | ||
| 43 | header-y += bpqether.h | 74 | header-y += bpqether.h |
| 44 | header-y += bsg.h | 75 | header-y += bsg.h |
| 45 | header-y += can.h | 76 | header-y += can.h |
| 77 | header-y += capability.h | ||
| 78 | header-y += capi.h | ||
| 46 | header-y += cciss_defs.h | 79 | header-y += cciss_defs.h |
| 80 | header-y += cciss_ioctl.h | ||
| 47 | header-y += cdk.h | 81 | header-y += cdk.h |
| 82 | header-y += cdrom.h | ||
| 83 | header-y += cgroupstats.h | ||
| 48 | header-y += chio.h | 84 | header-y += chio.h |
| 85 | header-y += cm4000_cs.h | ||
| 86 | header-y += cn_proc.h | ||
| 87 | header-y += coda.h | ||
| 49 | header-y += coda_psdev.h | 88 | header-y += coda_psdev.h |
| 50 | header-y += coff.h | 89 | header-y += coff.h |
| 51 | header-y += comstats.h | 90 | header-y += comstats.h |
| 91 | header-y += connector.h | ||
| 52 | header-y += const.h | 92 | header-y += const.h |
| 53 | header-y += cgroupstats.h | ||
| 54 | header-y += cramfs_fs.h | 93 | header-y += cramfs_fs.h |
| 94 | header-y += cuda.h | ||
| 95 | header-y += cyclades.h | ||
| 55 | header-y += cycx_cfm.h | 96 | header-y += cycx_cfm.h |
| 56 | header-y += dcbnl.h | 97 | header-y += dcbnl.h |
| 57 | header-y += dlmconstants.h | 98 | header-y += dccp.h |
| 99 | header-y += dlm.h | ||
| 58 | header-y += dlm_device.h | 100 | header-y += dlm_device.h |
| 59 | header-y += dlm_netlink.h | 101 | header-y += dlm_netlink.h |
| 102 | header-y += dlm_plock.h | ||
| 103 | header-y += dlmconstants.h | ||
| 60 | header-y += dm-ioctl.h | 104 | header-y += dm-ioctl.h |
| 61 | header-y += dm-log-userspace.h | 105 | header-y += dm-log-userspace.h |
| 62 | header-y += dn.h | 106 | header-y += dn.h |
| 63 | header-y += dqblk_xfs.h | 107 | header-y += dqblk_xfs.h |
| 108 | header-y += edd.h | ||
| 64 | header-y += efs_fs_sb.h | 109 | header-y += efs_fs_sb.h |
| 65 | header-y += elf-fdpic.h | ||
| 66 | header-y += elf-em.h | 110 | header-y += elf-em.h |
| 111 | header-y += elf-fdpic.h | ||
| 112 | header-y += elf.h | ||
| 113 | header-y += elfcore.h | ||
| 114 | header-y += errno.h | ||
| 115 | header-y += errqueue.h | ||
| 116 | header-y += ethtool.h | ||
| 117 | header-y += eventpoll.h | ||
| 118 | header-y += ext2_fs.h | ||
| 67 | header-y += fadvise.h | 119 | header-y += fadvise.h |
| 68 | header-y += falloc.h | 120 | header-y += falloc.h |
| 121 | header-y += fb.h | ||
| 122 | header-y += fcntl.h | ||
| 69 | header-y += fd.h | 123 | header-y += fd.h |
| 70 | header-y += fdreg.h | 124 | header-y += fdreg.h |
| 71 | header-y += fib_rules.h | 125 | header-y += fib_rules.h |
| 72 | header-y += fiemap.h | 126 | header-y += fiemap.h |
| 127 | header-y += filter.h | ||
| 73 | header-y += firewire-cdev.h | 128 | header-y += firewire-cdev.h |
| 74 | header-y += firewire-constants.h | 129 | header-y += firewire-constants.h |
| 130 | header-y += flat.h | ||
| 131 | header-y += fs.h | ||
| 75 | header-y += fuse.h | 132 | header-y += fuse.h |
| 76 | header-y += genetlink.h | 133 | header-y += futex.h |
| 134 | header-y += gameport.h | ||
| 77 | header-y += gen_stats.h | 135 | header-y += gen_stats.h |
| 136 | header-y += generic_serial.h | ||
| 137 | header-y += genetlink.h | ||
| 78 | header-y += gfs2_ondisk.h | 138 | header-y += gfs2_ondisk.h |
| 79 | header-y += gigaset_dev.h | 139 | header-y += gigaset_dev.h |
| 140 | header-y += hdlc.h | ||
| 141 | header-y += hdlcdrv.h | ||
| 142 | header-y += hdreg.h | ||
| 143 | header-y += hid.h | ||
| 144 | header-y += hiddev.h | ||
| 145 | header-y += hidraw.h | ||
| 146 | header-y += hpet.h | ||
| 80 | header-y += hysdn_if.h | 147 | header-y += hysdn_if.h |
| 148 | header-y += i2c-dev.h | ||
| 149 | header-y += i2c.h | ||
| 81 | header-y += i2o-dev.h | 150 | header-y += i2o-dev.h |
| 82 | header-y += i8k.h | 151 | header-y += i8k.h |
| 152 | header-y += icmp.h | ||
| 153 | header-y += icmpv6.h | ||
| 154 | header-y += if.h | ||
| 155 | header-y += if_addr.h | ||
| 83 | header-y += if_addrlabel.h | 156 | header-y += if_addrlabel.h |
| 84 | header-y += if_arcnet.h | 157 | header-y += if_arcnet.h |
| 158 | header-y += if_arp.h | ||
| 85 | header-y += if_bonding.h | 159 | header-y += if_bonding.h |
| 160 | header-y += if_bridge.h | ||
| 86 | header-y += if_cablemodem.h | 161 | header-y += if_cablemodem.h |
| 162 | header-y += if_ec.h | ||
| 163 | header-y += if_eql.h | ||
| 164 | header-y += if_ether.h | ||
| 87 | header-y += if_fc.h | 165 | header-y += if_fc.h |
| 88 | header-y += if.h | 166 | header-y += if_fddi.h |
| 167 | header-y += if_frad.h | ||
| 89 | header-y += if_hippi.h | 168 | header-y += if_hippi.h |
| 90 | header-y += if_infiniband.h | 169 | header-y += if_infiniband.h |
| 170 | header-y += if_link.h | ||
| 171 | header-y += if_ltalk.h | ||
| 91 | header-y += if_packet.h | 172 | header-y += if_packet.h |
| 173 | header-y += if_phonet.h | ||
| 92 | header-y += if_plip.h | 174 | header-y += if_plip.h |
| 93 | header-y += if_ppp.h | 175 | header-y += if_ppp.h |
| 176 | header-y += if_pppol2tp.h | ||
| 177 | header-y += if_pppox.h | ||
| 94 | header-y += if_slip.h | 178 | header-y += if_slip.h |
| 95 | header-y += if_strip.h | 179 | header-y += if_strip.h |
| 180 | header-y += if_tr.h | ||
| 96 | header-y += if_tun.h | 181 | header-y += if_tun.h |
| 182 | header-y += if_tunnel.h | ||
| 183 | header-y += if_vlan.h | ||
| 97 | header-y += if_x25.h | 184 | header-y += if_x25.h |
| 185 | header-y += igmp.h | ||
| 186 | header-y += in.h | ||
| 187 | header-y += in6.h | ||
| 98 | header-y += in_route.h | 188 | header-y += in_route.h |
| 189 | header-y += inet_diag.h | ||
| 190 | header-y += inotify.h | ||
| 191 | header-y += input.h | ||
| 99 | header-y += ioctl.h | 192 | header-y += ioctl.h |
| 193 | header-y += ip.h | ||
| 100 | header-y += ip6_tunnel.h | 194 | header-y += ip6_tunnel.h |
| 195 | header-y += ip_vs.h | ||
| 196 | header-y += ipc.h | ||
| 197 | header-y += ipmi.h | ||
| 101 | header-y += ipmi_msgdefs.h | 198 | header-y += ipmi_msgdefs.h |
| 102 | header-y += ipsec.h | 199 | header-y += ipsec.h |
| 103 | header-y += ip_vs.h | 200 | header-y += ipv6.h |
| 201 | header-y += ipv6_route.h | ||
| 104 | header-y += ipx.h | 202 | header-y += ipx.h |
| 105 | header-y += irda.h | 203 | header-y += irda.h |
| 204 | header-y += irqnr.h | ||
| 205 | header-y += isdn.h | ||
| 206 | header-y += isdn_divertif.h | ||
| 207 | header-y += isdn_ppp.h | ||
| 208 | header-y += isdnif.h | ||
| 106 | header-y += iso_fs.h | 209 | header-y += iso_fs.h |
| 210 | header-y += ivtv.h | ||
| 211 | header-y += ivtvfb.h | ||
| 107 | header-y += ixjuser.h | 212 | header-y += ixjuser.h |
| 108 | header-y += jffs2.h | 213 | header-y += jffs2.h |
| 214 | header-y += joystick.h | ||
| 215 | header-y += kd.h | ||
| 216 | header-y += kdev_t.h | ||
| 217 | header-y += kernel.h | ||
| 218 | header-y += kernelcapi.h | ||
| 219 | header-y += keyboard.h | ||
| 109 | header-y += keyctl.h | 220 | header-y += keyctl.h |
| 221 | header-y += l2tp.h | ||
| 110 | header-y += limits.h | 222 | header-y += limits.h |
| 223 | header-y += llc.h | ||
| 224 | header-y += loop.h | ||
| 225 | header-y += lp.h | ||
| 111 | header-y += magic.h | 226 | header-y += magic.h |
| 112 | header-y += major.h | 227 | header-y += major.h |
| 113 | header-y += map_to_7segment.h | 228 | header-y += map_to_7segment.h |
| 114 | header-y += matroxfb.h | 229 | header-y += matroxfb.h |
| 230 | header-y += mempolicy.h | ||
| 115 | header-y += meye.h | 231 | header-y += meye.h |
| 232 | header-y += mii.h | ||
| 116 | header-y += minix_fs.h | 233 | header-y += minix_fs.h |
| 234 | header-y += mman.h | ||
| 117 | header-y += mmtimer.h | 235 | header-y += mmtimer.h |
| 118 | header-y += mqueue.h | 236 | header-y += mqueue.h |
| 237 | header-y += mroute.h | ||
| 238 | header-y += mroute6.h | ||
| 239 | header-y += msdos_fs.h | ||
| 240 | header-y += msg.h | ||
| 119 | header-y += mtio.h | 241 | header-y += mtio.h |
| 242 | header-y += n_r3964.h | ||
| 243 | header-y += nbd.h | ||
| 244 | header-y += ncp.h | ||
| 245 | header-y += ncp_fs.h | ||
| 246 | header-y += ncp_mount.h | ||
| 120 | header-y += ncp_no.h | 247 | header-y += ncp_no.h |
| 121 | header-y += neighbour.h | 248 | header-y += neighbour.h |
| 249 | header-y += net.h | ||
| 122 | header-y += net_dropmon.h | 250 | header-y += net_dropmon.h |
| 123 | header-y += net_tstamp.h | 251 | header-y += net_tstamp.h |
| 252 | header-y += netdevice.h | ||
| 253 | header-y += netfilter.h | ||
| 124 | header-y += netfilter_arp.h | 254 | header-y += netfilter_arp.h |
| 255 | header-y += netfilter_bridge.h | ||
| 256 | header-y += netfilter_decnet.h | ||
| 257 | header-y += netfilter_ipv4.h | ||
| 258 | header-y += netfilter_ipv6.h | ||
| 259 | header-y += netlink.h | ||
| 125 | header-y += netrom.h | 260 | header-y += netrom.h |
| 261 | header-y += nfs.h | ||
| 126 | header-y += nfs2.h | 262 | header-y += nfs2.h |
| 263 | header-y += nfs3.h | ||
| 264 | header-y += nfs4.h | ||
| 127 | header-y += nfs4_mount.h | 265 | header-y += nfs4_mount.h |
| 266 | header-y += nfs_fs.h | ||
| 267 | header-y += nfs_idmap.h | ||
| 128 | header-y += nfs_mount.h | 268 | header-y += nfs_mount.h |
| 269 | header-y += nfsacl.h | ||
| 129 | header-y += nl80211.h | 270 | header-y += nl80211.h |
| 271 | header-y += nubus.h | ||
| 272 | header-y += nvram.h | ||
| 130 | header-y += omapfb.h | 273 | header-y += omapfb.h |
| 274 | header-y += oom.h | ||
| 131 | header-y += param.h | 275 | header-y += param.h |
| 276 | header-y += parport.h | ||
| 277 | header-y += patchkey.h | ||
| 278 | header-y += pci.h | ||
| 132 | header-y += pci_regs.h | 279 | header-y += pci_regs.h |
| 133 | header-y += perf_event.h | 280 | header-y += perf_event.h |
| 281 | header-y += personality.h | ||
| 134 | header-y += pfkeyv2.h | 282 | header-y += pfkeyv2.h |
| 135 | header-y += pg.h | 283 | header-y += pg.h |
| 136 | header-y += phantom.h | 284 | header-y += phantom.h |
| 137 | header-y += phonet.h | 285 | header-y += phonet.h |
| 138 | header-y += pkt_cls.h | 286 | header-y += pkt_cls.h |
| 139 | header-y += pkt_sched.h | 287 | header-y += pkt_sched.h |
| 288 | header-y += pktcdvd.h | ||
| 289 | header-y += pmu.h | ||
| 290 | header-y += poll.h | ||
| 140 | header-y += posix_types.h | 291 | header-y += posix_types.h |
| 141 | header-y += ppdev.h | 292 | header-y += ppdev.h |
| 293 | header-y += ppp-comp.h | ||
| 294 | header-y += ppp_defs.h | ||
| 295 | header-y += pps.h | ||
| 142 | header-y += prctl.h | 296 | header-y += prctl.h |
| 143 | header-y += qnxtypes.h | 297 | header-y += ptrace.h |
| 144 | header-y += qnx4_fs.h | 298 | header-y += qnx4_fs.h |
| 299 | header-y += qnxtypes.h | ||
| 300 | header-y += quota.h | ||
| 145 | header-y += radeonfb.h | 301 | header-y += radeonfb.h |
| 302 | header-y += random.h | ||
| 146 | header-y += raw.h | 303 | header-y += raw.h |
| 304 | header-y += rds.h | ||
| 305 | header-y += reboot.h | ||
| 306 | header-y += reiserfs_fs.h | ||
| 307 | header-y += reiserfs_xattr.h | ||
| 147 | header-y += resource.h | 308 | header-y += resource.h |
| 309 | header-y += rfkill.h | ||
| 148 | header-y += romfs_fs.h | 310 | header-y += romfs_fs.h |
| 149 | header-y += rose.h | 311 | header-y += rose.h |
| 312 | header-y += route.h | ||
| 313 | header-y += rtc.h | ||
| 314 | header-y += rtnetlink.h | ||
| 315 | header-y += scc.h | ||
| 316 | header-y += sched.h | ||
| 317 | header-y += screen_info.h | ||
| 318 | header-y += sdla.h | ||
| 319 | header-y += securebits.h | ||
| 320 | header-y += selinux_netlink.h | ||
| 321 | header-y += sem.h | ||
| 322 | header-y += serial.h | ||
| 323 | header-y += serial_core.h | ||
| 150 | header-y += serial_reg.h | 324 | header-y += serial_reg.h |
| 151 | header-y += smbno.h | 325 | header-y += serio.h |
| 326 | header-y += shm.h | ||
| 327 | header-y += signal.h | ||
| 328 | header-y += signalfd.h | ||
| 152 | header-y += snmp.h | 329 | header-y += snmp.h |
| 330 | header-y += socket.h | ||
| 153 | header-y += sockios.h | 331 | header-y += sockios.h |
| 154 | header-y += som.h | 332 | header-y += som.h |
| 333 | header-y += sonet.h | ||
| 334 | header-y += sonypi.h | ||
| 155 | header-y += sound.h | 335 | header-y += sound.h |
| 336 | header-y += soundcard.h | ||
| 337 | header-y += stat.h | ||
| 338 | header-y += stddef.h | ||
| 339 | header-y += string.h | ||
| 156 | header-y += suspend_ioctls.h | 340 | header-y += suspend_ioctls.h |
| 341 | header-y += swab.h | ||
| 342 | header-y += synclink.h | ||
| 343 | header-y += sysctl.h | ||
| 157 | header-y += taskstats.h | 344 | header-y += taskstats.h |
| 345 | header-y += tcp.h | ||
| 158 | header-y += telephony.h | 346 | header-y += telephony.h |
| 159 | header-y += termios.h | 347 | header-y += termios.h |
| 348 | header-y += time.h | ||
| 160 | header-y += times.h | 349 | header-y += times.h |
| 350 | header-y += timex.h | ||
| 161 | header-y += tiocl.h | 351 | header-y += tiocl.h |
| 162 | header-y += tipc.h | 352 | header-y += tipc.h |
| 163 | header-y += tipc_config.h | 353 | header-y += tipc_config.h |
| 164 | header-y += toshiba.h | 354 | header-y += toshiba.h |
| 355 | header-y += tty.h | ||
| 356 | header-y += types.h | ||
| 165 | header-y += udf_fs_i.h | 357 | header-y += udf_fs_i.h |
| 358 | header-y += udp.h | ||
| 359 | header-y += uinput.h | ||
| 360 | header-y += uio.h | ||
| 166 | header-y += ultrasound.h | 361 | header-y += ultrasound.h |
| 167 | header-y += un.h | 362 | header-y += un.h |
| 363 | header-y += unistd.h | ||
| 364 | header-y += usbdevice_fs.h | ||
| 168 | header-y += utime.h | 365 | header-y += utime.h |
| 366 | header-y += utsname.h | ||
| 169 | header-y += veth.h | 367 | header-y += veth.h |
| 170 | header-y += videotext.h | 368 | header-y += vhost.h |
| 171 | header-y += x25.h | 369 | header-y += videodev.h |
| 172 | 370 | header-y += videodev2.h | |
| 173 | unifdef-y += acct.h | 371 | header-y += virtio_9p.h |
| 174 | unifdef-y += adb.h | 372 | header-y += virtio_balloon.h |
| 175 | unifdef-y += adfs_fs.h | 373 | header-y += virtio_blk.h |
| 176 | unifdef-y += agpgart.h | 374 | header-y += virtio_config.h |
| 177 | ifneq ($(wildcard $(srctree)/arch/$(SRCARCH)/include/asm/a.out.h \ | 375 | header-y += virtio_console.h |
| 178 | $(srctree)/include/asm-$(SRCARCH)/a.out.h),) | 376 | header-y += virtio_ids.h |
| 179 | unifdef-y += a.out.h | 377 | header-y += virtio_net.h |
| 180 | endif | 378 | header-y += virtio_pci.h |
| 181 | unifdef-y += apm_bios.h | 379 | header-y += virtio_ring.h |
| 182 | unifdef-y += atalk.h | 380 | header-y += virtio_rng.h |
| 183 | unifdef-y += atmdev.h | 381 | header-y += vt.h |
| 184 | unifdef-y += atm.h | 382 | header-y += wait.h |
| 185 | unifdef-y += atm_tcp.h | 383 | header-y += wanrouter.h |
| 186 | unifdef-y += audit.h | 384 | header-y += watchdog.h |
| 187 | unifdef-y += auto_fs.h | ||
| 188 | unifdef-y += auxvec.h | ||
| 189 | unifdef-y += binfmts.h | ||
| 190 | unifdef-y += blktrace_api.h | ||
| 191 | unifdef-y += capability.h | ||
| 192 | unifdef-y += capi.h | ||
| 193 | unifdef-y += cciss_ioctl.h | ||
| 194 | unifdef-y += cdrom.h | ||
| 195 | unifdef-y += cm4000_cs.h | ||
| 196 | unifdef-y += cn_proc.h | ||
| 197 | unifdef-y += coda.h | ||
| 198 | unifdef-y += connector.h | ||
| 199 | unifdef-y += cuda.h | ||
| 200 | unifdef-y += cyclades.h | ||
| 201 | unifdef-y += dccp.h | ||
| 202 | unifdef-y += dlm.h | ||
| 203 | unifdef-y += dlm_plock.h | ||
| 204 | unifdef-y += edd.h | ||
| 205 | unifdef-y += elf.h | ||
| 206 | unifdef-y += elfcore.h | ||
| 207 | unifdef-y += errno.h | ||
| 208 | unifdef-y += errqueue.h | ||
| 209 | unifdef-y += ethtool.h | ||
| 210 | unifdef-y += eventpoll.h | ||
| 211 | unifdef-y += signalfd.h | ||
| 212 | unifdef-y += ext2_fs.h | ||
| 213 | unifdef-y += fb.h | ||
| 214 | unifdef-y += fcntl.h | ||
| 215 | unifdef-y += filter.h | ||
| 216 | unifdef-y += flat.h | ||
| 217 | unifdef-y += futex.h | ||
| 218 | unifdef-y += fs.h | ||
| 219 | unifdef-y += gameport.h | ||
| 220 | unifdef-y += generic_serial.h | ||
| 221 | unifdef-y += hdlcdrv.h | ||
| 222 | unifdef-y += hdlc.h | ||
| 223 | unifdef-y += hdreg.h | ||
| 224 | unifdef-y += hid.h | ||
| 225 | unifdef-y += hiddev.h | ||
| 226 | unifdef-y += hidraw.h | ||
| 227 | unifdef-y += hpet.h | ||
| 228 | unifdef-y += i2c.h | ||
| 229 | unifdef-y += i2c-dev.h | ||
| 230 | unifdef-y += icmp.h | ||
| 231 | unifdef-y += icmpv6.h | ||
| 232 | unifdef-y += if_addr.h | ||
| 233 | unifdef-y += if_arp.h | ||
| 234 | unifdef-y += if_bridge.h | ||
| 235 | unifdef-y += if_ec.h | ||
| 236 | unifdef-y += if_eql.h | ||
| 237 | unifdef-y += if_ether.h | ||
| 238 | unifdef-y += if_fddi.h | ||
| 239 | unifdef-y += if_frad.h | ||
| 240 | unifdef-y += if_ltalk.h | ||
| 241 | unifdef-y += if_link.h | ||
| 242 | unifdef-y += if_phonet.h | ||
| 243 | unifdef-y += if_pppol2tp.h | ||
| 244 | unifdef-y += if_pppox.h | ||
| 245 | unifdef-y += if_tr.h | ||
| 246 | unifdef-y += if_tunnel.h | ||
| 247 | unifdef-y += if_vlan.h | ||
| 248 | unifdef-y += igmp.h | ||
| 249 | unifdef-y += inet_diag.h | ||
| 250 | unifdef-y += in.h | ||
| 251 | unifdef-y += in6.h | ||
| 252 | unifdef-y += inotify.h | ||
| 253 | unifdef-y += input.h | ||
| 254 | unifdef-y += ip.h | ||
| 255 | unifdef-y += ipc.h | ||
| 256 | unifdef-y += ipmi.h | ||
| 257 | unifdef-y += ipv6.h | ||
| 258 | unifdef-y += ipv6_route.h | ||
| 259 | unifdef-y += isdn.h | ||
| 260 | unifdef-y += isdnif.h | ||
| 261 | unifdef-y += isdn_divertif.h | ||
| 262 | unifdef-y += isdn_ppp.h | ||
| 263 | unifdef-y += ivtv.h | ||
| 264 | unifdef-y += ivtvfb.h | ||
| 265 | unifdef-y += joystick.h | ||
| 266 | unifdef-y += kdev_t.h | ||
| 267 | unifdef-y += kd.h | ||
| 268 | unifdef-y += kernelcapi.h | ||
| 269 | unifdef-y += kernel.h | ||
| 270 | unifdef-y += keyboard.h | ||
| 271 | ifneq ($(wildcard $(srctree)/arch/$(SRCARCH)/include/asm/kvm.h \ | ||
| 272 | $(srctree)/include/asm-$(SRCARCH)/kvm.h),) | ||
| 273 | unifdef-y += kvm.h | ||
| 274 | endif | ||
| 275 | ifneq ($(wildcard $(srctree)/arch/$(SRCARCH)/include/asm/kvm_para.h \ | ||
| 276 | $(srctree)/include/asm-$(SRCARCH)/kvm_para.h),) | ||
| 277 | unifdef-y += kvm_para.h | ||
| 278 | endif | ||
| 279 | unifdef-y += llc.h | ||
| 280 | unifdef-y += loop.h | ||
| 281 | unifdef-y += lp.h | ||
| 282 | unifdef-y += mempolicy.h | ||
| 283 | unifdef-y += mii.h | ||
| 284 | unifdef-y += mman.h | ||
| 285 | unifdef-y += mroute.h | ||
| 286 | unifdef-y += mroute6.h | ||
| 287 | unifdef-y += msdos_fs.h | ||
| 288 | unifdef-y += msg.h | ||
| 289 | unifdef-y += nbd.h | ||
| 290 | unifdef-y += ncp_fs.h | ||
| 291 | unifdef-y += ncp.h | ||
| 292 | unifdef-y += ncp_mount.h | ||
| 293 | unifdef-y += netdevice.h | ||
| 294 | unifdef-y += netfilter_bridge.h | ||
| 295 | unifdef-y += netfilter_decnet.h | ||
| 296 | unifdef-y += netfilter.h | ||
| 297 | unifdef-y += netfilter_ipv4.h | ||
| 298 | unifdef-y += netfilter_ipv6.h | ||
| 299 | unifdef-y += net.h | ||
| 300 | unifdef-y += netlink.h | ||
| 301 | unifdef-y += nfs3.h | ||
| 302 | unifdef-y += nfs4.h | ||
| 303 | unifdef-y += nfsacl.h | ||
| 304 | unifdef-y += nfs_fs.h | ||
| 305 | unifdef-y += nfs.h | ||
| 306 | unifdef-y += nfs_idmap.h | ||
| 307 | unifdef-y += n_r3964.h | ||
| 308 | unifdef-y += nubus.h | ||
| 309 | unifdef-y += nvram.h | ||
| 310 | unifdef-y += oom.h | ||
| 311 | unifdef-y += parport.h | ||
| 312 | unifdef-y += patchkey.h | ||
| 313 | unifdef-y += pci.h | ||
| 314 | unifdef-y += personality.h | ||
| 315 | unifdef-y += pktcdvd.h | ||
| 316 | unifdef-y += pmu.h | ||
| 317 | unifdef-y += poll.h | ||
| 318 | unifdef-y += ppp_defs.h | ||
| 319 | unifdef-y += ppp-comp.h | ||
| 320 | unifdef-y += pps.h | ||
| 321 | unifdef-y += ptrace.h | ||
| 322 | unifdef-y += quota.h | ||
| 323 | unifdef-y += random.h | ||
| 324 | unifdef-y += rfkill.h | ||
| 325 | unifdef-y += irqnr.h | ||
| 326 | unifdef-y += reboot.h | ||
| 327 | unifdef-y += reiserfs_fs.h | ||
| 328 | unifdef-y += reiserfs_xattr.h | ||
| 329 | unifdef-y += route.h | ||
| 330 | unifdef-y += rtc.h | ||
| 331 | unifdef-y += rtnetlink.h | ||
| 332 | unifdef-y += scc.h | ||
| 333 | unifdef-y += sched.h | ||
| 334 | unifdef-y += screen_info.h | ||
| 335 | unifdef-y += sdla.h | ||
| 336 | unifdef-y += securebits.h | ||
| 337 | unifdef-y += selinux_netlink.h | ||
| 338 | unifdef-y += sem.h | ||
| 339 | unifdef-y += serial_core.h | ||
| 340 | unifdef-y += serial.h | ||
| 341 | unifdef-y += serio.h | ||
| 342 | unifdef-y += shm.h | ||
| 343 | unifdef-y += signal.h | ||
| 344 | unifdef-y += smb_fs.h | ||
| 345 | unifdef-y += smb.h | ||
| 346 | unifdef-y += smb_mount.h | ||
| 347 | unifdef-y += socket.h | ||
| 348 | unifdef-y += sonet.h | ||
| 349 | unifdef-y += sonypi.h | ||
| 350 | unifdef-y += soundcard.h | ||
| 351 | unifdef-y += stat.h | ||
| 352 | unifdef-y += stddef.h | ||
| 353 | unifdef-y += string.h | ||
| 354 | unifdef-y += swab.h | ||
| 355 | unifdef-y += synclink.h | ||
| 356 | unifdef-y += sysctl.h | ||
| 357 | unifdef-y += tcp.h | ||
| 358 | unifdef-y += time.h | ||
| 359 | unifdef-y += timex.h | ||
| 360 | unifdef-y += tty.h | ||
| 361 | unifdef-y += types.h | ||
| 362 | unifdef-y += udp.h | ||
| 363 | unifdef-y += uinput.h | ||
| 364 | unifdef-y += uio.h | ||
| 365 | unifdef-y += unistd.h | ||
| 366 | unifdef-y += usbdevice_fs.h | ||
| 367 | unifdef-y += utsname.h | ||
| 368 | unifdef-y += vhost.h | ||
| 369 | unifdef-y += videodev2.h | ||
| 370 | unifdef-y += videodev.h | ||
| 371 | unifdef-y += virtio_config.h | ||
| 372 | unifdef-y += virtio_ids.h | ||
| 373 | unifdef-y += virtio_blk.h | ||
| 374 | unifdef-y += virtio_net.h | ||
| 375 | unifdef-y += virtio_9p.h | ||
| 376 | unifdef-y += virtio_balloon.h | ||
| 377 | unifdef-y += virtio_console.h | ||
| 378 | unifdef-y += virtio_pci.h | ||
| 379 | unifdef-y += virtio_ring.h | ||
| 380 | unifdef-y += virtio_rng.h | ||
| 381 | unifdef-y += vt.h | ||
| 382 | unifdef-y += wait.h | ||
| 383 | unifdef-y += wanrouter.h | ||
| 384 | unifdef-y += watchdog.h | ||
| 385 | unifdef-y += wireless.h | ||
| 386 | unifdef-y += xattr.h | ||
| 387 | unifdef-y += xfrm.h | ||
| 388 | |||
| 389 | objhdr-y += version.h | ||
| 390 | header-y += wimax.h | 385 | header-y += wimax.h |
| 391 | header-y += wimax/ | 386 | header-y += wireless.h |
| 387 | header-y += x25.h | ||
| 388 | header-y += xattr.h | ||
| 389 | header-y += xfrm.h | ||
diff --git a/include/linux/acpi.h b/include/linux/acpi.h index ccf94dc5acdf..050a7bccb836 100644 --- a/include/linux/acpi.h +++ b/include/linux/acpi.h | |||
| @@ -245,8 +245,6 @@ int acpi_check_resource_conflict(const struct resource *res); | |||
| 245 | 245 | ||
| 246 | int acpi_check_region(resource_size_t start, resource_size_t n, | 246 | int acpi_check_region(resource_size_t start, resource_size_t n, |
| 247 | const char *name); | 247 | const char *name); |
| 248 | int acpi_check_mem_region(resource_size_t start, resource_size_t n, | ||
| 249 | const char *name); | ||
| 250 | 248 | ||
| 251 | int acpi_resources_are_enforced(void); | 249 | int acpi_resources_are_enforced(void); |
| 252 | 250 | ||
| @@ -304,10 +302,13 @@ acpi_status acpi_run_osc(acpi_handle handle, struct acpi_osc_context *context); | |||
| 304 | OSC_PCI_EXPRESS_PME_CONTROL | \ | 302 | OSC_PCI_EXPRESS_PME_CONTROL | \ |
| 305 | OSC_PCI_EXPRESS_AER_CONTROL | \ | 303 | OSC_PCI_EXPRESS_AER_CONTROL | \ |
| 306 | OSC_PCI_EXPRESS_CAP_STRUCTURE_CONTROL) | 304 | OSC_PCI_EXPRESS_CAP_STRUCTURE_CONTROL) |
| 307 | 305 | extern acpi_status acpi_pci_osc_control_set(acpi_handle handle, | |
| 308 | extern acpi_status acpi_pci_osc_control_set(acpi_handle handle, u32 flags); | 306 | u32 *mask, u32 req); |
| 309 | extern void acpi_early_init(void); | 307 | extern void acpi_early_init(void); |
| 310 | 308 | ||
| 309 | int acpi_os_map_generic_address(struct acpi_generic_address *addr); | ||
| 310 | void acpi_os_unmap_generic_address(struct acpi_generic_address *addr); | ||
| 311 | |||
| 311 | #else /* !CONFIG_ACPI */ | 312 | #else /* !CONFIG_ACPI */ |
| 312 | 313 | ||
| 313 | #define acpi_disabled 1 | 314 | #define acpi_disabled 1 |
| @@ -344,12 +345,6 @@ static inline int acpi_check_region(resource_size_t start, resource_size_t n, | |||
| 344 | return 0; | 345 | return 0; |
| 345 | } | 346 | } |
| 346 | 347 | ||
| 347 | static inline int acpi_check_mem_region(resource_size_t start, | ||
| 348 | resource_size_t n, const char *name) | ||
| 349 | { | ||
| 350 | return 0; | ||
| 351 | } | ||
| 352 | |||
| 353 | struct acpi_table_header; | 348 | struct acpi_table_header; |
| 354 | static inline int acpi_table_parse(char *id, | 349 | static inline int acpi_table_parse(char *id, |
| 355 | int (*handler)(struct acpi_table_header *)) | 350 | int (*handler)(struct acpi_table_header *)) |
diff --git a/include/linux/acpi_pmtmr.h b/include/linux/acpi_pmtmr.h index 7e3d2859be50..1d0ef1ae8036 100644 --- a/include/linux/acpi_pmtmr.h +++ b/include/linux/acpi_pmtmr.h | |||
| @@ -25,8 +25,6 @@ static inline u32 acpi_pm_read_early(void) | |||
| 25 | return acpi_pm_read_verified() & ACPI_PM_MASK; | 25 | return acpi_pm_read_verified() & ACPI_PM_MASK; |
| 26 | } | 26 | } |
| 27 | 27 | ||
| 28 | extern void pmtimer_wait(unsigned); | ||
| 29 | |||
| 30 | #else | 28 | #else |
| 31 | 29 | ||
| 32 | static inline u32 acpi_pm_read_early(void) | 30 | static inline u32 acpi_pm_read_early(void) |
diff --git a/include/linux/ahci_platform.h b/include/linux/ahci_platform.h index f7dd576dd5a4..be3d9a77d6ed 100644 --- a/include/linux/ahci_platform.h +++ b/include/linux/ahci_platform.h | |||
| @@ -15,11 +15,13 @@ | |||
| 15 | #ifndef _AHCI_PLATFORM_H | 15 | #ifndef _AHCI_PLATFORM_H |
| 16 | #define _AHCI_PLATFORM_H | 16 | #define _AHCI_PLATFORM_H |
| 17 | 17 | ||
| 18 | #include <linux/compiler.h> | ||
| 19 | |||
| 18 | struct device; | 20 | struct device; |
| 19 | struct ata_port_info; | 21 | struct ata_port_info; |
| 20 | 22 | ||
| 21 | struct ahci_platform_data { | 23 | struct ahci_platform_data { |
| 22 | int (*init)(struct device *dev); | 24 | int (*init)(struct device *dev, void __iomem *addr); |
| 23 | void (*exit)(struct device *dev); | 25 | void (*exit)(struct device *dev); |
| 24 | const struct ata_port_info *ata_port_info; | 26 | const struct ata_port_info *ata_port_info; |
| 25 | unsigned int force_port_map; | 27 | unsigned int force_port_map; |
diff --git a/include/linux/altera_uart.h b/include/linux/altera_uart.h index 8d441064a30d..a10a90791976 100644 --- a/include/linux/altera_uart.h +++ b/include/linux/altera_uart.h | |||
| @@ -5,10 +5,15 @@ | |||
| 5 | #ifndef __ALTUART_H | 5 | #ifndef __ALTUART_H |
| 6 | #define __ALTUART_H | 6 | #define __ALTUART_H |
| 7 | 7 | ||
| 8 | #include <linux/init.h> | ||
| 9 | |||
| 8 | struct altera_uart_platform_uart { | 10 | struct altera_uart_platform_uart { |
| 9 | unsigned long mapbase; /* Physical address base */ | 11 | unsigned long mapbase; /* Physical address base */ |
| 10 | unsigned int irq; /* Interrupt vector */ | 12 | unsigned int irq; /* Interrupt vector */ |
| 11 | unsigned int uartclk; /* UART clock rate */ | 13 | unsigned int uartclk; /* UART clock rate */ |
| 14 | unsigned int bus_shift; /* Bus shift (address stride) */ | ||
| 12 | }; | 15 | }; |
| 13 | 16 | ||
| 17 | int __init early_altera_uart_setup(struct altera_uart_platform_uart *platp); | ||
| 18 | |||
| 14 | #endif /* __ALTUART_H */ | 19 | #endif /* __ALTUART_H */ |
diff --git a/include/linux/amba/bus.h b/include/linux/amba/bus.h index 8b1038607831..c6454cca0447 100644 --- a/include/linux/amba/bus.h +++ b/include/linux/amba/bus.h | |||
| @@ -14,14 +14,20 @@ | |||
| 14 | #ifndef ASMARM_AMBA_H | 14 | #ifndef ASMARM_AMBA_H |
| 15 | #define ASMARM_AMBA_H | 15 | #define ASMARM_AMBA_H |
| 16 | 16 | ||
| 17 | #include <linux/clk.h> | ||
| 17 | #include <linux/device.h> | 18 | #include <linux/device.h> |
| 19 | #include <linux/err.h> | ||
| 18 | #include <linux/resource.h> | 20 | #include <linux/resource.h> |
| 19 | 21 | ||
| 20 | #define AMBA_NR_IRQS 2 | 22 | #define AMBA_NR_IRQS 2 |
| 23 | #define AMBA_CID 0xb105f00d | ||
| 24 | |||
| 25 | struct clk; | ||
| 21 | 26 | ||
| 22 | struct amba_device { | 27 | struct amba_device { |
| 23 | struct device dev; | 28 | struct device dev; |
| 24 | struct resource res; | 29 | struct resource res; |
| 30 | struct clk *pclk; | ||
| 25 | u64 dma_mask; | 31 | u64 dma_mask; |
| 26 | unsigned int periphid; | 32 | unsigned int periphid; |
| 27 | unsigned int irq[AMBA_NR_IRQS]; | 33 | unsigned int irq[AMBA_NR_IRQS]; |
| @@ -59,9 +65,21 @@ struct amba_device *amba_find_device(const char *, struct device *, unsigned int | |||
| 59 | int amba_request_regions(struct amba_device *, const char *); | 65 | int amba_request_regions(struct amba_device *, const char *); |
| 60 | void amba_release_regions(struct amba_device *); | 66 | void amba_release_regions(struct amba_device *); |
| 61 | 67 | ||
| 62 | #define amba_config(d) (((d)->periphid >> 24) & 0xff) | 68 | #define amba_pclk_enable(d) \ |
| 63 | #define amba_rev(d) (((d)->periphid >> 20) & 0x0f) | 69 | (IS_ERR((d)->pclk) ? 0 : clk_enable((d)->pclk)) |
| 64 | #define amba_manf(d) (((d)->periphid >> 12) & 0xff) | 70 | |
| 65 | #define amba_part(d) ((d)->periphid & 0xfff) | 71 | #define amba_pclk_disable(d) \ |
| 72 | do { if (!IS_ERR((d)->pclk)) clk_disable((d)->pclk); } while (0) | ||
| 73 | |||
| 74 | /* Some drivers don't use the struct amba_device */ | ||
| 75 | #define AMBA_CONFIG_BITS(a) (((a) >> 24) & 0xff) | ||
| 76 | #define AMBA_REV_BITS(a) (((a) >> 20) & 0x0f) | ||
| 77 | #define AMBA_MANF_BITS(a) (((a) >> 12) & 0xff) | ||
| 78 | #define AMBA_PART_BITS(a) ((a) & 0xfff) | ||
| 79 | |||
| 80 | #define amba_config(d) AMBA_CONFIG_BITS((d)->periphid) | ||
| 81 | #define amba_rev(d) AMBA_REV_BITS((d)->periphid) | ||
| 82 | #define amba_manf(d) AMBA_MANF_BITS((d)->periphid) | ||
| 83 | #define amba_part(d) AMBA_PART_BITS((d)->periphid) | ||
| 66 | 84 | ||
| 67 | #endif | 85 | #endif |
diff --git a/include/linux/amba/clcd.h b/include/linux/amba/clcd.h index ca16c3801a1e..be33b3affc8a 100644 --- a/include/linux/amba/clcd.h +++ b/include/linux/amba/clcd.h | |||
| @@ -150,6 +150,7 @@ struct clcd_fb { | |||
| 150 | u16 off_cntl; | 150 | u16 off_cntl; |
| 151 | u32 clcd_cntl; | 151 | u32 clcd_cntl; |
| 152 | u32 cmap[16]; | 152 | u32 cmap[16]; |
| 153 | bool clk_enabled; | ||
| 153 | }; | 154 | }; |
| 154 | 155 | ||
| 155 | static inline void clcdfb_decode(struct clcd_fb *fb, struct clcd_regs *regs) | 156 | static inline void clcdfb_decode(struct clcd_fb *fb, struct clcd_regs *regs) |
diff --git a/include/linux/amba/mmci.h b/include/linux/amba/mmci.h index 7e466fe72025..f4ee9acc9721 100644 --- a/include/linux/amba/mmci.h +++ b/include/linux/amba/mmci.h | |||
| @@ -15,24 +15,28 @@ | |||
| 15 | * @ocr_mask: available voltages on the 4 pins from the block, this | 15 | * @ocr_mask: available voltages on the 4 pins from the block, this |
| 16 | * is ignored if a regulator is used, see the MMC_VDD_* masks in | 16 | * is ignored if a regulator is used, see the MMC_VDD_* masks in |
| 17 | * mmc/host.h | 17 | * mmc/host.h |
| 18 | * @translate_vdd: a callback function to translate a MMC_VDD_* | 18 | * @vdd_handler: a callback function to translate a MMC_VDD_* |
| 19 | * mask into a value to be binary or:ed and written into the | 19 | * mask into a value to be binary (or set some other custom bits |
| 20 | * MMCIPWR register of the block | 20 | * in MMCIPWR) or:ed and written into the MMCIPWR register of the |
| 21 | * block. May also control external power based on the power_mode. | ||
| 21 | * @status: if no GPIO read function was given to the block in | 22 | * @status: if no GPIO read function was given to the block in |
| 22 | * gpio_wp (below) this function will be called to determine | 23 | * gpio_wp (below) this function will be called to determine |
| 23 | * whether a card is present in the MMC slot or not | 24 | * whether a card is present in the MMC slot or not |
| 24 | * @gpio_wp: read this GPIO pin to see if the card is write protected | 25 | * @gpio_wp: read this GPIO pin to see if the card is write protected |
| 25 | * @gpio_cd: read this GPIO pin to detect card insertion | 26 | * @gpio_cd: read this GPIO pin to detect card insertion |
| 27 | * @cd_invert: true if the gpio_cd pin value is active low | ||
| 26 | * @capabilities: the capabilities of the block as implemented in | 28 | * @capabilities: the capabilities of the block as implemented in |
| 27 | * this platform, signify anything MMC_CAP_* from mmc/host.h | 29 | * this platform, signify anything MMC_CAP_* from mmc/host.h |
| 28 | */ | 30 | */ |
| 29 | struct mmci_platform_data { | 31 | struct mmci_platform_data { |
| 30 | unsigned int f_max; | 32 | unsigned int f_max; |
| 31 | unsigned int ocr_mask; | 33 | unsigned int ocr_mask; |
| 32 | u32 (*translate_vdd)(struct device *, unsigned int); | 34 | u32 (*vdd_handler)(struct device *, unsigned int vdd, |
| 35 | unsigned char power_mode); | ||
| 33 | unsigned int (*status)(struct device *); | 36 | unsigned int (*status)(struct device *); |
| 34 | int gpio_wp; | 37 | int gpio_wp; |
| 35 | int gpio_cd; | 38 | int gpio_cd; |
| 39 | bool cd_invert; | ||
| 36 | unsigned long capabilities; | 40 | unsigned long capabilities; |
| 37 | }; | 41 | }; |
| 38 | 42 | ||
diff --git a/include/linux/amba/pl022.h b/include/linux/amba/pl022.h index abf26cc47a2b..4ce98f54186b 100644 --- a/include/linux/amba/pl022.h +++ b/include/linux/amba/pl022.h | |||
| @@ -228,6 +228,7 @@ enum ssp_chip_select { | |||
| 228 | }; | 228 | }; |
| 229 | 229 | ||
| 230 | 230 | ||
| 231 | struct dma_chan; | ||
| 231 | /** | 232 | /** |
| 232 | * struct pl022_ssp_master - device.platform_data for SPI controller devices. | 233 | * struct pl022_ssp_master - device.platform_data for SPI controller devices. |
| 233 | * @num_chipselect: chipselects are used to distinguish individual | 234 | * @num_chipselect: chipselects are used to distinguish individual |
| @@ -235,11 +236,16 @@ enum ssp_chip_select { | |||
| 235 | * each slave has a chipselect signal, but it's common that not | 236 | * each slave has a chipselect signal, but it's common that not |
| 236 | * every chipselect is connected to a slave. | 237 | * every chipselect is connected to a slave. |
| 237 | * @enable_dma: if true enables DMA driven transfers. | 238 | * @enable_dma: if true enables DMA driven transfers. |
| 239 | * @dma_rx_param: parameter to locate an RX DMA channel. | ||
| 240 | * @dma_tx_param: parameter to locate a TX DMA channel. | ||
| 238 | */ | 241 | */ |
| 239 | struct pl022_ssp_controller { | 242 | struct pl022_ssp_controller { |
| 240 | u16 bus_id; | 243 | u16 bus_id; |
| 241 | u8 num_chipselect; | 244 | u8 num_chipselect; |
| 242 | u8 enable_dma:1; | 245 | u8 enable_dma:1; |
| 246 | bool (*dma_filter)(struct dma_chan *chan, void *filter_param); | ||
| 247 | void *dma_rx_param; | ||
| 248 | void *dma_tx_param; | ||
| 243 | }; | 249 | }; |
| 244 | 250 | ||
| 245 | /** | 251 | /** |
| @@ -270,20 +276,13 @@ struct pl022_ssp_controller { | |||
| 270 | * @dma_config: DMA configuration for SSP controller and peripheral | 276 | * @dma_config: DMA configuration for SSP controller and peripheral |
| 271 | */ | 277 | */ |
| 272 | struct pl022_config_chip { | 278 | struct pl022_config_chip { |
| 273 | struct device *dev; | ||
| 274 | enum ssp_loopback lbm; | ||
| 275 | enum ssp_interface iface; | 279 | enum ssp_interface iface; |
| 276 | enum ssp_hierarchy hierarchy; | 280 | enum ssp_hierarchy hierarchy; |
| 277 | bool slave_tx_disable; | 281 | bool slave_tx_disable; |
| 278 | struct ssp_clock_params clk_freq; | 282 | struct ssp_clock_params clk_freq; |
| 279 | enum ssp_rx_endian endian_rx; | ||
| 280 | enum ssp_tx_endian endian_tx; | ||
| 281 | enum ssp_data_size data_size; | ||
| 282 | enum ssp_mode com_mode; | 283 | enum ssp_mode com_mode; |
| 283 | enum ssp_rx_level_trig rx_lev_trig; | 284 | enum ssp_rx_level_trig rx_lev_trig; |
| 284 | enum ssp_tx_level_trig tx_lev_trig; | 285 | enum ssp_tx_level_trig tx_lev_trig; |
| 285 | enum ssp_spi_clk_phase clk_phase; | ||
| 286 | enum ssp_spi_clk_pol clk_pol; | ||
| 287 | enum ssp_microwire_ctrl_len ctrl_len; | 286 | enum ssp_microwire_ctrl_len ctrl_len; |
| 288 | enum ssp_microwire_wait_state wait_state; | 287 | enum ssp_microwire_wait_state wait_state; |
| 289 | enum ssp_duplex duplex; | 288 | enum ssp_duplex duplex; |
diff --git a/include/linux/amba/pl08x.h b/include/linux/amba/pl08x.h new file mode 100644 index 000000000000..521a0f8974ac --- /dev/null +++ b/include/linux/amba/pl08x.h | |||
| @@ -0,0 +1,222 @@ | |||
| 1 | /* | ||
| 2 | * linux/amba/pl08x.h - ARM PrimeCell DMA Controller driver | ||
| 3 | * | ||
| 4 | * Copyright (C) 2005 ARM Ltd | ||
| 5 | * Copyright (C) 2010 ST-Ericsson SA | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License version 2 as | ||
| 9 | * published by the Free Software Foundation. | ||
| 10 | * | ||
| 11 | * pl08x information required by platform code | ||
| 12 | * | ||
| 13 | * Please credit ARM.com | ||
| 14 | * Documentation: ARM DDI 0196D | ||
| 15 | * | ||
| 16 | */ | ||
| 17 | |||
| 18 | #ifndef AMBA_PL08X_H | ||
| 19 | #define AMBA_PL08X_H | ||
| 20 | |||
| 21 | /* We need sizes of structs from this header */ | ||
| 22 | #include <linux/dmaengine.h> | ||
| 23 | #include <linux/interrupt.h> | ||
| 24 | |||
| 25 | /** | ||
| 26 | * struct pl08x_channel_data - data structure to pass info between | ||
| 27 | * platform and PL08x driver regarding channel configuration | ||
| 28 | * @bus_id: name of this device channel, not just a device name since | ||
| 29 | * devices may have more than one channel e.g. "foo_tx" | ||
| 30 | * @min_signal: the minimum DMA signal number to be muxed in for this | ||
| 31 | * channel (for platforms supporting muxed signals). If you have | ||
| 32 | * static assignments, make sure this is set to the assigned signal | ||
| 33 | * number, PL08x have 16 possible signals in number 0 thru 15 so | ||
| 34 | * when these are not enough they often get muxed (in hardware) | ||
| 35 | * disabling simultaneous use of the same channel for two devices. | ||
| 36 | * @max_signal: the maximum DMA signal number to be muxed in for | ||
| 37 | * the channel. Set to the same as min_signal for | ||
| 38 | * devices with static assignments | ||
| 39 | * @muxval: a number usually used to poke into some mux regiser to | ||
| 40 | * mux in the signal to this channel | ||
| 41 | * @cctl_opt: default options for the channel control register | ||
| 42 | * @addr: source/target address in physical memory for this DMA channel, | ||
| 43 | * can be the address of a FIFO register for burst requests for example. | ||
| 44 | * This can be left undefined if the PrimeCell API is used for configuring | ||
| 45 | * this. | ||
| 46 | * @circular_buffer: whether the buffer passed in is circular and | ||
| 47 | * shall simply be looped round round (like a record baby round | ||
| 48 | * round round round) | ||
| 49 | * @single: the device connected to this channel will request single | ||
| 50 | * DMA transfers, not bursts. (Bursts are default.) | ||
| 51 | */ | ||
| 52 | struct pl08x_channel_data { | ||
| 53 | char *bus_id; | ||
| 54 | int min_signal; | ||
| 55 | int max_signal; | ||
| 56 | u32 muxval; | ||
| 57 | u32 cctl; | ||
| 58 | u32 ccfg; | ||
| 59 | dma_addr_t addr; | ||
| 60 | bool circular_buffer; | ||
| 61 | bool single; | ||
| 62 | }; | ||
| 63 | |||
| 64 | /** | ||
| 65 | * Struct pl08x_bus_data - information of source or destination | ||
| 66 | * busses for a transfer | ||
| 67 | * @addr: current address | ||
| 68 | * @maxwidth: the maximum width of a transfer on this bus | ||
| 69 | * @buswidth: the width of this bus in bytes: 1, 2 or 4 | ||
| 70 | * @fill_bytes: bytes required to fill to the next bus memory | ||
| 71 | * boundary | ||
| 72 | */ | ||
| 73 | struct pl08x_bus_data { | ||
| 74 | dma_addr_t addr; | ||
| 75 | u8 maxwidth; | ||
| 76 | u8 buswidth; | ||
| 77 | u32 fill_bytes; | ||
| 78 | }; | ||
| 79 | |||
| 80 | /** | ||
| 81 | * struct pl08x_phy_chan - holder for the physical channels | ||
| 82 | * @id: physical index to this channel | ||
| 83 | * @lock: a lock to use when altering an instance of this struct | ||
| 84 | * @signal: the physical signal (aka channel) serving this | ||
| 85 | * physical channel right now | ||
| 86 | * @serving: the virtual channel currently being served by this | ||
| 87 | * physical channel | ||
| 88 | */ | ||
| 89 | struct pl08x_phy_chan { | ||
| 90 | unsigned int id; | ||
| 91 | void __iomem *base; | ||
| 92 | spinlock_t lock; | ||
| 93 | int signal; | ||
| 94 | struct pl08x_dma_chan *serving; | ||
| 95 | u32 csrc; | ||
| 96 | u32 cdst; | ||
| 97 | u32 clli; | ||
| 98 | u32 cctl; | ||
| 99 | u32 ccfg; | ||
| 100 | }; | ||
| 101 | |||
| 102 | /** | ||
| 103 | * struct pl08x_txd - wrapper for struct dma_async_tx_descriptor | ||
| 104 | * @llis_bus: DMA memory address (physical) start for the LLIs | ||
| 105 | * @llis_va: virtual memory address start for the LLIs | ||
| 106 | */ | ||
| 107 | struct pl08x_txd { | ||
| 108 | struct dma_async_tx_descriptor tx; | ||
| 109 | struct list_head node; | ||
| 110 | enum dma_data_direction direction; | ||
| 111 | struct pl08x_bus_data srcbus; | ||
| 112 | struct pl08x_bus_data dstbus; | ||
| 113 | int len; | ||
| 114 | dma_addr_t llis_bus; | ||
| 115 | void *llis_va; | ||
| 116 | struct pl08x_channel_data *cd; | ||
| 117 | bool active; | ||
| 118 | /* | ||
| 119 | * Settings to be put into the physical channel when we | ||
| 120 | * trigger this txd | ||
| 121 | */ | ||
| 122 | u32 csrc; | ||
| 123 | u32 cdst; | ||
| 124 | u32 clli; | ||
| 125 | u32 cctl; | ||
| 126 | }; | ||
| 127 | |||
| 128 | /** | ||
| 129 | * struct pl08x_dma_chan_state - holds the PL08x specific virtual | ||
| 130 | * channel states | ||
| 131 | * @PL08X_CHAN_IDLE: the channel is idle | ||
| 132 | * @PL08X_CHAN_RUNNING: the channel has allocated a physical transport | ||
| 133 | * channel and is running a transfer on it | ||
| 134 | * @PL08X_CHAN_PAUSED: the channel has allocated a physical transport | ||
| 135 | * channel, but the transfer is currently paused | ||
| 136 | * @PL08X_CHAN_WAITING: the channel is waiting for a physical transport | ||
| 137 | * channel to become available (only pertains to memcpy channels) | ||
| 138 | */ | ||
| 139 | enum pl08x_dma_chan_state { | ||
| 140 | PL08X_CHAN_IDLE, | ||
| 141 | PL08X_CHAN_RUNNING, | ||
| 142 | PL08X_CHAN_PAUSED, | ||
| 143 | PL08X_CHAN_WAITING, | ||
| 144 | }; | ||
| 145 | |||
| 146 | /** | ||
| 147 | * struct pl08x_dma_chan - this structure wraps a DMA ENGINE channel | ||
| 148 | * @chan: wrappped abstract channel | ||
| 149 | * @phychan: the physical channel utilized by this channel, if there is one | ||
| 150 | * @tasklet: tasklet scheduled by the IRQ to handle actual work etc | ||
| 151 | * @name: name of channel | ||
| 152 | * @cd: channel platform data | ||
| 153 | * @runtime_addr: address for RX/TX according to the runtime config | ||
| 154 | * @runtime_direction: current direction of this channel according to | ||
| 155 | * runtime config | ||
| 156 | * @lc: last completed transaction on this channel | ||
| 157 | * @desc_list: queued transactions pending on this channel | ||
| 158 | * @at: active transaction on this channel | ||
| 159 | * @lockflags: sometimes we let a lock last between two function calls, | ||
| 160 | * especially prep/submit, and then we need to store the IRQ flags | ||
| 161 | * in the channel state, here | ||
| 162 | * @lock: a lock for this channel data | ||
| 163 | * @host: a pointer to the host (internal use) | ||
| 164 | * @state: whether the channel is idle, paused, running etc | ||
| 165 | * @slave: whether this channel is a device (slave) or for memcpy | ||
| 166 | * @waiting: a TX descriptor on this channel which is waiting for | ||
| 167 | * a physical channel to become available | ||
| 168 | */ | ||
| 169 | struct pl08x_dma_chan { | ||
| 170 | struct dma_chan chan; | ||
| 171 | struct pl08x_phy_chan *phychan; | ||
| 172 | struct tasklet_struct tasklet; | ||
| 173 | char *name; | ||
| 174 | struct pl08x_channel_data *cd; | ||
| 175 | dma_addr_t runtime_addr; | ||
| 176 | enum dma_data_direction runtime_direction; | ||
| 177 | atomic_t last_issued; | ||
| 178 | dma_cookie_t lc; | ||
| 179 | struct list_head desc_list; | ||
| 180 | struct pl08x_txd *at; | ||
| 181 | unsigned long lockflags; | ||
| 182 | spinlock_t lock; | ||
| 183 | void *host; | ||
| 184 | enum pl08x_dma_chan_state state; | ||
| 185 | bool slave; | ||
| 186 | struct pl08x_txd *waiting; | ||
| 187 | }; | ||
| 188 | |||
| 189 | /** | ||
| 190 | * struct pl08x_platform_data - the platform configuration for the | ||
| 191 | * PL08x PrimeCells. | ||
| 192 | * @slave_channels: the channels defined for the different devices on the | ||
| 193 | * platform, all inclusive, including multiplexed channels. The available | ||
| 194 | * physical channels will be multiplexed around these signals as they | ||
| 195 | * are requested, just enumerate all possible channels. | ||
| 196 | * @get_signal: request a physical signal to be used for a DMA | ||
| 197 | * transfer immediately: if there is some multiplexing or similar blocking | ||
| 198 | * the use of the channel the transfer can be denied by returning | ||
| 199 | * less than zero, else it returns the allocated signal number | ||
| 200 | * @put_signal: indicate to the platform that this physical signal is not | ||
| 201 | * running any DMA transfer and multiplexing can be recycled | ||
| 202 | * @bus_bit_lli: Bit[0] of the address indicated which AHB bus master the | ||
| 203 | * LLI addresses are on 0/1 Master 1/2. | ||
| 204 | */ | ||
| 205 | struct pl08x_platform_data { | ||
| 206 | struct pl08x_channel_data *slave_channels; | ||
| 207 | unsigned int num_slave_channels; | ||
| 208 | struct pl08x_channel_data memcpy_channel; | ||
| 209 | int (*get_signal)(struct pl08x_dma_chan *); | ||
| 210 | void (*put_signal)(struct pl08x_dma_chan *); | ||
| 211 | }; | ||
| 212 | |||
| 213 | #ifdef CONFIG_AMBA_PL08X | ||
| 214 | bool pl08x_filter_id(struct dma_chan *chan, void *chan_id); | ||
| 215 | #else | ||
| 216 | static inline bool pl08x_filter_id(struct dma_chan *chan, void *chan_id) | ||
| 217 | { | ||
| 218 | return false; | ||
| 219 | } | ||
| 220 | #endif | ||
| 221 | |||
| 222 | #endif /* AMBA_PL08X_H */ | ||
diff --git a/include/linux/amba/serial.h b/include/linux/amba/serial.h index 5a5a7fd62490..6021588ba0a8 100644 --- a/include/linux/amba/serial.h +++ b/include/linux/amba/serial.h | |||
| @@ -32,16 +32,20 @@ | |||
| 32 | #define UART01x_RSR 0x04 /* Receive status register (Read). */ | 32 | #define UART01x_RSR 0x04 /* Receive status register (Read). */ |
| 33 | #define UART01x_ECR 0x04 /* Error clear register (Write). */ | 33 | #define UART01x_ECR 0x04 /* Error clear register (Write). */ |
| 34 | #define UART010_LCRH 0x08 /* Line control register, high byte. */ | 34 | #define UART010_LCRH 0x08 /* Line control register, high byte. */ |
| 35 | #define ST_UART011_DMAWM 0x08 /* DMA watermark configure register. */ | ||
| 35 | #define UART010_LCRM 0x0C /* Line control register, middle byte. */ | 36 | #define UART010_LCRM 0x0C /* Line control register, middle byte. */ |
| 37 | #define ST_UART011_TIMEOUT 0x0C /* Timeout period register. */ | ||
| 36 | #define UART010_LCRL 0x10 /* Line control register, low byte. */ | 38 | #define UART010_LCRL 0x10 /* Line control register, low byte. */ |
| 37 | #define UART010_CR 0x14 /* Control register. */ | 39 | #define UART010_CR 0x14 /* Control register. */ |
| 38 | #define UART01x_FR 0x18 /* Flag register (Read only). */ | 40 | #define UART01x_FR 0x18 /* Flag register (Read only). */ |
| 39 | #define UART010_IIR 0x1C /* Interrupt indentification register (Read). */ | 41 | #define UART010_IIR 0x1C /* Interrupt indentification register (Read). */ |
| 40 | #define UART010_ICR 0x1C /* Interrupt clear register (Write). */ | 42 | #define UART010_ICR 0x1C /* Interrupt clear register (Write). */ |
| 43 | #define ST_UART011_LCRH_RX 0x1C /* Rx line control register. */ | ||
| 41 | #define UART01x_ILPR 0x20 /* IrDA low power counter register. */ | 44 | #define UART01x_ILPR 0x20 /* IrDA low power counter register. */ |
| 42 | #define UART011_IBRD 0x24 /* Integer baud rate divisor register. */ | 45 | #define UART011_IBRD 0x24 /* Integer baud rate divisor register. */ |
| 43 | #define UART011_FBRD 0x28 /* Fractional baud rate divisor register. */ | 46 | #define UART011_FBRD 0x28 /* Fractional baud rate divisor register. */ |
| 44 | #define UART011_LCRH 0x2c /* Line control register. */ | 47 | #define UART011_LCRH 0x2c /* Line control register. */ |
| 48 | #define ST_UART011_LCRH_TX 0x2c /* Tx Line control register. */ | ||
| 45 | #define UART011_CR 0x30 /* Control register. */ | 49 | #define UART011_CR 0x30 /* Control register. */ |
| 46 | #define UART011_IFLS 0x34 /* Interrupt fifo level select. */ | 50 | #define UART011_IFLS 0x34 /* Interrupt fifo level select. */ |
| 47 | #define UART011_IMSC 0x38 /* Interrupt mask. */ | 51 | #define UART011_IMSC 0x38 /* Interrupt mask. */ |
| @@ -49,6 +53,15 @@ | |||
| 49 | #define UART011_MIS 0x40 /* Masked interrupt status. */ | 53 | #define UART011_MIS 0x40 /* Masked interrupt status. */ |
| 50 | #define UART011_ICR 0x44 /* Interrupt clear register. */ | 54 | #define UART011_ICR 0x44 /* Interrupt clear register. */ |
| 51 | #define UART011_DMACR 0x48 /* DMA control register. */ | 55 | #define UART011_DMACR 0x48 /* DMA control register. */ |
| 56 | #define ST_UART011_XFCR 0x50 /* XON/XOFF control register. */ | ||
| 57 | #define ST_UART011_XON1 0x54 /* XON1 register. */ | ||
| 58 | #define ST_UART011_XON2 0x58 /* XON2 register. */ | ||
| 59 | #define ST_UART011_XOFF1 0x5C /* XON1 register. */ | ||
| 60 | #define ST_UART011_XOFF2 0x60 /* XON2 register. */ | ||
| 61 | #define ST_UART011_ITCR 0x80 /* Integration test control register. */ | ||
| 62 | #define ST_UART011_ITIP 0x84 /* Integration test input register. */ | ||
| 63 | #define ST_UART011_ABCR 0x100 /* Autobaud control register. */ | ||
| 64 | #define ST_UART011_ABIMSC 0x15C /* Autobaud interrupt mask/clear register. */ | ||
| 52 | 65 | ||
| 53 | #define UART011_DR_OE (1 << 11) | 66 | #define UART011_DR_OE (1 << 11) |
| 54 | #define UART011_DR_BE (1 << 10) | 67 | #define UART011_DR_BE (1 << 10) |
| @@ -84,6 +97,7 @@ | |||
| 84 | #define UART010_CR_TIE 0x0020 | 97 | #define UART010_CR_TIE 0x0020 |
| 85 | #define UART010_CR_RIE 0x0010 | 98 | #define UART010_CR_RIE 0x0010 |
| 86 | #define UART010_CR_MSIE 0x0008 | 99 | #define UART010_CR_MSIE 0x0008 |
| 100 | #define ST_UART011_CR_OVSFACT 0x0008 /* Oversampling factor */ | ||
| 87 | #define UART01x_CR_IIRLP 0x0004 /* SIR low power mode */ | 101 | #define UART01x_CR_IIRLP 0x0004 /* SIR low power mode */ |
| 88 | #define UART01x_CR_SIREN 0x0002 /* SIR enable */ | 102 | #define UART01x_CR_SIREN 0x0002 /* SIR enable */ |
| 89 | #define UART01x_CR_UARTEN 0x0001 /* UART enable */ | 103 | #define UART01x_CR_UARTEN 0x0001 /* UART enable */ |
diff --git a/include/linux/ata.h b/include/linux/ata.h index fe6e681a9d74..0c4929fa34d3 100644 --- a/include/linux/ata.h +++ b/include/linux/ata.h | |||
| @@ -89,6 +89,7 @@ enum { | |||
| 89 | ATA_ID_SPG = 98, | 89 | ATA_ID_SPG = 98, |
| 90 | ATA_ID_LBA_CAPACITY_2 = 100, | 90 | ATA_ID_LBA_CAPACITY_2 = 100, |
| 91 | ATA_ID_SECTOR_SIZE = 106, | 91 | ATA_ID_SECTOR_SIZE = 106, |
| 92 | ATA_ID_LOGICAL_SECTOR_SIZE = 117, /* and 118 */ | ||
| 92 | ATA_ID_LAST_LUN = 126, | 93 | ATA_ID_LAST_LUN = 126, |
| 93 | ATA_ID_DLF = 128, | 94 | ATA_ID_DLF = 128, |
| 94 | ATA_ID_CSFO = 129, | 95 | ATA_ID_CSFO = 129, |
| @@ -640,16 +641,49 @@ static inline int ata_id_flush_ext_enabled(const u16 *id) | |||
| 640 | return (id[ATA_ID_CFS_ENABLE_2] & 0x2400) == 0x2400; | 641 | return (id[ATA_ID_CFS_ENABLE_2] & 0x2400) == 0x2400; |
| 641 | } | 642 | } |
| 642 | 643 | ||
| 643 | static inline int ata_id_has_large_logical_sectors(const u16 *id) | 644 | static inline u32 ata_id_logical_sector_size(const u16 *id) |
| 644 | { | 645 | { |
| 645 | if ((id[ATA_ID_SECTOR_SIZE] & 0xc000) != 0x4000) | 646 | /* T13/1699-D Revision 6a, Sep 6, 2008. Page 128. |
| 646 | return 0; | 647 | * IDENTIFY DEVICE data, word 117-118. |
| 647 | return id[ATA_ID_SECTOR_SIZE] & (1 << 13); | 648 | * 0xd000 ignores bit 13 (logical:physical > 1) |
| 649 | */ | ||
| 650 | if ((id[ATA_ID_SECTOR_SIZE] & 0xd000) == 0x5000) | ||
| 651 | return (((id[ATA_ID_LOGICAL_SECTOR_SIZE+1] << 16) | ||
| 652 | + id[ATA_ID_LOGICAL_SECTOR_SIZE]) * sizeof(u16)) ; | ||
| 653 | return ATA_SECT_SIZE; | ||
| 654 | } | ||
| 655 | |||
| 656 | static inline u8 ata_id_log2_per_physical_sector(const u16 *id) | ||
| 657 | { | ||
| 658 | /* T13/1699-D Revision 6a, Sep 6, 2008. Page 128. | ||
| 659 | * IDENTIFY DEVICE data, word 106. | ||
| 660 | * 0xe000 ignores bit 12 (logical sector > 512 bytes) | ||
| 661 | */ | ||
| 662 | if ((id[ATA_ID_SECTOR_SIZE] & 0xe000) == 0x6000) | ||
| 663 | return (id[ATA_ID_SECTOR_SIZE] & 0xf); | ||
| 664 | return 0; | ||
| 648 | } | 665 | } |
| 649 | 666 | ||
| 650 | static inline u16 ata_id_logical_per_physical_sectors(const u16 *id) | 667 | /* Offset of logical sectors relative to physical sectors. |
| 668 | * | ||
| 669 | * If device has more than one logical sector per physical sector | ||
| 670 | * (aka 512 byte emulation), vendors might offset the "sector 0" address | ||
| 671 | * so sector 63 is "naturally aligned" - e.g. FAT partition table. | ||
| 672 | * This avoids Read/Mod/Write penalties when using FAT partition table | ||
| 673 | * and updating "well aligned" (FS perspective) physical sectors on every | ||
| 674 | * transaction. | ||
| 675 | */ | ||
| 676 | static inline u16 ata_id_logical_sector_offset(const u16 *id, | ||
| 677 | u8 log2_per_phys) | ||
| 651 | { | 678 | { |
| 652 | return 1 << (id[ATA_ID_SECTOR_SIZE] & 0xf); | 679 | u16 word_209 = id[209]; |
| 680 | |||
| 681 | if ((log2_per_phys > 1) && (word_209 & 0xc000) == 0x4000) { | ||
| 682 | u16 first = word_209 & 0x3fff; | ||
| 683 | if (first > 0) | ||
| 684 | return (1 << log2_per_phys) - first; | ||
| 685 | } | ||
| 686 | return 0; | ||
| 653 | } | 687 | } |
| 654 | 688 | ||
| 655 | static inline int ata_id_has_lba48(const u16 *id) | 689 | static inline int ata_id_has_lba48(const u16 *id) |
diff --git a/include/linux/atmdev.h b/include/linux/atmdev.h index 817b23705c91..a8e4e832cdbb 100644 --- a/include/linux/atmdev.h +++ b/include/linux/atmdev.h | |||
| @@ -431,6 +431,14 @@ struct atm_dev *atm_dev_register(const char *type,const struct atmdev_ops *ops, | |||
| 431 | int number,unsigned long *flags); /* number == -1: pick first available */ | 431 | int number,unsigned long *flags); /* number == -1: pick first available */ |
| 432 | struct atm_dev *atm_dev_lookup(int number); | 432 | struct atm_dev *atm_dev_lookup(int number); |
| 433 | void atm_dev_deregister(struct atm_dev *dev); | 433 | void atm_dev_deregister(struct atm_dev *dev); |
| 434 | |||
| 435 | /* atm_dev_signal_change | ||
| 436 | * | ||
| 437 | * Propagate lower layer signal change in atm_dev->signal to netdevice. | ||
| 438 | * The event will be sent via a notifier call chain. | ||
| 439 | */ | ||
| 440 | void atm_dev_signal_change(struct atm_dev *dev, char signal); | ||
| 441 | |||
| 434 | void vcc_insert_socket(struct sock *sk); | 442 | void vcc_insert_socket(struct sock *sk); |
| 435 | 443 | ||
| 436 | 444 | ||
| @@ -441,7 +449,7 @@ void vcc_insert_socket(struct sock *sk); | |||
| 441 | 449 | ||
| 442 | static inline int atm_guess_pdu2truesize(int size) | 450 | static inline int atm_guess_pdu2truesize(int size) |
| 443 | { | 451 | { |
| 444 | return (SKB_DATA_ALIGN(size) + sizeof(struct skb_shared_info)); | 452 | return SKB_DATA_ALIGN(size) + sizeof(struct skb_shared_info); |
| 445 | } | 453 | } |
| 446 | 454 | ||
| 447 | 455 | ||
| @@ -510,6 +518,15 @@ void register_atm_ioctl(struct atm_ioctl *); | |||
| 510 | */ | 518 | */ |
| 511 | void deregister_atm_ioctl(struct atm_ioctl *); | 519 | void deregister_atm_ioctl(struct atm_ioctl *); |
| 512 | 520 | ||
| 521 | |||
| 522 | /* register_atmdevice_notifier - register atm_dev notify events | ||
| 523 | * | ||
| 524 | * Clients like br2684 will register notify events | ||
| 525 | * Currently we notify of signal found/lost | ||
| 526 | */ | ||
| 527 | int register_atmdevice_notifier(struct notifier_block *nb); | ||
| 528 | void unregister_atmdevice_notifier(struct notifier_block *nb); | ||
| 529 | |||
| 513 | #endif /* __KERNEL__ */ | 530 | #endif /* __KERNEL__ */ |
| 514 | 531 | ||
| 515 | #endif | 532 | #endif |
diff --git a/include/linux/audit.h b/include/linux/audit.h index f391d45c8aea..e24afabc548f 100644 --- a/include/linux/audit.h +++ b/include/linux/audit.h | |||
| @@ -544,7 +544,7 @@ extern int audit_signals; | |||
| 544 | #define audit_putname(n) do { ; } while (0) | 544 | #define audit_putname(n) do { ; } while (0) |
| 545 | #define __audit_inode(n,d) do { ; } while (0) | 545 | #define __audit_inode(n,d) do { ; } while (0) |
| 546 | #define __audit_inode_child(i,p) do { ; } while (0) | 546 | #define __audit_inode_child(i,p) do { ; } while (0) |
| 547 | #define audit_inode(n,d) do { ; } while (0) | 547 | #define audit_inode(n,d) do { (void)(d); } while (0) |
| 548 | #define audit_inode_child(i,p) do { ; } while (0) | 548 | #define audit_inode_child(i,p) do { ; } while (0) |
| 549 | #define audit_core_dumps(i) do { ; } while (0) | 549 | #define audit_core_dumps(i) do { ; } while (0) |
| 550 | #define auditsc_get_stamp(c,t,s) (0) | 550 | #define auditsc_get_stamp(c,t,s) (0) |
diff --git a/include/linux/auto_fs.h b/include/linux/auto_fs.h index 7b09c8348fd3..da64e15004b6 100644 --- a/include/linux/auto_fs.h +++ b/include/linux/auto_fs.h | |||
| @@ -79,6 +79,7 @@ struct autofs_packet_expire { | |||
| 79 | #define AUTOFS_IOC_FAIL _IO(0x93,0x61) | 79 | #define AUTOFS_IOC_FAIL _IO(0x93,0x61) |
| 80 | #define AUTOFS_IOC_CATATONIC _IO(0x93,0x62) | 80 | #define AUTOFS_IOC_CATATONIC _IO(0x93,0x62) |
| 81 | #define AUTOFS_IOC_PROTOVER _IOR(0x93,0x63,int) | 81 | #define AUTOFS_IOC_PROTOVER _IOR(0x93,0x63,int) |
| 82 | #define AUTOFS_IOC_SETTIMEOUT32 _IOWR(0x93,0x64,compat_ulong_t) | ||
| 82 | #define AUTOFS_IOC_SETTIMEOUT _IOWR(0x93,0x64,unsigned long) | 83 | #define AUTOFS_IOC_SETTIMEOUT _IOWR(0x93,0x64,unsigned long) |
| 83 | #define AUTOFS_IOC_EXPIRE _IOR(0x93,0x65,struct autofs_packet_expire) | 84 | #define AUTOFS_IOC_EXPIRE _IOR(0x93,0x65,struct autofs_packet_expire) |
| 84 | 85 | ||
diff --git a/include/linux/backing-dev.h b/include/linux/backing-dev.h index e9aec0d099df..4ce34fa937d4 100644 --- a/include/linux/backing-dev.h +++ b/include/linux/backing-dev.h | |||
| @@ -31,6 +31,7 @@ enum bdi_state { | |||
| 31 | BDI_async_congested, /* The async (write) queue is getting full */ | 31 | BDI_async_congested, /* The async (write) queue is getting full */ |
| 32 | BDI_sync_congested, /* The sync queue is getting full */ | 32 | BDI_sync_congested, /* The sync queue is getting full */ |
| 33 | BDI_registered, /* bdi_register() was done */ | 33 | BDI_registered, /* bdi_register() was done */ |
| 34 | BDI_writeback_running, /* Writeback is in progress */ | ||
| 34 | BDI_unused, /* Available bits start here */ | 35 | BDI_unused, /* Available bits start here */ |
| 35 | }; | 36 | }; |
| 36 | 37 | ||
| @@ -45,22 +46,21 @@ enum bdi_stat_item { | |||
| 45 | #define BDI_STAT_BATCH (8*(1+ilog2(nr_cpu_ids))) | 46 | #define BDI_STAT_BATCH (8*(1+ilog2(nr_cpu_ids))) |
| 46 | 47 | ||
| 47 | struct bdi_writeback { | 48 | struct bdi_writeback { |
| 48 | struct list_head list; /* hangs off the bdi */ | 49 | struct backing_dev_info *bdi; /* our parent bdi */ |
| 49 | |||
| 50 | struct backing_dev_info *bdi; /* our parent bdi */ | ||
| 51 | unsigned int nr; | 50 | unsigned int nr; |
| 52 | 51 | ||
| 53 | unsigned long last_old_flush; /* last old data flush */ | 52 | unsigned long last_old_flush; /* last old data flush */ |
| 53 | unsigned long last_active; /* last time bdi thread was active */ | ||
| 54 | 54 | ||
| 55 | struct task_struct *task; /* writeback task */ | 55 | struct task_struct *task; /* writeback thread */ |
| 56 | struct list_head b_dirty; /* dirty inodes */ | 56 | struct timer_list wakeup_timer; /* used for delayed bdi thread wakeup */ |
| 57 | struct list_head b_io; /* parked for writeback */ | 57 | struct list_head b_dirty; /* dirty inodes */ |
| 58 | struct list_head b_more_io; /* parked for more writeback */ | 58 | struct list_head b_io; /* parked for writeback */ |
| 59 | struct list_head b_more_io; /* parked for more writeback */ | ||
| 59 | }; | 60 | }; |
| 60 | 61 | ||
| 61 | struct backing_dev_info { | 62 | struct backing_dev_info { |
| 62 | struct list_head bdi_list; | 63 | struct list_head bdi_list; |
| 63 | struct rcu_head rcu_head; | ||
| 64 | unsigned long ra_pages; /* max readahead in PAGE_CACHE_SIZE units */ | 64 | unsigned long ra_pages; /* max readahead in PAGE_CACHE_SIZE units */ |
| 65 | unsigned long state; /* Always use atomic bitops on this */ | 65 | unsigned long state; /* Always use atomic bitops on this */ |
| 66 | unsigned int capabilities; /* Device capabilities */ | 66 | unsigned int capabilities; /* Device capabilities */ |
| @@ -80,8 +80,7 @@ struct backing_dev_info { | |||
| 80 | unsigned int max_ratio, max_prop_frac; | 80 | unsigned int max_ratio, max_prop_frac; |
| 81 | 81 | ||
| 82 | struct bdi_writeback wb; /* default writeback info for this bdi */ | 82 | struct bdi_writeback wb; /* default writeback info for this bdi */ |
| 83 | spinlock_t wb_lock; /* protects update side of wb_list */ | 83 | spinlock_t wb_lock; /* protects work_list */ |
| 84 | struct list_head wb_list; /* the flusher threads hanging off this bdi */ | ||
| 85 | 84 | ||
| 86 | struct list_head work_list; | 85 | struct list_head work_list; |
| 87 | 86 | ||
| @@ -105,12 +104,14 @@ void bdi_unregister(struct backing_dev_info *bdi); | |||
| 105 | int bdi_setup_and_register(struct backing_dev_info *, char *, unsigned int); | 104 | int bdi_setup_and_register(struct backing_dev_info *, char *, unsigned int); |
| 106 | void bdi_start_writeback(struct backing_dev_info *bdi, long nr_pages); | 105 | void bdi_start_writeback(struct backing_dev_info *bdi, long nr_pages); |
| 107 | void bdi_start_background_writeback(struct backing_dev_info *bdi); | 106 | void bdi_start_background_writeback(struct backing_dev_info *bdi); |
| 108 | int bdi_writeback_task(struct bdi_writeback *wb); | 107 | int bdi_writeback_thread(void *data); |
| 109 | int bdi_has_dirty_io(struct backing_dev_info *bdi); | 108 | int bdi_has_dirty_io(struct backing_dev_info *bdi); |
| 110 | void bdi_arm_supers_timer(void); | 109 | void bdi_arm_supers_timer(void); |
| 110 | void bdi_wakeup_thread_delayed(struct backing_dev_info *bdi); | ||
| 111 | 111 | ||
| 112 | extern spinlock_t bdi_lock; | 112 | extern spinlock_t bdi_lock; |
| 113 | extern struct list_head bdi_list; | 113 | extern struct list_head bdi_list; |
| 114 | extern struct list_head bdi_pending_list; | ||
| 114 | 115 | ||
| 115 | static inline int wb_has_dirty_io(struct bdi_writeback *wb) | 116 | static inline int wb_has_dirty_io(struct bdi_writeback *wb) |
| 116 | { | 117 | { |
| @@ -285,7 +286,7 @@ enum { | |||
| 285 | void clear_bdi_congested(struct backing_dev_info *bdi, int sync); | 286 | void clear_bdi_congested(struct backing_dev_info *bdi, int sync); |
| 286 | void set_bdi_congested(struct backing_dev_info *bdi, int sync); | 287 | void set_bdi_congested(struct backing_dev_info *bdi, int sync); |
| 287 | long congestion_wait(int sync, long timeout); | 288 | long congestion_wait(int sync, long timeout); |
| 288 | 289 | long wait_iff_congested(struct zone *zone, int sync, long timeout); | |
| 289 | 290 | ||
| 290 | static inline bool bdi_cap_writeback_dirty(struct backing_dev_info *bdi) | 291 | static inline bool bdi_cap_writeback_dirty(struct backing_dev_info *bdi) |
| 291 | { | 292 | { |
diff --git a/include/linux/basic_mmio_gpio.h b/include/linux/basic_mmio_gpio.h new file mode 100644 index 000000000000..198087a16fc4 --- /dev/null +++ b/include/linux/basic_mmio_gpio.h | |||
| @@ -0,0 +1,20 @@ | |||
| 1 | /* | ||
| 2 | * Basic memory-mapped GPIO controllers. | ||
| 3 | * | ||
| 4 | * Copyright 2008 MontaVista Software, Inc. | ||
| 5 | * Copyright 2008,2010 Anton Vorontsov <cbouatmailru@gmail.com> | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify it | ||
| 8 | * under the terms of the GNU General Public License as published by the | ||
| 9 | * Free Software Foundation; either version 2 of the License, or (at your | ||
| 10 | * option) any later version. | ||
| 11 | */ | ||
| 12 | |||
| 13 | #ifndef __BASIC_MMIO_GPIO_H | ||
| 14 | #define __BASIC_MMIO_GPIO_H | ||
| 15 | |||
| 16 | struct bgpio_pdata { | ||
| 17 | int base; | ||
| 18 | }; | ||
| 19 | |||
| 20 | #endif /* __BASIC_MMIO_GPIO_H */ | ||
diff --git a/include/linux/bfin_mac.h b/include/linux/bfin_mac.h new file mode 100644 index 000000000000..904dec7d03a1 --- /dev/null +++ b/include/linux/bfin_mac.h | |||
| @@ -0,0 +1,29 @@ | |||
| 1 | /* | ||
| 2 | * Blackfin On-Chip MAC Driver | ||
| 3 | * | ||
| 4 | * Copyright 2004-2010 Analog Devices Inc. | ||
| 5 | * | ||
| 6 | * Enter bugs at http://blackfin.uclinux.org/ | ||
| 7 | * | ||
| 8 | * Licensed under the GPL-2 or later. | ||
| 9 | */ | ||
| 10 | |||
| 11 | #ifndef _LINUX_BFIN_MAC_H_ | ||
| 12 | #define _LINUX_BFIN_MAC_H_ | ||
| 13 | |||
| 14 | #include <linux/phy.h> | ||
| 15 | |||
| 16 | struct bfin_phydev_platform_data { | ||
| 17 | unsigned short addr; | ||
| 18 | int irq; | ||
| 19 | }; | ||
| 20 | |||
| 21 | struct bfin_mii_bus_platform_data { | ||
| 22 | int phydev_number; | ||
| 23 | struct bfin_phydev_platform_data *phydev_data; | ||
| 24 | const unsigned short *mac_peripherals; | ||
| 25 | int phy_mode; | ||
| 26 | unsigned int phy_mask; | ||
| 27 | }; | ||
| 28 | |||
| 29 | #endif | ||
diff --git a/include/linux/binfmts.h b/include/linux/binfmts.h index c809e286d213..a065612fc928 100644 --- a/include/linux/binfmts.h +++ b/include/linux/binfmts.h | |||
| @@ -50,8 +50,8 @@ struct linux_binprm{ | |||
| 50 | int unsafe; /* how unsafe this exec is (mask of LSM_UNSAFE_*) */ | 50 | int unsafe; /* how unsafe this exec is (mask of LSM_UNSAFE_*) */ |
| 51 | unsigned int per_clear; /* bits to clear in current->personality */ | 51 | unsigned int per_clear; /* bits to clear in current->personality */ |
| 52 | int argc, envc; | 52 | int argc, envc; |
| 53 | char * filename; /* Name of binary as seen by procps */ | 53 | const char * filename; /* Name of binary as seen by procps */ |
| 54 | char * interp; /* Name of the binary really executed. Most | 54 | const char * interp; /* Name of the binary really executed. Most |
| 55 | of the time same as filename, but could be | 55 | of the time same as filename, but could be |
| 56 | different for binfmt_{misc,script} */ | 56 | different for binfmt_{misc,script} */ |
| 57 | unsigned interp_flags; | 57 | unsigned interp_flags; |
| @@ -126,7 +126,8 @@ extern int setup_arg_pages(struct linux_binprm * bprm, | |||
| 126 | unsigned long stack_top, | 126 | unsigned long stack_top, |
| 127 | int executable_stack); | 127 | int executable_stack); |
| 128 | extern int bprm_mm_init(struct linux_binprm *bprm); | 128 | extern int bprm_mm_init(struct linux_binprm *bprm); |
| 129 | extern int copy_strings_kernel(int argc,char ** argv,struct linux_binprm *bprm); | 129 | extern int copy_strings_kernel(int argc, const char *const *argv, |
| 130 | struct linux_binprm *bprm); | ||
| 130 | extern int prepare_bprm_creds(struct linux_binprm *bprm); | 131 | extern int prepare_bprm_creds(struct linux_binprm *bprm); |
| 131 | extern void install_exec_creds(struct linux_binprm *bprm); | 132 | extern void install_exec_creds(struct linux_binprm *bprm); |
| 132 | extern void do_coredump(long signr, int exit_code, struct pt_regs *regs); | 133 | extern void do_coredump(long signr, int exit_code, struct pt_regs *regs); |
diff --git a/include/linux/bio.h b/include/linux/bio.h index 7fc5606e6ea5..ba679992d39b 100644 --- a/include/linux/bio.h +++ b/include/linux/bio.h | |||
| @@ -9,7 +9,7 @@ | |||
| 9 | * | 9 | * |
| 10 | * This program is distributed in the hope that it will be useful, | 10 | * This program is distributed in the hope that it will be useful, |
| 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 12 | 12 | * | |
| 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 14 | * GNU General Public License for more details. | 14 | * GNU General Public License for more details. |
| 15 | * | 15 | * |
| @@ -28,6 +28,9 @@ | |||
| 28 | 28 | ||
| 29 | #include <asm/io.h> | 29 | #include <asm/io.h> |
| 30 | 30 | ||
| 31 | /* struct bio, bio_vec and BIO_* flags are defined in blk_types.h */ | ||
| 32 | #include <linux/blk_types.h> | ||
| 33 | |||
| 31 | #define BIO_DEBUG | 34 | #define BIO_DEBUG |
| 32 | 35 | ||
| 33 | #ifdef BIO_DEBUG | 36 | #ifdef BIO_DEBUG |
| @@ -41,154 +44,6 @@ | |||
| 41 | #define BIO_MAX_SECTORS (BIO_MAX_SIZE >> 9) | 44 | #define BIO_MAX_SECTORS (BIO_MAX_SIZE >> 9) |
| 42 | 45 | ||
| 43 | /* | 46 | /* |
| 44 | * was unsigned short, but we might as well be ready for > 64kB I/O pages | ||
| 45 | */ | ||
| 46 | struct bio_vec { | ||
| 47 | struct page *bv_page; | ||
| 48 | unsigned int bv_len; | ||
| 49 | unsigned int bv_offset; | ||
| 50 | }; | ||
| 51 | |||
| 52 | struct bio_set; | ||
| 53 | struct bio; | ||
| 54 | struct bio_integrity_payload; | ||
| 55 | typedef void (bio_end_io_t) (struct bio *, int); | ||
| 56 | typedef void (bio_destructor_t) (struct bio *); | ||
| 57 | |||
| 58 | /* | ||
| 59 | * main unit of I/O for the block layer and lower layers (ie drivers and | ||
| 60 | * stacking drivers) | ||
| 61 | */ | ||
| 62 | struct bio { | ||
| 63 | sector_t bi_sector; /* device address in 512 byte | ||
| 64 | sectors */ | ||
| 65 | struct bio *bi_next; /* request queue link */ | ||
| 66 | struct block_device *bi_bdev; | ||
| 67 | unsigned long bi_flags; /* status, command, etc */ | ||
| 68 | unsigned long bi_rw; /* bottom bits READ/WRITE, | ||
| 69 | * top bits priority | ||
| 70 | */ | ||
| 71 | |||
| 72 | unsigned short bi_vcnt; /* how many bio_vec's */ | ||
| 73 | unsigned short bi_idx; /* current index into bvl_vec */ | ||
| 74 | |||
| 75 | /* Number of segments in this BIO after | ||
| 76 | * physical address coalescing is performed. | ||
| 77 | */ | ||
| 78 | unsigned int bi_phys_segments; | ||
| 79 | |||
| 80 | unsigned int bi_size; /* residual I/O count */ | ||
| 81 | |||
| 82 | /* | ||
| 83 | * To keep track of the max segment size, we account for the | ||
| 84 | * sizes of the first and last mergeable segments in this bio. | ||
| 85 | */ | ||
| 86 | unsigned int bi_seg_front_size; | ||
| 87 | unsigned int bi_seg_back_size; | ||
| 88 | |||
| 89 | unsigned int bi_max_vecs; /* max bvl_vecs we can hold */ | ||
| 90 | |||
| 91 | unsigned int bi_comp_cpu; /* completion CPU */ | ||
| 92 | |||
| 93 | atomic_t bi_cnt; /* pin count */ | ||
| 94 | |||
| 95 | struct bio_vec *bi_io_vec; /* the actual vec list */ | ||
| 96 | |||
| 97 | bio_end_io_t *bi_end_io; | ||
| 98 | |||
| 99 | void *bi_private; | ||
| 100 | #if defined(CONFIG_BLK_DEV_INTEGRITY) | ||
| 101 | struct bio_integrity_payload *bi_integrity; /* data integrity */ | ||
| 102 | #endif | ||
| 103 | |||
| 104 | bio_destructor_t *bi_destructor; /* destructor */ | ||
| 105 | |||
| 106 | /* | ||
| 107 | * We can inline a number of vecs at the end of the bio, to avoid | ||
| 108 | * double allocations for a small number of bio_vecs. This member | ||
| 109 | * MUST obviously be kept at the very end of the bio. | ||
| 110 | */ | ||
| 111 | struct bio_vec bi_inline_vecs[0]; | ||
| 112 | }; | ||
| 113 | |||
| 114 | /* | ||
| 115 | * bio flags | ||
| 116 | */ | ||
| 117 | #define BIO_UPTODATE 0 /* ok after I/O completion */ | ||
| 118 | #define BIO_RW_BLOCK 1 /* RW_AHEAD set, and read/write would block */ | ||
| 119 | #define BIO_EOF 2 /* out-out-bounds error */ | ||
| 120 | #define BIO_SEG_VALID 3 /* bi_phys_segments valid */ | ||
| 121 | #define BIO_CLONED 4 /* doesn't own data */ | ||
| 122 | #define BIO_BOUNCED 5 /* bio is a bounce bio */ | ||
| 123 | #define BIO_USER_MAPPED 6 /* contains user pages */ | ||
| 124 | #define BIO_EOPNOTSUPP 7 /* not supported */ | ||
| 125 | #define BIO_CPU_AFFINE 8 /* complete bio on same CPU as submitted */ | ||
| 126 | #define BIO_NULL_MAPPED 9 /* contains invalid user pages */ | ||
| 127 | #define BIO_FS_INTEGRITY 10 /* fs owns integrity data, not block layer */ | ||
| 128 | #define BIO_QUIET 11 /* Make BIO Quiet */ | ||
| 129 | #define bio_flagged(bio, flag) ((bio)->bi_flags & (1 << (flag))) | ||
| 130 | |||
| 131 | /* | ||
| 132 | * top 4 bits of bio flags indicate the pool this bio came from | ||
| 133 | */ | ||
| 134 | #define BIO_POOL_BITS (4) | ||
| 135 | #define BIO_POOL_NONE ((1UL << BIO_POOL_BITS) - 1) | ||
| 136 | #define BIO_POOL_OFFSET (BITS_PER_LONG - BIO_POOL_BITS) | ||
| 137 | #define BIO_POOL_MASK (1UL << BIO_POOL_OFFSET) | ||
| 138 | #define BIO_POOL_IDX(bio) ((bio)->bi_flags >> BIO_POOL_OFFSET) | ||
| 139 | |||
| 140 | /* | ||
| 141 | * bio bi_rw flags | ||
| 142 | * | ||
| 143 | * bit 0 -- data direction | ||
| 144 | * If not set, bio is a read from device. If set, it's a write to device. | ||
| 145 | * bit 1 -- fail fast device errors | ||
| 146 | * bit 2 -- fail fast transport errors | ||
| 147 | * bit 3 -- fail fast driver errors | ||
| 148 | * bit 4 -- rw-ahead when set | ||
| 149 | * bit 5 -- barrier | ||
| 150 | * Insert a serialization point in the IO queue, forcing previously | ||
| 151 | * submitted IO to be completed before this one is issued. | ||
| 152 | * bit 6 -- synchronous I/O hint. | ||
| 153 | * bit 7 -- Unplug the device immediately after submitting this bio. | ||
| 154 | * bit 8 -- metadata request | ||
| 155 | * Used for tracing to differentiate metadata and data IO. May also | ||
| 156 | * get some preferential treatment in the IO scheduler | ||
| 157 | * bit 9 -- discard sectors | ||
| 158 | * Informs the lower level device that this range of sectors is no longer | ||
| 159 | * used by the file system and may thus be freed by the device. Used | ||
| 160 | * for flash based storage. | ||
| 161 | * Don't want driver retries for any fast fail whatever the reason. | ||
| 162 | * bit 10 -- Tell the IO scheduler not to wait for more requests after this | ||
| 163 | one has been submitted, even if it is a SYNC request. | ||
| 164 | */ | ||
| 165 | enum bio_rw_flags { | ||
| 166 | BIO_RW, | ||
| 167 | BIO_RW_FAILFAST_DEV, | ||
| 168 | BIO_RW_FAILFAST_TRANSPORT, | ||
| 169 | BIO_RW_FAILFAST_DRIVER, | ||
| 170 | /* above flags must match REQ_* */ | ||
| 171 | BIO_RW_AHEAD, | ||
| 172 | BIO_RW_BARRIER, | ||
| 173 | BIO_RW_SYNCIO, | ||
| 174 | BIO_RW_UNPLUG, | ||
| 175 | BIO_RW_META, | ||
| 176 | BIO_RW_DISCARD, | ||
| 177 | BIO_RW_NOIDLE, | ||
| 178 | }; | ||
| 179 | |||
| 180 | /* | ||
| 181 | * First four bits must match between bio->bi_rw and rq->cmd_flags, make | ||
| 182 | * that explicit here. | ||
| 183 | */ | ||
| 184 | #define BIO_RW_RQ_MASK 0xf | ||
| 185 | |||
| 186 | static inline bool bio_rw_flagged(struct bio *bio, enum bio_rw_flags flag) | ||
| 187 | { | ||
| 188 | return (bio->bi_rw & (1 << flag)) != 0; | ||
| 189 | } | ||
| 190 | |||
| 191 | /* | ||
| 192 | * upper 16 bits of bi_rw define the io priority of this bio | 47 | * upper 16 bits of bi_rw define the io priority of this bio |
| 193 | */ | 48 | */ |
| 194 | #define BIO_PRIO_SHIFT (8 * sizeof(unsigned long) - IOPRIO_BITS) | 49 | #define BIO_PRIO_SHIFT (8 * sizeof(unsigned long) - IOPRIO_BITS) |
| @@ -211,7 +66,10 @@ static inline bool bio_rw_flagged(struct bio *bio, enum bio_rw_flags flag) | |||
| 211 | #define bio_offset(bio) bio_iovec((bio))->bv_offset | 66 | #define bio_offset(bio) bio_iovec((bio))->bv_offset |
| 212 | #define bio_segments(bio) ((bio)->bi_vcnt - (bio)->bi_idx) | 67 | #define bio_segments(bio) ((bio)->bi_vcnt - (bio)->bi_idx) |
| 213 | #define bio_sectors(bio) ((bio)->bi_size >> 9) | 68 | #define bio_sectors(bio) ((bio)->bi_size >> 9) |
| 214 | #define bio_empty_barrier(bio) (bio_rw_flagged(bio, BIO_RW_BARRIER) && !bio_has_data(bio) && !bio_rw_flagged(bio, BIO_RW_DISCARD)) | 69 | #define bio_empty_barrier(bio) \ |
| 70 | ((bio->bi_rw & REQ_HARDBARRIER) && \ | ||
| 71 | !bio_has_data(bio) && \ | ||
| 72 | !(bio->bi_rw & REQ_DISCARD)) | ||
| 215 | 73 | ||
| 216 | static inline unsigned int bio_cur_bytes(struct bio *bio) | 74 | static inline unsigned int bio_cur_bytes(struct bio *bio) |
| 217 | { | 75 | { |
| @@ -488,8 +346,15 @@ static inline void bvec_kunmap_irq(char *buffer, unsigned long *flags) | |||
| 488 | } | 346 | } |
| 489 | 347 | ||
| 490 | #else | 348 | #else |
| 491 | #define bvec_kmap_irq(bvec, flags) (page_address((bvec)->bv_page) + (bvec)->bv_offset) | 349 | static inline char *bvec_kmap_irq(struct bio_vec *bvec, unsigned long *flags) |
| 492 | #define bvec_kunmap_irq(buf, flags) do { *(flags) = 0; } while (0) | 350 | { |
| 351 | return page_address(bvec->bv_page) + bvec->bv_offset; | ||
| 352 | } | ||
| 353 | |||
| 354 | static inline void bvec_kunmap_irq(char *buffer, unsigned long *flags) | ||
| 355 | { | ||
| 356 | *flags = 0; | ||
| 357 | } | ||
| 493 | #endif | 358 | #endif |
| 494 | 359 | ||
| 495 | static inline char *__bio_kmap_irq(struct bio *bio, unsigned short idx, | 360 | static inline char *__bio_kmap_irq(struct bio *bio, unsigned short idx, |
| @@ -638,6 +503,10 @@ static inline struct bio *bio_list_get(struct bio_list *bl) | |||
| 638 | #define bip_for_each_vec(bvl, bip, i) \ | 503 | #define bip_for_each_vec(bvl, bip, i) \ |
| 639 | __bip_for_each_vec(bvl, bip, i, (bip)->bip_idx) | 504 | __bip_for_each_vec(bvl, bip, i, (bip)->bip_idx) |
| 640 | 505 | ||
| 506 | #define bio_for_each_integrity_vec(_bvl, _bio, _iter) \ | ||
| 507 | for_each_bio(_bio) \ | ||
| 508 | bip_for_each_vec(_bvl, _bio->bi_integrity, _iter) | ||
| 509 | |||
| 641 | #define bio_integrity(bio) (bio->bi_integrity != NULL) | 510 | #define bio_integrity(bio) (bio->bi_integrity != NULL) |
| 642 | 511 | ||
| 643 | extern struct bio_integrity_payload *bio_integrity_alloc_bioset(struct bio *, gfp_t, unsigned int, struct bio_set *); | 512 | extern struct bio_integrity_payload *bio_integrity_alloc_bioset(struct bio *, gfp_t, unsigned int, struct bio_set *); |
diff --git a/include/linux/bitops.h b/include/linux/bitops.h index fc68053378ce..827cc95711ef 100644 --- a/include/linux/bitops.h +++ b/include/linux/bitops.h | |||
| @@ -136,28 +136,6 @@ static inline unsigned long __ffs64(u64 word) | |||
| 136 | } | 136 | } |
| 137 | 137 | ||
| 138 | #ifdef __KERNEL__ | 138 | #ifdef __KERNEL__ |
| 139 | #ifdef CONFIG_GENERIC_FIND_FIRST_BIT | ||
| 140 | |||
| 141 | /** | ||
| 142 | * find_first_bit - find the first set bit in a memory region | ||
| 143 | * @addr: The address to start the search at | ||
| 144 | * @size: The maximum size to search | ||
| 145 | * | ||
| 146 | * Returns the bit number of the first set bit. | ||
| 147 | */ | ||
| 148 | extern unsigned long find_first_bit(const unsigned long *addr, | ||
| 149 | unsigned long size); | ||
| 150 | |||
| 151 | /** | ||
| 152 | * find_first_zero_bit - find the first cleared bit in a memory region | ||
| 153 | * @addr: The address to start the search at | ||
| 154 | * @size: The maximum size to search | ||
| 155 | * | ||
| 156 | * Returns the bit number of the first cleared bit. | ||
| 157 | */ | ||
| 158 | extern unsigned long find_first_zero_bit(const unsigned long *addr, | ||
| 159 | unsigned long size); | ||
| 160 | #endif /* CONFIG_GENERIC_FIND_FIRST_BIT */ | ||
| 161 | 139 | ||
| 162 | #ifdef CONFIG_GENERIC_FIND_LAST_BIT | 140 | #ifdef CONFIG_GENERIC_FIND_LAST_BIT |
| 163 | /** | 141 | /** |
| @@ -171,28 +149,5 @@ extern unsigned long find_last_bit(const unsigned long *addr, | |||
| 171 | unsigned long size); | 149 | unsigned long size); |
| 172 | #endif /* CONFIG_GENERIC_FIND_LAST_BIT */ | 150 | #endif /* CONFIG_GENERIC_FIND_LAST_BIT */ |
| 173 | 151 | ||
| 174 | #ifdef CONFIG_GENERIC_FIND_NEXT_BIT | ||
| 175 | |||
| 176 | /** | ||
| 177 | * find_next_bit - find the next set bit in a memory region | ||
| 178 | * @addr: The address to base the search on | ||
| 179 | * @offset: The bitnumber to start searching at | ||
| 180 | * @size: The bitmap size in bits | ||
| 181 | */ | ||
| 182 | extern unsigned long find_next_bit(const unsigned long *addr, | ||
| 183 | unsigned long size, unsigned long offset); | ||
| 184 | |||
| 185 | /** | ||
| 186 | * find_next_zero_bit - find the next cleared bit in a memory region | ||
| 187 | * @addr: The address to base the search on | ||
| 188 | * @offset: The bitnumber to start searching at | ||
| 189 | * @size: The bitmap size in bits | ||
| 190 | */ | ||
| 191 | |||
| 192 | extern unsigned long find_next_zero_bit(const unsigned long *addr, | ||
| 193 | unsigned long size, | ||
| 194 | unsigned long offset); | ||
| 195 | |||
| 196 | #endif /* CONFIG_GENERIC_FIND_NEXT_BIT */ | ||
| 197 | #endif /* __KERNEL__ */ | 152 | #endif /* __KERNEL__ */ |
| 198 | #endif | 153 | #endif |
diff --git a/include/linux/blk_types.h b/include/linux/blk_types.h new file mode 100644 index 000000000000..0437ab6bb54c --- /dev/null +++ b/include/linux/blk_types.h | |||
| @@ -0,0 +1,197 @@ | |||
| 1 | /* | ||
| 2 | * Block data types and constants. Directly include this file only to | ||
| 3 | * break include dependency loop. | ||
| 4 | */ | ||
| 5 | #ifndef __LINUX_BLK_TYPES_H | ||
| 6 | #define __LINUX_BLK_TYPES_H | ||
| 7 | |||
| 8 | #ifdef CONFIG_BLOCK | ||
| 9 | |||
| 10 | #include <linux/types.h> | ||
| 11 | |||
| 12 | struct bio_set; | ||
| 13 | struct bio; | ||
| 14 | struct bio_integrity_payload; | ||
| 15 | struct page; | ||
| 16 | struct block_device; | ||
| 17 | typedef void (bio_end_io_t) (struct bio *, int); | ||
| 18 | typedef void (bio_destructor_t) (struct bio *); | ||
| 19 | |||
| 20 | /* | ||
| 21 | * was unsigned short, but we might as well be ready for > 64kB I/O pages | ||
| 22 | */ | ||
| 23 | struct bio_vec { | ||
| 24 | struct page *bv_page; | ||
| 25 | unsigned int bv_len; | ||
| 26 | unsigned int bv_offset; | ||
| 27 | }; | ||
| 28 | |||
| 29 | /* | ||
| 30 | * main unit of I/O for the block layer and lower layers (ie drivers and | ||
| 31 | * stacking drivers) | ||
| 32 | */ | ||
| 33 | struct bio { | ||
| 34 | sector_t bi_sector; /* device address in 512 byte | ||
| 35 | sectors */ | ||
| 36 | struct bio *bi_next; /* request queue link */ | ||
| 37 | struct block_device *bi_bdev; | ||
| 38 | unsigned long bi_flags; /* status, command, etc */ | ||
| 39 | unsigned long bi_rw; /* bottom bits READ/WRITE, | ||
| 40 | * top bits priority | ||
| 41 | */ | ||
| 42 | |||
| 43 | unsigned short bi_vcnt; /* how many bio_vec's */ | ||
| 44 | unsigned short bi_idx; /* current index into bvl_vec */ | ||
| 45 | |||
| 46 | /* Number of segments in this BIO after | ||
| 47 | * physical address coalescing is performed. | ||
| 48 | */ | ||
| 49 | unsigned int bi_phys_segments; | ||
| 50 | |||
| 51 | unsigned int bi_size; /* residual I/O count */ | ||
| 52 | |||
| 53 | /* | ||
| 54 | * To keep track of the max segment size, we account for the | ||
| 55 | * sizes of the first and last mergeable segments in this bio. | ||
| 56 | */ | ||
| 57 | unsigned int bi_seg_front_size; | ||
| 58 | unsigned int bi_seg_back_size; | ||
| 59 | |||
| 60 | unsigned int bi_max_vecs; /* max bvl_vecs we can hold */ | ||
| 61 | |||
| 62 | unsigned int bi_comp_cpu; /* completion CPU */ | ||
| 63 | |||
| 64 | atomic_t bi_cnt; /* pin count */ | ||
| 65 | |||
| 66 | struct bio_vec *bi_io_vec; /* the actual vec list */ | ||
| 67 | |||
| 68 | bio_end_io_t *bi_end_io; | ||
| 69 | |||
| 70 | void *bi_private; | ||
| 71 | #if defined(CONFIG_BLK_DEV_INTEGRITY) | ||
| 72 | struct bio_integrity_payload *bi_integrity; /* data integrity */ | ||
| 73 | #endif | ||
| 74 | |||
| 75 | bio_destructor_t *bi_destructor; /* destructor */ | ||
| 76 | |||
| 77 | /* | ||
| 78 | * We can inline a number of vecs at the end of the bio, to avoid | ||
| 79 | * double allocations for a small number of bio_vecs. This member | ||
| 80 | * MUST obviously be kept at the very end of the bio. | ||
| 81 | */ | ||
| 82 | struct bio_vec bi_inline_vecs[0]; | ||
| 83 | }; | ||
| 84 | |||
| 85 | /* | ||
| 86 | * bio flags | ||
| 87 | */ | ||
| 88 | #define BIO_UPTODATE 0 /* ok after I/O completion */ | ||
| 89 | #define BIO_RW_BLOCK 1 /* RW_AHEAD set, and read/write would block */ | ||
| 90 | #define BIO_EOF 2 /* out-out-bounds error */ | ||
| 91 | #define BIO_SEG_VALID 3 /* bi_phys_segments valid */ | ||
| 92 | #define BIO_CLONED 4 /* doesn't own data */ | ||
| 93 | #define BIO_BOUNCED 5 /* bio is a bounce bio */ | ||
| 94 | #define BIO_USER_MAPPED 6 /* contains user pages */ | ||
| 95 | #define BIO_EOPNOTSUPP 7 /* not supported */ | ||
| 96 | #define BIO_CPU_AFFINE 8 /* complete bio on same CPU as submitted */ | ||
| 97 | #define BIO_NULL_MAPPED 9 /* contains invalid user pages */ | ||
| 98 | #define BIO_FS_INTEGRITY 10 /* fs owns integrity data, not block layer */ | ||
| 99 | #define BIO_QUIET 11 /* Make BIO Quiet */ | ||
| 100 | #define BIO_MAPPED_INTEGRITY 12/* integrity metadata has been remapped */ | ||
| 101 | #define bio_flagged(bio, flag) ((bio)->bi_flags & (1 << (flag))) | ||
| 102 | |||
| 103 | /* | ||
| 104 | * top 4 bits of bio flags indicate the pool this bio came from | ||
| 105 | */ | ||
| 106 | #define BIO_POOL_BITS (4) | ||
| 107 | #define BIO_POOL_NONE ((1UL << BIO_POOL_BITS) - 1) | ||
| 108 | #define BIO_POOL_OFFSET (BITS_PER_LONG - BIO_POOL_BITS) | ||
| 109 | #define BIO_POOL_MASK (1UL << BIO_POOL_OFFSET) | ||
| 110 | #define BIO_POOL_IDX(bio) ((bio)->bi_flags >> BIO_POOL_OFFSET) | ||
| 111 | |||
| 112 | #endif /* CONFIG_BLOCK */ | ||
| 113 | |||
| 114 | /* | ||
| 115 | * Request flags. For use in the cmd_flags field of struct request, and in | ||
| 116 | * bi_rw of struct bio. Note that some flags are only valid in either one. | ||
| 117 | */ | ||
| 118 | enum rq_flag_bits { | ||
| 119 | /* common flags */ | ||
| 120 | __REQ_WRITE, /* not set, read. set, write */ | ||
| 121 | __REQ_FAILFAST_DEV, /* no driver retries of device errors */ | ||
| 122 | __REQ_FAILFAST_TRANSPORT, /* no driver retries of transport errors */ | ||
| 123 | __REQ_FAILFAST_DRIVER, /* no driver retries of driver errors */ | ||
| 124 | |||
| 125 | __REQ_HARDBARRIER, /* may not be passed by drive either */ | ||
| 126 | __REQ_SYNC, /* request is sync (sync write or read) */ | ||
| 127 | __REQ_META, /* metadata io request */ | ||
| 128 | __REQ_DISCARD, /* request to discard sectors */ | ||
| 129 | __REQ_NOIDLE, /* don't anticipate more IO after this one */ | ||
| 130 | |||
| 131 | /* bio only flags */ | ||
| 132 | __REQ_UNPLUG, /* unplug the immediately after submission */ | ||
| 133 | __REQ_RAHEAD, /* read ahead, can fail anytime */ | ||
| 134 | __REQ_THROTTLED, /* This bio has already been subjected to | ||
| 135 | * throttling rules. Don't do it again. */ | ||
| 136 | |||
| 137 | /* request only flags */ | ||
| 138 | __REQ_SORTED, /* elevator knows about this request */ | ||
| 139 | __REQ_SOFTBARRIER, /* may not be passed by ioscheduler */ | ||
| 140 | __REQ_FUA, /* forced unit access */ | ||
| 141 | __REQ_NOMERGE, /* don't touch this for merging */ | ||
| 142 | __REQ_STARTED, /* drive already may have started this one */ | ||
| 143 | __REQ_DONTPREP, /* don't call prep for this one */ | ||
| 144 | __REQ_QUEUED, /* uses queueing */ | ||
| 145 | __REQ_ELVPRIV, /* elevator private data attached */ | ||
| 146 | __REQ_FAILED, /* set if the request failed */ | ||
| 147 | __REQ_QUIET, /* don't worry about errors */ | ||
| 148 | __REQ_PREEMPT, /* set for "ide_preempt" requests */ | ||
| 149 | __REQ_ALLOCED, /* request came from our alloc pool */ | ||
| 150 | __REQ_COPY_USER, /* contains copies of user pages */ | ||
| 151 | __REQ_FLUSH, /* request for cache flush */ | ||
| 152 | __REQ_IO_STAT, /* account I/O stat */ | ||
| 153 | __REQ_MIXED_MERGE, /* merge of different types, fail separately */ | ||
| 154 | __REQ_SECURE, /* secure discard (used with __REQ_DISCARD) */ | ||
| 155 | __REQ_NR_BITS, /* stops here */ | ||
| 156 | }; | ||
| 157 | |||
| 158 | #define REQ_WRITE (1 << __REQ_WRITE) | ||
| 159 | #define REQ_FAILFAST_DEV (1 << __REQ_FAILFAST_DEV) | ||
| 160 | #define REQ_FAILFAST_TRANSPORT (1 << __REQ_FAILFAST_TRANSPORT) | ||
| 161 | #define REQ_FAILFAST_DRIVER (1 << __REQ_FAILFAST_DRIVER) | ||
| 162 | #define REQ_HARDBARRIER (1 << __REQ_HARDBARRIER) | ||
| 163 | #define REQ_SYNC (1 << __REQ_SYNC) | ||
| 164 | #define REQ_META (1 << __REQ_META) | ||
| 165 | #define REQ_DISCARD (1 << __REQ_DISCARD) | ||
| 166 | #define REQ_NOIDLE (1 << __REQ_NOIDLE) | ||
| 167 | |||
| 168 | #define REQ_FAILFAST_MASK \ | ||
| 169 | (REQ_FAILFAST_DEV | REQ_FAILFAST_TRANSPORT | REQ_FAILFAST_DRIVER) | ||
| 170 | #define REQ_COMMON_MASK \ | ||
| 171 | (REQ_WRITE | REQ_FAILFAST_MASK | REQ_HARDBARRIER | REQ_SYNC | \ | ||
| 172 | REQ_META | REQ_DISCARD | REQ_NOIDLE | REQ_FLUSH | REQ_FUA) | ||
| 173 | #define REQ_CLONE_MASK REQ_COMMON_MASK | ||
| 174 | |||
| 175 | #define REQ_UNPLUG (1 << __REQ_UNPLUG) | ||
| 176 | #define REQ_RAHEAD (1 << __REQ_RAHEAD) | ||
| 177 | #define REQ_THROTTLED (1 << __REQ_THROTTLED) | ||
| 178 | |||
| 179 | #define REQ_SORTED (1 << __REQ_SORTED) | ||
| 180 | #define REQ_SOFTBARRIER (1 << __REQ_SOFTBARRIER) | ||
| 181 | #define REQ_FUA (1 << __REQ_FUA) | ||
| 182 | #define REQ_NOMERGE (1 << __REQ_NOMERGE) | ||
| 183 | #define REQ_STARTED (1 << __REQ_STARTED) | ||
| 184 | #define REQ_DONTPREP (1 << __REQ_DONTPREP) | ||
| 185 | #define REQ_QUEUED (1 << __REQ_QUEUED) | ||
| 186 | #define REQ_ELVPRIV (1 << __REQ_ELVPRIV) | ||
| 187 | #define REQ_FAILED (1 << __REQ_FAILED) | ||
| 188 | #define REQ_QUIET (1 << __REQ_QUIET) | ||
| 189 | #define REQ_PREEMPT (1 << __REQ_PREEMPT) | ||
| 190 | #define REQ_ALLOCED (1 << __REQ_ALLOCED) | ||
| 191 | #define REQ_COPY_USER (1 << __REQ_COPY_USER) | ||
| 192 | #define REQ_FLUSH (1 << __REQ_FLUSH) | ||
| 193 | #define REQ_IO_STAT (1 << __REQ_IO_STAT) | ||
| 194 | #define REQ_MIXED_MERGE (1 << __REQ_MIXED_MERGE) | ||
| 195 | #define REQ_SECURE (1 << __REQ_SECURE) | ||
| 196 | |||
| 197 | #endif /* __LINUX_BLK_TYPES_H */ | ||
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 09a840264d6f..5027a599077d 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h | |||
| @@ -60,7 +60,6 @@ enum rq_cmd_type_bits { | |||
| 60 | REQ_TYPE_PM_RESUME, /* resume request */ | 60 | REQ_TYPE_PM_RESUME, /* resume request */ |
| 61 | REQ_TYPE_PM_SHUTDOWN, /* shutdown request */ | 61 | REQ_TYPE_PM_SHUTDOWN, /* shutdown request */ |
| 62 | REQ_TYPE_SPECIAL, /* driver defined type */ | 62 | REQ_TYPE_SPECIAL, /* driver defined type */ |
| 63 | REQ_TYPE_LINUX_BLOCK, /* generic block layer message */ | ||
| 64 | /* | 63 | /* |
| 65 | * for ATA/ATAPI devices. this really doesn't belong here, ide should | 64 | * for ATA/ATAPI devices. this really doesn't belong here, ide should |
| 66 | * use REQ_TYPE_SPECIAL and use rq->cmd[0] with the range of driver | 65 | * use REQ_TYPE_SPECIAL and use rq->cmd[0] with the range of driver |
| @@ -70,84 +69,6 @@ enum rq_cmd_type_bits { | |||
| 70 | REQ_TYPE_ATA_PC, | 69 | REQ_TYPE_ATA_PC, |
| 71 | }; | 70 | }; |
| 72 | 71 | ||
| 73 | /* | ||
| 74 | * For request of type REQ_TYPE_LINUX_BLOCK, rq->cmd[0] is the opcode being | ||
| 75 | * sent down (similar to how REQ_TYPE_BLOCK_PC means that ->cmd[] holds a | ||
| 76 | * SCSI cdb. | ||
| 77 | * | ||
| 78 | * 0x00 -> 0x3f are driver private, to be used for whatever purpose they need, | ||
| 79 | * typically to differentiate REQ_TYPE_SPECIAL requests. | ||
| 80 | * | ||
| 81 | */ | ||
| 82 | enum { | ||
| 83 | REQ_LB_OP_EJECT = 0x40, /* eject request */ | ||
| 84 | REQ_LB_OP_FLUSH = 0x41, /* flush request */ | ||
| 85 | }; | ||
| 86 | |||
| 87 | /* | ||
| 88 | * request type modified bits. first four bits match BIO_RW* bits, important | ||
| 89 | */ | ||
| 90 | enum rq_flag_bits { | ||
| 91 | __REQ_RW, /* not set, read. set, write */ | ||
| 92 | __REQ_FAILFAST_DEV, /* no driver retries of device errors */ | ||
| 93 | __REQ_FAILFAST_TRANSPORT, /* no driver retries of transport errors */ | ||
| 94 | __REQ_FAILFAST_DRIVER, /* no driver retries of driver errors */ | ||
| 95 | /* above flags must match BIO_RW_* */ | ||
| 96 | __REQ_DISCARD, /* request to discard sectors */ | ||
| 97 | __REQ_SORTED, /* elevator knows about this request */ | ||
| 98 | __REQ_SOFTBARRIER, /* may not be passed by ioscheduler */ | ||
| 99 | __REQ_HARDBARRIER, /* may not be passed by drive either */ | ||
| 100 | __REQ_FUA, /* forced unit access */ | ||
| 101 | __REQ_NOMERGE, /* don't touch this for merging */ | ||
| 102 | __REQ_STARTED, /* drive already may have started this one */ | ||
| 103 | __REQ_DONTPREP, /* don't call prep for this one */ | ||
| 104 | __REQ_QUEUED, /* uses queueing */ | ||
| 105 | __REQ_ELVPRIV, /* elevator private data attached */ | ||
| 106 | __REQ_FAILED, /* set if the request failed */ | ||
| 107 | __REQ_QUIET, /* don't worry about errors */ | ||
| 108 | __REQ_PREEMPT, /* set for "ide_preempt" requests */ | ||
| 109 | __REQ_ORDERED_COLOR, /* is before or after barrier */ | ||
| 110 | __REQ_RW_SYNC, /* request is sync (sync write or read) */ | ||
| 111 | __REQ_ALLOCED, /* request came from our alloc pool */ | ||
| 112 | __REQ_RW_META, /* metadata io request */ | ||
| 113 | __REQ_COPY_USER, /* contains copies of user pages */ | ||
| 114 | __REQ_INTEGRITY, /* integrity metadata has been remapped */ | ||
| 115 | __REQ_NOIDLE, /* Don't anticipate more IO after this one */ | ||
| 116 | __REQ_IO_STAT, /* account I/O stat */ | ||
| 117 | __REQ_MIXED_MERGE, /* merge of different types, fail separately */ | ||
| 118 | __REQ_NR_BITS, /* stops here */ | ||
| 119 | }; | ||
| 120 | |||
| 121 | #define REQ_RW (1 << __REQ_RW) | ||
| 122 | #define REQ_FAILFAST_DEV (1 << __REQ_FAILFAST_DEV) | ||
| 123 | #define REQ_FAILFAST_TRANSPORT (1 << __REQ_FAILFAST_TRANSPORT) | ||
| 124 | #define REQ_FAILFAST_DRIVER (1 << __REQ_FAILFAST_DRIVER) | ||
| 125 | #define REQ_DISCARD (1 << __REQ_DISCARD) | ||
| 126 | #define REQ_SORTED (1 << __REQ_SORTED) | ||
| 127 | #define REQ_SOFTBARRIER (1 << __REQ_SOFTBARRIER) | ||
| 128 | #define REQ_HARDBARRIER (1 << __REQ_HARDBARRIER) | ||
| 129 | #define REQ_FUA (1 << __REQ_FUA) | ||
| 130 | #define REQ_NOMERGE (1 << __REQ_NOMERGE) | ||
| 131 | #define REQ_STARTED (1 << __REQ_STARTED) | ||
| 132 | #define REQ_DONTPREP (1 << __REQ_DONTPREP) | ||
| 133 | #define REQ_QUEUED (1 << __REQ_QUEUED) | ||
| 134 | #define REQ_ELVPRIV (1 << __REQ_ELVPRIV) | ||
| 135 | #define REQ_FAILED (1 << __REQ_FAILED) | ||
| 136 | #define REQ_QUIET (1 << __REQ_QUIET) | ||
| 137 | #define REQ_PREEMPT (1 << __REQ_PREEMPT) | ||
| 138 | #define REQ_ORDERED_COLOR (1 << __REQ_ORDERED_COLOR) | ||
| 139 | #define REQ_RW_SYNC (1 << __REQ_RW_SYNC) | ||
| 140 | #define REQ_ALLOCED (1 << __REQ_ALLOCED) | ||
| 141 | #define REQ_RW_META (1 << __REQ_RW_META) | ||
| 142 | #define REQ_COPY_USER (1 << __REQ_COPY_USER) | ||
| 143 | #define REQ_INTEGRITY (1 << __REQ_INTEGRITY) | ||
| 144 | #define REQ_NOIDLE (1 << __REQ_NOIDLE) | ||
| 145 | #define REQ_IO_STAT (1 << __REQ_IO_STAT) | ||
| 146 | #define REQ_MIXED_MERGE (1 << __REQ_MIXED_MERGE) | ||
| 147 | |||
| 148 | #define REQ_FAILFAST_MASK (REQ_FAILFAST_DEV | REQ_FAILFAST_TRANSPORT | \ | ||
| 149 | REQ_FAILFAST_DRIVER) | ||
| 150 | |||
| 151 | #define BLK_MAX_CDB 16 | 72 | #define BLK_MAX_CDB 16 |
| 152 | 73 | ||
| 153 | /* | 74 | /* |
| @@ -203,6 +124,9 @@ struct request { | |||
| 203 | * physical address coalescing is performed. | 124 | * physical address coalescing is performed. |
| 204 | */ | 125 | */ |
| 205 | unsigned short nr_phys_segments; | 126 | unsigned short nr_phys_segments; |
| 127 | #if defined(CONFIG_BLK_DEV_INTEGRITY) | ||
| 128 | unsigned short nr_integrity_segments; | ||
| 129 | #endif | ||
| 206 | 130 | ||
| 207 | unsigned short ioprio; | 131 | unsigned short ioprio; |
| 208 | 132 | ||
| @@ -264,6 +188,7 @@ struct request_pm_state | |||
| 264 | typedef void (request_fn_proc) (struct request_queue *q); | 188 | typedef void (request_fn_proc) (struct request_queue *q); |
| 265 | typedef int (make_request_fn) (struct request_queue *q, struct bio *bio); | 189 | typedef int (make_request_fn) (struct request_queue *q, struct bio *bio); |
| 266 | typedef int (prep_rq_fn) (struct request_queue *, struct request *); | 190 | typedef int (prep_rq_fn) (struct request_queue *, struct request *); |
| 191 | typedef void (unprep_rq_fn) (struct request_queue *, struct request *); | ||
| 267 | typedef void (unplug_fn) (struct request_queue *); | 192 | typedef void (unplug_fn) (struct request_queue *); |
| 268 | 193 | ||
| 269 | struct bio_vec; | 194 | struct bio_vec; |
| @@ -275,7 +200,6 @@ struct bvec_merge_data { | |||
| 275 | }; | 200 | }; |
| 276 | typedef int (merge_bvec_fn) (struct request_queue *, struct bvec_merge_data *, | 201 | typedef int (merge_bvec_fn) (struct request_queue *, struct bvec_merge_data *, |
| 277 | struct bio_vec *); | 202 | struct bio_vec *); |
| 278 | typedef void (prepare_flush_fn) (struct request_queue *, struct request *); | ||
| 279 | typedef void (softirq_done_fn)(struct request *); | 203 | typedef void (softirq_done_fn)(struct request *); |
| 280 | typedef int (dma_drain_needed_fn)(struct request *); | 204 | typedef int (dma_drain_needed_fn)(struct request *); |
| 281 | typedef int (lld_busy_fn) (struct request_queue *q); | 205 | typedef int (lld_busy_fn) (struct request_queue *q); |
| @@ -322,6 +246,7 @@ struct queue_limits { | |||
| 322 | 246 | ||
| 323 | unsigned short logical_block_size; | 247 | unsigned short logical_block_size; |
| 324 | unsigned short max_segments; | 248 | unsigned short max_segments; |
| 249 | unsigned short max_integrity_segments; | ||
| 325 | 250 | ||
| 326 | unsigned char misaligned; | 251 | unsigned char misaligned; |
| 327 | unsigned char discard_misaligned; | 252 | unsigned char discard_misaligned; |
| @@ -346,9 +271,9 @@ struct request_queue | |||
| 346 | request_fn_proc *request_fn; | 271 | request_fn_proc *request_fn; |
| 347 | make_request_fn *make_request_fn; | 272 | make_request_fn *make_request_fn; |
| 348 | prep_rq_fn *prep_rq_fn; | 273 | prep_rq_fn *prep_rq_fn; |
| 274 | unprep_rq_fn *unprep_rq_fn; | ||
| 349 | unplug_fn *unplug_fn; | 275 | unplug_fn *unplug_fn; |
| 350 | merge_bvec_fn *merge_bvec_fn; | 276 | merge_bvec_fn *merge_bvec_fn; |
| 351 | prepare_flush_fn *prepare_flush_fn; | ||
| 352 | softirq_done_fn *softirq_done_fn; | 277 | softirq_done_fn *softirq_done_fn; |
| 353 | rq_timed_out_fn *rq_timed_out_fn; | 278 | rq_timed_out_fn *rq_timed_out_fn; |
| 354 | dma_drain_needed_fn *dma_drain_needed; | 279 | dma_drain_needed_fn *dma_drain_needed; |
| @@ -434,18 +359,25 @@ struct request_queue | |||
| 434 | struct blk_trace *blk_trace; | 359 | struct blk_trace *blk_trace; |
| 435 | #endif | 360 | #endif |
| 436 | /* | 361 | /* |
| 437 | * reserved for flush operations | 362 | * for flush operations |
| 438 | */ | 363 | */ |
| 439 | unsigned int ordered, next_ordered, ordseq; | 364 | unsigned int flush_flags; |
| 440 | int orderr, ordcolor; | 365 | unsigned int flush_seq; |
| 441 | struct request pre_flush_rq, bar_rq, post_flush_rq; | 366 | int flush_err; |
| 442 | struct request *orig_bar_rq; | 367 | struct request flush_rq; |
| 368 | struct request *orig_flush_rq; | ||
| 369 | struct list_head pending_flushes; | ||
| 443 | 370 | ||
| 444 | struct mutex sysfs_lock; | 371 | struct mutex sysfs_lock; |
| 445 | 372 | ||
| 446 | #if defined(CONFIG_BLK_DEV_BSG) | 373 | #if defined(CONFIG_BLK_DEV_BSG) |
| 447 | struct bsg_class_device bsg_dev; | 374 | struct bsg_class_device bsg_dev; |
| 448 | #endif | 375 | #endif |
| 376 | |||
| 377 | #ifdef CONFIG_BLK_DEV_THROTTLING | ||
| 378 | /* Throttle data */ | ||
| 379 | struct throtl_data *td; | ||
| 380 | #endif | ||
| 449 | }; | 381 | }; |
| 450 | 382 | ||
| 451 | #define QUEUE_FLAG_CLUSTER 0 /* cluster several segments into 1 */ | 383 | #define QUEUE_FLAG_CLUSTER 0 /* cluster several segments into 1 */ |
| @@ -467,11 +399,14 @@ struct request_queue | |||
| 467 | #define QUEUE_FLAG_IO_STAT 15 /* do IO stats */ | 399 | #define QUEUE_FLAG_IO_STAT 15 /* do IO stats */ |
| 468 | #define QUEUE_FLAG_DISCARD 16 /* supports DISCARD */ | 400 | #define QUEUE_FLAG_DISCARD 16 /* supports DISCARD */ |
| 469 | #define QUEUE_FLAG_NOXMERGES 17 /* No extended merges */ | 401 | #define QUEUE_FLAG_NOXMERGES 17 /* No extended merges */ |
| 402 | #define QUEUE_FLAG_ADD_RANDOM 18 /* Contributes to random pool */ | ||
| 403 | #define QUEUE_FLAG_SECDISCARD 19 /* supports SECDISCARD */ | ||
| 470 | 404 | ||
| 471 | #define QUEUE_FLAG_DEFAULT ((1 << QUEUE_FLAG_IO_STAT) | \ | 405 | #define QUEUE_FLAG_DEFAULT ((1 << QUEUE_FLAG_IO_STAT) | \ |
| 472 | (1 << QUEUE_FLAG_CLUSTER) | \ | 406 | (1 << QUEUE_FLAG_CLUSTER) | \ |
| 473 | (1 << QUEUE_FLAG_STACKABLE) | \ | 407 | (1 << QUEUE_FLAG_STACKABLE) | \ |
| 474 | (1 << QUEUE_FLAG_SAME_COMP)) | 408 | (1 << QUEUE_FLAG_SAME_COMP) | \ |
| 409 | (1 << QUEUE_FLAG_ADD_RANDOM)) | ||
| 475 | 410 | ||
| 476 | static inline int queue_is_locked(struct request_queue *q) | 411 | static inline int queue_is_locked(struct request_queue *q) |
| 477 | { | 412 | { |
| @@ -538,56 +473,6 @@ static inline void queue_flag_clear(unsigned int flag, struct request_queue *q) | |||
| 538 | __clear_bit(flag, &q->queue_flags); | 473 | __clear_bit(flag, &q->queue_flags); |
| 539 | } | 474 | } |
| 540 | 475 | ||
| 541 | enum { | ||
| 542 | /* | ||
| 543 | * Hardbarrier is supported with one of the following methods. | ||
| 544 | * | ||
| 545 | * NONE : hardbarrier unsupported | ||
| 546 | * DRAIN : ordering by draining is enough | ||
| 547 | * DRAIN_FLUSH : ordering by draining w/ pre and post flushes | ||
| 548 | * DRAIN_FUA : ordering by draining w/ pre flush and FUA write | ||
| 549 | * TAG : ordering by tag is enough | ||
| 550 | * TAG_FLUSH : ordering by tag w/ pre and post flushes | ||
| 551 | * TAG_FUA : ordering by tag w/ pre flush and FUA write | ||
| 552 | */ | ||
| 553 | QUEUE_ORDERED_BY_DRAIN = 0x01, | ||
| 554 | QUEUE_ORDERED_BY_TAG = 0x02, | ||
| 555 | QUEUE_ORDERED_DO_PREFLUSH = 0x10, | ||
| 556 | QUEUE_ORDERED_DO_BAR = 0x20, | ||
| 557 | QUEUE_ORDERED_DO_POSTFLUSH = 0x40, | ||
| 558 | QUEUE_ORDERED_DO_FUA = 0x80, | ||
| 559 | |||
| 560 | QUEUE_ORDERED_NONE = 0x00, | ||
| 561 | |||
| 562 | QUEUE_ORDERED_DRAIN = QUEUE_ORDERED_BY_DRAIN | | ||
| 563 | QUEUE_ORDERED_DO_BAR, | ||
| 564 | QUEUE_ORDERED_DRAIN_FLUSH = QUEUE_ORDERED_DRAIN | | ||
| 565 | QUEUE_ORDERED_DO_PREFLUSH | | ||
| 566 | QUEUE_ORDERED_DO_POSTFLUSH, | ||
| 567 | QUEUE_ORDERED_DRAIN_FUA = QUEUE_ORDERED_DRAIN | | ||
| 568 | QUEUE_ORDERED_DO_PREFLUSH | | ||
| 569 | QUEUE_ORDERED_DO_FUA, | ||
| 570 | |||
| 571 | QUEUE_ORDERED_TAG = QUEUE_ORDERED_BY_TAG | | ||
| 572 | QUEUE_ORDERED_DO_BAR, | ||
| 573 | QUEUE_ORDERED_TAG_FLUSH = QUEUE_ORDERED_TAG | | ||
| 574 | QUEUE_ORDERED_DO_PREFLUSH | | ||
| 575 | QUEUE_ORDERED_DO_POSTFLUSH, | ||
| 576 | QUEUE_ORDERED_TAG_FUA = QUEUE_ORDERED_TAG | | ||
| 577 | QUEUE_ORDERED_DO_PREFLUSH | | ||
| 578 | QUEUE_ORDERED_DO_FUA, | ||
| 579 | |||
| 580 | /* | ||
| 581 | * Ordered operation sequence | ||
| 582 | */ | ||
| 583 | QUEUE_ORDSEQ_STARTED = 0x01, /* flushing in progress */ | ||
| 584 | QUEUE_ORDSEQ_DRAIN = 0x02, /* waiting for the queue to be drained */ | ||
| 585 | QUEUE_ORDSEQ_PREFLUSH = 0x04, /* pre-flushing in progress */ | ||
| 586 | QUEUE_ORDSEQ_BAR = 0x08, /* original barrier req in progress */ | ||
| 587 | QUEUE_ORDSEQ_POSTFLUSH = 0x10, /* post-flushing in progress */ | ||
| 588 | QUEUE_ORDSEQ_DONE = 0x20, | ||
| 589 | }; | ||
| 590 | |||
| 591 | #define blk_queue_plugged(q) test_bit(QUEUE_FLAG_PLUGGED, &(q)->queue_flags) | 476 | #define blk_queue_plugged(q) test_bit(QUEUE_FLAG_PLUGGED, &(q)->queue_flags) |
| 592 | #define blk_queue_tagged(q) test_bit(QUEUE_FLAG_QUEUED, &(q)->queue_flags) | 477 | #define blk_queue_tagged(q) test_bit(QUEUE_FLAG_QUEUED, &(q)->queue_flags) |
| 593 | #define blk_queue_stopped(q) test_bit(QUEUE_FLAG_STOPPED, &(q)->queue_flags) | 478 | #define blk_queue_stopped(q) test_bit(QUEUE_FLAG_STOPPED, &(q)->queue_flags) |
| @@ -596,38 +481,27 @@ enum { | |||
| 596 | test_bit(QUEUE_FLAG_NOXMERGES, &(q)->queue_flags) | 481 | test_bit(QUEUE_FLAG_NOXMERGES, &(q)->queue_flags) |
| 597 | #define blk_queue_nonrot(q) test_bit(QUEUE_FLAG_NONROT, &(q)->queue_flags) | 482 | #define blk_queue_nonrot(q) test_bit(QUEUE_FLAG_NONROT, &(q)->queue_flags) |
| 598 | #define blk_queue_io_stat(q) test_bit(QUEUE_FLAG_IO_STAT, &(q)->queue_flags) | 483 | #define blk_queue_io_stat(q) test_bit(QUEUE_FLAG_IO_STAT, &(q)->queue_flags) |
| 599 | #define blk_queue_flushing(q) ((q)->ordseq) | 484 | #define blk_queue_add_random(q) test_bit(QUEUE_FLAG_ADD_RANDOM, &(q)->queue_flags) |
| 600 | #define blk_queue_stackable(q) \ | 485 | #define blk_queue_stackable(q) \ |
| 601 | test_bit(QUEUE_FLAG_STACKABLE, &(q)->queue_flags) | 486 | test_bit(QUEUE_FLAG_STACKABLE, &(q)->queue_flags) |
| 602 | #define blk_queue_discard(q) test_bit(QUEUE_FLAG_DISCARD, &(q)->queue_flags) | 487 | #define blk_queue_discard(q) test_bit(QUEUE_FLAG_DISCARD, &(q)->queue_flags) |
| 488 | #define blk_queue_secdiscard(q) (blk_queue_discard(q) && \ | ||
| 489 | test_bit(QUEUE_FLAG_SECDISCARD, &(q)->queue_flags)) | ||
| 490 | |||
| 491 | #define blk_noretry_request(rq) \ | ||
| 492 | ((rq)->cmd_flags & (REQ_FAILFAST_DEV|REQ_FAILFAST_TRANSPORT| \ | ||
| 493 | REQ_FAILFAST_DRIVER)) | ||
| 494 | |||
| 495 | #define blk_account_rq(rq) \ | ||
| 496 | (((rq)->cmd_flags & REQ_STARTED) && \ | ||
| 497 | ((rq)->cmd_type == REQ_TYPE_FS || \ | ||
| 498 | ((rq)->cmd_flags & REQ_DISCARD))) | ||
| 603 | 499 | ||
| 604 | #define blk_fs_request(rq) ((rq)->cmd_type == REQ_TYPE_FS) | ||
| 605 | #define blk_pc_request(rq) ((rq)->cmd_type == REQ_TYPE_BLOCK_PC) | ||
| 606 | #define blk_special_request(rq) ((rq)->cmd_type == REQ_TYPE_SPECIAL) | ||
| 607 | #define blk_sense_request(rq) ((rq)->cmd_type == REQ_TYPE_SENSE) | ||
| 608 | |||
| 609 | #define blk_failfast_dev(rq) ((rq)->cmd_flags & REQ_FAILFAST_DEV) | ||
| 610 | #define blk_failfast_transport(rq) ((rq)->cmd_flags & REQ_FAILFAST_TRANSPORT) | ||
| 611 | #define blk_failfast_driver(rq) ((rq)->cmd_flags & REQ_FAILFAST_DRIVER) | ||
| 612 | #define blk_noretry_request(rq) (blk_failfast_dev(rq) || \ | ||
| 613 | blk_failfast_transport(rq) || \ | ||
| 614 | blk_failfast_driver(rq)) | ||
| 615 | #define blk_rq_started(rq) ((rq)->cmd_flags & REQ_STARTED) | ||
| 616 | #define blk_rq_io_stat(rq) ((rq)->cmd_flags & REQ_IO_STAT) | ||
| 617 | #define blk_rq_quiet(rq) ((rq)->cmd_flags & REQ_QUIET) | ||
| 618 | |||
| 619 | #define blk_account_rq(rq) (blk_rq_started(rq) && (blk_fs_request(rq) || blk_discard_rq(rq))) | ||
| 620 | |||
| 621 | #define blk_pm_suspend_request(rq) ((rq)->cmd_type == REQ_TYPE_PM_SUSPEND) | ||
| 622 | #define blk_pm_resume_request(rq) ((rq)->cmd_type == REQ_TYPE_PM_RESUME) | ||
| 623 | #define blk_pm_request(rq) \ | 500 | #define blk_pm_request(rq) \ |
| 624 | (blk_pm_suspend_request(rq) || blk_pm_resume_request(rq)) | 501 | ((rq)->cmd_type == REQ_TYPE_PM_SUSPEND || \ |
| 502 | (rq)->cmd_type == REQ_TYPE_PM_RESUME) | ||
| 625 | 503 | ||
| 626 | #define blk_rq_cpu_valid(rq) ((rq)->cpu != -1) | 504 | #define blk_rq_cpu_valid(rq) ((rq)->cpu != -1) |
| 627 | #define blk_sorted_rq(rq) ((rq)->cmd_flags & REQ_SORTED) | ||
| 628 | #define blk_barrier_rq(rq) ((rq)->cmd_flags & REQ_HARDBARRIER) | ||
| 629 | #define blk_fua_rq(rq) ((rq)->cmd_flags & REQ_FUA) | ||
| 630 | #define blk_discard_rq(rq) ((rq)->cmd_flags & REQ_DISCARD) | ||
| 631 | #define blk_bidi_rq(rq) ((rq)->next_rq != NULL) | 505 | #define blk_bidi_rq(rq) ((rq)->next_rq != NULL) |
| 632 | /* rq->queuelist of dequeued request must be list_empty() */ | 506 | /* rq->queuelist of dequeued request must be list_empty() */ |
| 633 | #define blk_queued_rq(rq) (!list_empty(&(rq)->queuelist)) | 507 | #define blk_queued_rq(rq) (!list_empty(&(rq)->queuelist)) |
| @@ -641,7 +515,7 @@ enum { | |||
| 641 | */ | 515 | */ |
| 642 | static inline bool rw_is_sync(unsigned int rw_flags) | 516 | static inline bool rw_is_sync(unsigned int rw_flags) |
| 643 | { | 517 | { |
| 644 | return !(rw_flags & REQ_RW) || (rw_flags & REQ_RW_SYNC); | 518 | return !(rw_flags & REQ_WRITE) || (rw_flags & REQ_SYNC); |
| 645 | } | 519 | } |
| 646 | 520 | ||
| 647 | static inline bool rq_is_sync(struct request *rq) | 521 | static inline bool rq_is_sync(struct request *rq) |
| @@ -649,9 +523,6 @@ static inline bool rq_is_sync(struct request *rq) | |||
| 649 | return rw_is_sync(rq->cmd_flags); | 523 | return rw_is_sync(rq->cmd_flags); |
| 650 | } | 524 | } |
| 651 | 525 | ||
| 652 | #define rq_is_meta(rq) ((rq)->cmd_flags & REQ_RW_META) | ||
| 653 | #define rq_noidle(rq) ((rq)->cmd_flags & REQ_NOIDLE) | ||
| 654 | |||
| 655 | static inline int blk_queue_full(struct request_queue *q, int sync) | 526 | static inline int blk_queue_full(struct request_queue *q, int sync) |
| 656 | { | 527 | { |
| 657 | if (sync) | 528 | if (sync) |
| @@ -681,10 +552,12 @@ static inline void blk_clear_queue_full(struct request_queue *q, int sync) | |||
| 681 | * it already be started by driver. | 552 | * it already be started by driver. |
| 682 | */ | 553 | */ |
| 683 | #define RQ_NOMERGE_FLAGS \ | 554 | #define RQ_NOMERGE_FLAGS \ |
| 684 | (REQ_NOMERGE | REQ_STARTED | REQ_HARDBARRIER | REQ_SOFTBARRIER) | 555 | (REQ_NOMERGE | REQ_STARTED | REQ_HARDBARRIER | REQ_SOFTBARRIER | \ |
| 556 | REQ_FLUSH | REQ_FUA) | ||
| 685 | #define rq_mergeable(rq) \ | 557 | #define rq_mergeable(rq) \ |
| 686 | (!((rq)->cmd_flags & RQ_NOMERGE_FLAGS) && \ | 558 | (!((rq)->cmd_flags & RQ_NOMERGE_FLAGS) && \ |
| 687 | (blk_discard_rq(rq) || blk_fs_request((rq)))) | 559 | (((rq)->cmd_flags & REQ_DISCARD) || \ |
| 560 | (rq)->cmd_type == REQ_TYPE_FS)) | ||
| 688 | 561 | ||
| 689 | /* | 562 | /* |
| 690 | * q->prep_rq_fn return values | 563 | * q->prep_rq_fn return values |
| @@ -709,7 +582,7 @@ extern unsigned long blk_max_low_pfn, blk_max_pfn; | |||
| 709 | #define BLK_BOUNCE_HIGH -1ULL | 582 | #define BLK_BOUNCE_HIGH -1ULL |
| 710 | #endif | 583 | #endif |
| 711 | #define BLK_BOUNCE_ANY (-1ULL) | 584 | #define BLK_BOUNCE_ANY (-1ULL) |
| 712 | #define BLK_BOUNCE_ISA (ISA_DMA_THRESHOLD) | 585 | #define BLK_BOUNCE_ISA (DMA_BIT_MASK(24)) |
| 713 | 586 | ||
| 714 | /* | 587 | /* |
| 715 | * default timeout for SG_IO if none specified | 588 | * default timeout for SG_IO if none specified |
| @@ -781,6 +654,8 @@ extern struct request *blk_make_request(struct request_queue *, struct bio *, | |||
| 781 | gfp_t); | 654 | gfp_t); |
| 782 | extern void blk_insert_request(struct request_queue *, struct request *, int, void *); | 655 | extern void blk_insert_request(struct request_queue *, struct request *, int, void *); |
| 783 | extern void blk_requeue_request(struct request_queue *, struct request *); | 656 | extern void blk_requeue_request(struct request_queue *, struct request *); |
| 657 | extern void blk_add_request_payload(struct request *rq, struct page *page, | ||
| 658 | unsigned int len); | ||
| 784 | extern int blk_rq_check_limits(struct request_queue *q, struct request *rq); | 659 | extern int blk_rq_check_limits(struct request_queue *q, struct request *rq); |
| 785 | extern int blk_lld_busy(struct request_queue *q); | 660 | extern int blk_lld_busy(struct request_queue *q); |
| 786 | extern int blk_rq_prep_clone(struct request *rq, struct request *rq_src, | 661 | extern int blk_rq_prep_clone(struct request *rq, struct request *rq_src, |
| @@ -915,6 +790,7 @@ extern void blk_complete_request(struct request *); | |||
| 915 | extern void __blk_complete_request(struct request *); | 790 | extern void __blk_complete_request(struct request *); |
| 916 | extern void blk_abort_request(struct request *); | 791 | extern void blk_abort_request(struct request *); |
| 917 | extern void blk_abort_queue(struct request_queue *); | 792 | extern void blk_abort_queue(struct request_queue *); |
| 793 | extern void blk_unprep_request(struct request *); | ||
| 918 | 794 | ||
| 919 | /* | 795 | /* |
| 920 | * Access functions for manipulating queue properties | 796 | * Access functions for manipulating queue properties |
| @@ -936,7 +812,7 @@ extern void blk_queue_max_segment_size(struct request_queue *, unsigned int); | |||
| 936 | extern void blk_queue_max_discard_sectors(struct request_queue *q, | 812 | extern void blk_queue_max_discard_sectors(struct request_queue *q, |
| 937 | unsigned int max_discard_sectors); | 813 | unsigned int max_discard_sectors); |
| 938 | extern void blk_queue_logical_block_size(struct request_queue *, unsigned short); | 814 | extern void blk_queue_logical_block_size(struct request_queue *, unsigned short); |
| 939 | extern void blk_queue_physical_block_size(struct request_queue *, unsigned short); | 815 | extern void blk_queue_physical_block_size(struct request_queue *, unsigned int); |
| 940 | extern void blk_queue_alignment_offset(struct request_queue *q, | 816 | extern void blk_queue_alignment_offset(struct request_queue *q, |
| 941 | unsigned int alignment); | 817 | unsigned int alignment); |
| 942 | extern void blk_limits_io_min(struct queue_limits *limits, unsigned int min); | 818 | extern void blk_limits_io_min(struct queue_limits *limits, unsigned int min); |
| @@ -959,18 +835,15 @@ extern int blk_queue_dma_drain(struct request_queue *q, | |||
| 959 | extern void blk_queue_lld_busy(struct request_queue *q, lld_busy_fn *fn); | 835 | extern void blk_queue_lld_busy(struct request_queue *q, lld_busy_fn *fn); |
| 960 | extern void blk_queue_segment_boundary(struct request_queue *, unsigned long); | 836 | extern void blk_queue_segment_boundary(struct request_queue *, unsigned long); |
| 961 | extern void blk_queue_prep_rq(struct request_queue *, prep_rq_fn *pfn); | 837 | extern void blk_queue_prep_rq(struct request_queue *, prep_rq_fn *pfn); |
| 838 | extern void blk_queue_unprep_rq(struct request_queue *, unprep_rq_fn *ufn); | ||
| 962 | extern void blk_queue_merge_bvec(struct request_queue *, merge_bvec_fn *); | 839 | extern void blk_queue_merge_bvec(struct request_queue *, merge_bvec_fn *); |
| 963 | extern void blk_queue_dma_alignment(struct request_queue *, int); | 840 | extern void blk_queue_dma_alignment(struct request_queue *, int); |
| 964 | extern void blk_queue_update_dma_alignment(struct request_queue *, int); | 841 | extern void blk_queue_update_dma_alignment(struct request_queue *, int); |
| 965 | extern void blk_queue_softirq_done(struct request_queue *, softirq_done_fn *); | 842 | extern void blk_queue_softirq_done(struct request_queue *, softirq_done_fn *); |
| 966 | extern void blk_queue_rq_timed_out(struct request_queue *, rq_timed_out_fn *); | 843 | extern void blk_queue_rq_timed_out(struct request_queue *, rq_timed_out_fn *); |
| 967 | extern void blk_queue_rq_timeout(struct request_queue *, unsigned int); | 844 | extern void blk_queue_rq_timeout(struct request_queue *, unsigned int); |
| 845 | extern void blk_queue_flush(struct request_queue *q, unsigned int flush); | ||
| 968 | extern struct backing_dev_info *blk_get_backing_dev_info(struct block_device *bdev); | 846 | extern struct backing_dev_info *blk_get_backing_dev_info(struct block_device *bdev); |
| 969 | extern int blk_queue_ordered(struct request_queue *, unsigned, prepare_flush_fn *); | ||
| 970 | extern bool blk_do_ordered(struct request_queue *, struct request **); | ||
| 971 | extern unsigned blk_ordered_cur_seq(struct request_queue *); | ||
| 972 | extern unsigned blk_ordered_req_seq(struct request *); | ||
| 973 | extern bool blk_ordered_complete_seq(struct request_queue *, unsigned, int); | ||
| 974 | 847 | ||
| 975 | extern int blk_rq_map_sg(struct request_queue *, struct request *, struct scatterlist *); | 848 | extern int blk_rq_map_sg(struct request_queue *, struct request *, struct scatterlist *); |
| 976 | extern void blk_dump_rq_flags(struct request *, char *); | 849 | extern void blk_dump_rq_flags(struct request *, char *); |
| @@ -1003,25 +876,28 @@ static inline struct request *blk_map_queue_find_tag(struct blk_queue_tag *bqt, | |||
| 1003 | return NULL; | 876 | return NULL; |
| 1004 | return bqt->tag_index[tag]; | 877 | return bqt->tag_index[tag]; |
| 1005 | } | 878 | } |
| 1006 | enum{ | 879 | |
| 1007 | BLKDEV_WAIT, /* wait for completion */ | 880 | #define BLKDEV_DISCARD_SECURE 0x01 /* secure discard */ |
| 1008 | BLKDEV_BARRIER, /*issue request with barrier */ | 881 | |
| 1009 | }; | 882 | extern int blkdev_issue_flush(struct block_device *, gfp_t, sector_t *); |
| 1010 | #define BLKDEV_IFL_WAIT (1 << BLKDEV_WAIT) | ||
| 1011 | #define BLKDEV_IFL_BARRIER (1 << BLKDEV_BARRIER) | ||
| 1012 | extern int blkdev_issue_flush(struct block_device *, gfp_t, sector_t *, | ||
| 1013 | unsigned long); | ||
| 1014 | extern int blkdev_issue_discard(struct block_device *bdev, sector_t sector, | 883 | extern int blkdev_issue_discard(struct block_device *bdev, sector_t sector, |
| 1015 | sector_t nr_sects, gfp_t gfp_mask, unsigned long flags); | 884 | sector_t nr_sects, gfp_t gfp_mask, unsigned long flags); |
| 1016 | extern int blkdev_issue_zeroout(struct block_device *bdev, sector_t sector, | 885 | extern int blkdev_issue_zeroout(struct block_device *bdev, sector_t sector, |
| 1017 | sector_t nr_sects, gfp_t gfp_mask, unsigned long flags); | 886 | sector_t nr_sects, gfp_t gfp_mask); |
| 1018 | static inline int sb_issue_discard(struct super_block *sb, | 887 | static inline int sb_issue_discard(struct super_block *sb, sector_t block, |
| 1019 | sector_t block, sector_t nr_blocks) | 888 | sector_t nr_blocks, gfp_t gfp_mask, unsigned long flags) |
| 1020 | { | 889 | { |
| 1021 | block <<= (sb->s_blocksize_bits - 9); | 890 | return blkdev_issue_discard(sb->s_bdev, block << (sb->s_blocksize_bits - 9), |
| 1022 | nr_blocks <<= (sb->s_blocksize_bits - 9); | 891 | nr_blocks << (sb->s_blocksize_bits - 9), |
| 1023 | return blkdev_issue_discard(sb->s_bdev, block, nr_blocks, GFP_KERNEL, | 892 | gfp_mask, flags); |
| 1024 | BLKDEV_IFL_WAIT | BLKDEV_IFL_BARRIER); | 893 | } |
| 894 | static inline int sb_issue_zeroout(struct super_block *sb, sector_t block, | ||
| 895 | sector_t nr_blocks, gfp_t gfp_mask) | ||
| 896 | { | ||
| 897 | return blkdev_issue_zeroout(sb->s_bdev, | ||
| 898 | block << (sb->s_blocksize_bits - 9), | ||
| 899 | nr_blocks << (sb->s_blocksize_bits - 9), | ||
| 900 | gfp_mask); | ||
| 1025 | } | 901 | } |
| 1026 | 902 | ||
| 1027 | extern int blk_verify_command(unsigned char *cmd, fmode_t has_write_perm); | 903 | extern int blk_verify_command(unsigned char *cmd, fmode_t has_write_perm); |
| @@ -1086,7 +962,7 @@ static inline unsigned int queue_physical_block_size(struct request_queue *q) | |||
| 1086 | return q->limits.physical_block_size; | 962 | return q->limits.physical_block_size; |
| 1087 | } | 963 | } |
| 1088 | 964 | ||
| 1089 | static inline int bdev_physical_block_size(struct block_device *bdev) | 965 | static inline unsigned int bdev_physical_block_size(struct block_device *bdev) |
| 1090 | { | 966 | { |
| 1091 | return queue_physical_block_size(bdev_get_queue(bdev)); | 967 | return queue_physical_block_size(bdev_get_queue(bdev)); |
| 1092 | } | 968 | } |
| @@ -1175,11 +1051,11 @@ static inline int queue_dma_alignment(struct request_queue *q) | |||
| 1175 | return q ? q->dma_alignment : 511; | 1051 | return q ? q->dma_alignment : 511; |
| 1176 | } | 1052 | } |
| 1177 | 1053 | ||
| 1178 | static inline int blk_rq_aligned(struct request_queue *q, void *addr, | 1054 | static inline int blk_rq_aligned(struct request_queue *q, unsigned long addr, |
| 1179 | unsigned int len) | 1055 | unsigned int len) |
| 1180 | { | 1056 | { |
| 1181 | unsigned int alignment = queue_dma_alignment(q) | q->dma_pad_mask; | 1057 | unsigned int alignment = queue_dma_alignment(q) | q->dma_pad_mask; |
| 1182 | return !((unsigned long)addr & alignment) && !(len & alignment); | 1058 | return !(addr & alignment) && !(len & alignment); |
| 1183 | } | 1059 | } |
| 1184 | 1060 | ||
| 1185 | /* assumes size > 256 */ | 1061 | /* assumes size > 256 */ |
| @@ -1209,6 +1085,7 @@ static inline void put_dev_sector(Sector p) | |||
| 1209 | 1085 | ||
| 1210 | struct work_struct; | 1086 | struct work_struct; |
| 1211 | int kblockd_schedule_work(struct request_queue *q, struct work_struct *work); | 1087 | int kblockd_schedule_work(struct request_queue *q, struct work_struct *work); |
| 1088 | int kblockd_schedule_delayed_work(struct request_queue *q, struct delayed_work *dwork, unsigned long delay); | ||
| 1212 | 1089 | ||
| 1213 | #ifdef CONFIG_BLK_CGROUP | 1090 | #ifdef CONFIG_BLK_CGROUP |
| 1214 | /* | 1091 | /* |
| @@ -1252,6 +1129,24 @@ static inline uint64_t rq_io_start_time_ns(struct request *req) | |||
| 1252 | } | 1129 | } |
| 1253 | #endif | 1130 | #endif |
| 1254 | 1131 | ||
| 1132 | #ifdef CONFIG_BLK_DEV_THROTTLING | ||
| 1133 | extern int blk_throtl_init(struct request_queue *q); | ||
| 1134 | extern void blk_throtl_exit(struct request_queue *q); | ||
| 1135 | extern int blk_throtl_bio(struct request_queue *q, struct bio **bio); | ||
| 1136 | extern void throtl_schedule_delayed_work(struct request_queue *q, unsigned long delay); | ||
| 1137 | extern void throtl_shutdown_timer_wq(struct request_queue *q); | ||
| 1138 | #else /* CONFIG_BLK_DEV_THROTTLING */ | ||
| 1139 | static inline int blk_throtl_bio(struct request_queue *q, struct bio **bio) | ||
| 1140 | { | ||
| 1141 | return 0; | ||
| 1142 | } | ||
| 1143 | |||
| 1144 | static inline int blk_throtl_init(struct request_queue *q) { return 0; } | ||
| 1145 | static inline int blk_throtl_exit(struct request_queue *q) { return 0; } | ||
| 1146 | static inline void throtl_schedule_delayed_work(struct request_queue *q, unsigned long delay) {} | ||
| 1147 | static inline void throtl_shutdown_timer_wq(struct request_queue *q) {} | ||
| 1148 | #endif /* CONFIG_BLK_DEV_THROTTLING */ | ||
| 1149 | |||
| 1255 | #define MODULE_ALIAS_BLOCKDEV(major,minor) \ | 1150 | #define MODULE_ALIAS_BLOCKDEV(major,minor) \ |
| 1256 | MODULE_ALIAS("block-major-" __stringify(major) "-" __stringify(minor)) | 1151 | MODULE_ALIAS("block-major-" __stringify(major) "-" __stringify(minor)) |
| 1257 | #define MODULE_ALIAS_BLOCKDEV_MAJOR(major) \ | 1152 | #define MODULE_ALIAS_BLOCKDEV_MAJOR(major) \ |
| @@ -1295,8 +1190,13 @@ struct blk_integrity { | |||
| 1295 | extern int blk_integrity_register(struct gendisk *, struct blk_integrity *); | 1190 | extern int blk_integrity_register(struct gendisk *, struct blk_integrity *); |
| 1296 | extern void blk_integrity_unregister(struct gendisk *); | 1191 | extern void blk_integrity_unregister(struct gendisk *); |
| 1297 | extern int blk_integrity_compare(struct gendisk *, struct gendisk *); | 1192 | extern int blk_integrity_compare(struct gendisk *, struct gendisk *); |
| 1298 | extern int blk_rq_map_integrity_sg(struct request *, struct scatterlist *); | 1193 | extern int blk_rq_map_integrity_sg(struct request_queue *, struct bio *, |
| 1299 | extern int blk_rq_count_integrity_sg(struct request *); | 1194 | struct scatterlist *); |
| 1195 | extern int blk_rq_count_integrity_sg(struct request_queue *, struct bio *); | ||
| 1196 | extern int blk_integrity_merge_rq(struct request_queue *, struct request *, | ||
| 1197 | struct request *); | ||
| 1198 | extern int blk_integrity_merge_bio(struct request_queue *, struct request *, | ||
| 1199 | struct bio *); | ||
| 1300 | 1200 | ||
| 1301 | static inline | 1201 | static inline |
| 1302 | struct blk_integrity *bdev_get_integrity(struct block_device *bdev) | 1202 | struct blk_integrity *bdev_get_integrity(struct block_device *bdev) |
| @@ -1317,23 +1217,38 @@ static inline int blk_integrity_rq(struct request *rq) | |||
| 1317 | return bio_integrity(rq->bio); | 1217 | return bio_integrity(rq->bio); |
| 1318 | } | 1218 | } |
| 1319 | 1219 | ||
| 1220 | static inline void blk_queue_max_integrity_segments(struct request_queue *q, | ||
| 1221 | unsigned int segs) | ||
| 1222 | { | ||
| 1223 | q->limits.max_integrity_segments = segs; | ||
| 1224 | } | ||
| 1225 | |||
| 1226 | static inline unsigned short | ||
| 1227 | queue_max_integrity_segments(struct request_queue *q) | ||
| 1228 | { | ||
| 1229 | return q->limits.max_integrity_segments; | ||
| 1230 | } | ||
| 1231 | |||
| 1320 | #else /* CONFIG_BLK_DEV_INTEGRITY */ | 1232 | #else /* CONFIG_BLK_DEV_INTEGRITY */ |
| 1321 | 1233 | ||
| 1322 | #define blk_integrity_rq(rq) (0) | 1234 | #define blk_integrity_rq(rq) (0) |
| 1323 | #define blk_rq_count_integrity_sg(a) (0) | 1235 | #define blk_rq_count_integrity_sg(a, b) (0) |
| 1324 | #define blk_rq_map_integrity_sg(a, b) (0) | 1236 | #define blk_rq_map_integrity_sg(a, b, c) (0) |
| 1325 | #define bdev_get_integrity(a) (0) | 1237 | #define bdev_get_integrity(a) (0) |
| 1326 | #define blk_get_integrity(a) (0) | 1238 | #define blk_get_integrity(a) (0) |
| 1327 | #define blk_integrity_compare(a, b) (0) | 1239 | #define blk_integrity_compare(a, b) (0) |
| 1328 | #define blk_integrity_register(a, b) (0) | 1240 | #define blk_integrity_register(a, b) (0) |
| 1329 | #define blk_integrity_unregister(a) do { } while (0); | 1241 | #define blk_integrity_unregister(a) do { } while (0); |
| 1242 | #define blk_queue_max_integrity_segments(a, b) do { } while (0); | ||
| 1243 | #define queue_max_integrity_segments(a) (0) | ||
| 1244 | #define blk_integrity_merge_rq(a, b, c) (0) | ||
| 1245 | #define blk_integrity_merge_bio(a, b, c) (0) | ||
| 1330 | 1246 | ||
| 1331 | #endif /* CONFIG_BLK_DEV_INTEGRITY */ | 1247 | #endif /* CONFIG_BLK_DEV_INTEGRITY */ |
| 1332 | 1248 | ||
| 1333 | struct block_device_operations { | 1249 | struct block_device_operations { |
| 1334 | int (*open) (struct block_device *, fmode_t); | 1250 | int (*open) (struct block_device *, fmode_t); |
| 1335 | int (*release) (struct gendisk *, fmode_t); | 1251 | int (*release) (struct gendisk *, fmode_t); |
| 1336 | int (*locked_ioctl) (struct block_device *, fmode_t, unsigned, unsigned long); | ||
| 1337 | int (*ioctl) (struct block_device *, fmode_t, unsigned, unsigned long); | 1252 | int (*ioctl) (struct block_device *, fmode_t, unsigned, unsigned long); |
| 1338 | int (*compat_ioctl) (struct block_device *, fmode_t, unsigned, unsigned long); | 1253 | int (*compat_ioctl) (struct block_device *, fmode_t, unsigned, unsigned long); |
| 1339 | int (*direct_access) (struct block_device *, sector_t, | 1254 | int (*direct_access) (struct block_device *, sector_t, |
diff --git a/include/linux/blktrace_api.h b/include/linux/blktrace_api.h index 416bf62d6d46..3395cf7130f5 100644 --- a/include/linux/blktrace_api.h +++ b/include/linux/blktrace_api.h | |||
| @@ -5,6 +5,7 @@ | |||
| 5 | #ifdef __KERNEL__ | 5 | #ifdef __KERNEL__ |
| 6 | #include <linux/blkdev.h> | 6 | #include <linux/blkdev.h> |
| 7 | #include <linux/relay.h> | 7 | #include <linux/relay.h> |
| 8 | #include <linux/compat.h> | ||
| 8 | #endif | 9 | #endif |
| 9 | 10 | ||
| 10 | /* | 11 | /* |
| @@ -220,11 +221,26 @@ static inline int blk_trace_init_sysfs(struct device *dev) | |||
| 220 | 221 | ||
| 221 | #endif /* CONFIG_BLK_DEV_IO_TRACE */ | 222 | #endif /* CONFIG_BLK_DEV_IO_TRACE */ |
| 222 | 223 | ||
| 224 | #ifdef CONFIG_COMPAT | ||
| 225 | |||
| 226 | struct compat_blk_user_trace_setup { | ||
| 227 | char name[32]; | ||
| 228 | u16 act_mask; | ||
| 229 | u32 buf_size; | ||
| 230 | u32 buf_nr; | ||
| 231 | compat_u64 start_lba; | ||
| 232 | compat_u64 end_lba; | ||
| 233 | u32 pid; | ||
| 234 | }; | ||
| 235 | #define BLKTRACESETUP32 _IOWR(0x12, 115, struct compat_blk_user_trace_setup) | ||
| 236 | |||
| 237 | #endif | ||
| 238 | |||
| 223 | #if defined(CONFIG_EVENT_TRACING) && defined(CONFIG_BLOCK) | 239 | #if defined(CONFIG_EVENT_TRACING) && defined(CONFIG_BLOCK) |
| 224 | 240 | ||
| 225 | static inline int blk_cmd_buf_len(struct request *rq) | 241 | static inline int blk_cmd_buf_len(struct request *rq) |
| 226 | { | 242 | { |
| 227 | return blk_pc_request(rq) ? rq->cmd_len * 3 : 1; | 243 | return (rq->cmd_type == REQ_TYPE_BLOCK_PC) ? rq->cmd_len * 3 : 1; |
| 228 | } | 244 | } |
| 229 | 245 | ||
| 230 | extern void blk_dump_cmd(char *buf, struct request *rq); | 246 | extern void blk_dump_cmd(char *buf, struct request *rq); |
diff --git a/include/linux/brcmphy.h b/include/linux/brcmphy.h index 7f437ca1ed44..b840a4960282 100644 --- a/include/linux/brcmphy.h +++ b/include/linux/brcmphy.h | |||
| @@ -1,6 +1,13 @@ | |||
| 1 | #define PHY_ID_BCM50610 0x0143bd60 | 1 | #define PHY_ID_BCM50610 0x0143bd60 |
| 2 | #define PHY_ID_BCM50610M 0x0143bd70 | 2 | #define PHY_ID_BCM50610M 0x0143bd70 |
| 3 | #define PHY_ID_BCM5241 0x0143bc30 | ||
| 3 | #define PHY_ID_BCMAC131 0x0143bc70 | 4 | #define PHY_ID_BCMAC131 0x0143bc70 |
| 5 | #define PHY_ID_BCM5481 0x0143bca0 | ||
| 6 | #define PHY_ID_BCM5482 0x0143bcb0 | ||
| 7 | #define PHY_ID_BCM5411 0x00206070 | ||
| 8 | #define PHY_ID_BCM5421 0x002060e0 | ||
| 9 | #define PHY_ID_BCM5464 0x002060b0 | ||
| 10 | #define PHY_ID_BCM5461 0x002060c0 | ||
| 4 | #define PHY_ID_BCM57780 0x03625d90 | 11 | #define PHY_ID_BCM57780 0x03625d90 |
| 5 | 12 | ||
| 6 | #define PHY_BCM_OUI_MASK 0xfffffc00 | 13 | #define PHY_BCM_OUI_MASK 0xfffffc00 |
diff --git a/include/linux/buffer_head.h b/include/linux/buffer_head.h index 1b9ba193b789..68d1fe7b877c 100644 --- a/include/linux/buffer_head.h +++ b/include/linux/buffer_head.h | |||
| @@ -32,8 +32,6 @@ enum bh_state_bits { | |||
| 32 | BH_Delay, /* Buffer is not yet allocated on disk */ | 32 | BH_Delay, /* Buffer is not yet allocated on disk */ |
| 33 | BH_Boundary, /* Block is followed by a discontiguity */ | 33 | BH_Boundary, /* Block is followed by a discontiguity */ |
| 34 | BH_Write_EIO, /* I/O error on write */ | 34 | BH_Write_EIO, /* I/O error on write */ |
| 35 | BH_Ordered, /* ordered write */ | ||
| 36 | BH_Eopnotsupp, /* operation not supported (barrier) */ | ||
| 37 | BH_Unwritten, /* Buffer is allocated on disk but not written */ | 35 | BH_Unwritten, /* Buffer is allocated on disk but not written */ |
| 38 | BH_Quiet, /* Buffer Error Prinks to be quiet */ | 36 | BH_Quiet, /* Buffer Error Prinks to be quiet */ |
| 39 | 37 | ||
| @@ -125,8 +123,6 @@ BUFFER_FNS(Async_Write, async_write) | |||
| 125 | BUFFER_FNS(Delay, delay) | 123 | BUFFER_FNS(Delay, delay) |
| 126 | BUFFER_FNS(Boundary, boundary) | 124 | BUFFER_FNS(Boundary, boundary) |
| 127 | BUFFER_FNS(Write_EIO, write_io_error) | 125 | BUFFER_FNS(Write_EIO, write_io_error) |
| 128 | BUFFER_FNS(Ordered, ordered) | ||
| 129 | BUFFER_FNS(Eopnotsupp, eopnotsupp) | ||
| 130 | BUFFER_FNS(Unwritten, unwritten) | 126 | BUFFER_FNS(Unwritten, unwritten) |
| 131 | 127 | ||
| 132 | #define bh_offset(bh) ((unsigned long)(bh)->b_data & ~PAGE_MASK) | 128 | #define bh_offset(bh) ((unsigned long)(bh)->b_data & ~PAGE_MASK) |
| @@ -183,6 +179,8 @@ void unlock_buffer(struct buffer_head *bh); | |||
| 183 | void __lock_buffer(struct buffer_head *bh); | 179 | void __lock_buffer(struct buffer_head *bh); |
| 184 | void ll_rw_block(int, int, struct buffer_head * bh[]); | 180 | void ll_rw_block(int, int, struct buffer_head * bh[]); |
| 185 | int sync_dirty_buffer(struct buffer_head *bh); | 181 | int sync_dirty_buffer(struct buffer_head *bh); |
| 182 | int __sync_dirty_buffer(struct buffer_head *bh, int rw); | ||
| 183 | void write_dirty_buffer(struct buffer_head *bh, int rw); | ||
| 186 | int submit_bh(int, struct buffer_head *); | 184 | int submit_bh(int, struct buffer_head *); |
| 187 | void write_boundary_block(struct block_device *bdev, | 185 | void write_boundary_block(struct block_device *bdev, |
| 188 | sector_t bblock, unsigned blocksize); | 186 | sector_t bblock, unsigned blocksize); |
| @@ -203,12 +201,10 @@ int block_write_full_page_endio(struct page *page, get_block_t *get_block, | |||
| 203 | int block_read_full_page(struct page*, get_block_t*); | 201 | int block_read_full_page(struct page*, get_block_t*); |
| 204 | int block_is_partially_uptodate(struct page *page, read_descriptor_t *desc, | 202 | int block_is_partially_uptodate(struct page *page, read_descriptor_t *desc, |
| 205 | unsigned long from); | 203 | unsigned long from); |
| 206 | int block_write_begin_newtrunc(struct file *, struct address_space *, | 204 | int block_write_begin(struct address_space *mapping, loff_t pos, unsigned len, |
| 207 | loff_t, unsigned, unsigned, | 205 | unsigned flags, struct page **pagep, get_block_t *get_block); |
| 208 | struct page **, void **, get_block_t*); | 206 | int __block_write_begin(struct page *page, loff_t pos, unsigned len, |
| 209 | int block_write_begin(struct file *, struct address_space *, | 207 | get_block_t *get_block); |
| 210 | loff_t, unsigned, unsigned, | ||
| 211 | struct page **, void **, get_block_t*); | ||
| 212 | int block_write_end(struct file *, struct address_space *, | 208 | int block_write_end(struct file *, struct address_space *, |
| 213 | loff_t, unsigned, unsigned, | 209 | loff_t, unsigned, unsigned, |
| 214 | struct page *, void *); | 210 | struct page *, void *); |
| @@ -216,10 +212,6 @@ int generic_write_end(struct file *, struct address_space *, | |||
| 216 | loff_t, unsigned, unsigned, | 212 | loff_t, unsigned, unsigned, |
| 217 | struct page *, void *); | 213 | struct page *, void *); |
| 218 | void page_zero_new_buffers(struct page *page, unsigned from, unsigned to); | 214 | void page_zero_new_buffers(struct page *page, unsigned from, unsigned to); |
| 219 | int block_prepare_write(struct page*, unsigned, unsigned, get_block_t*); | ||
| 220 | int cont_write_begin_newtrunc(struct file *, struct address_space *, loff_t, | ||
| 221 | unsigned, unsigned, struct page **, void **, | ||
| 222 | get_block_t *, loff_t *); | ||
| 223 | int cont_write_begin(struct file *, struct address_space *, loff_t, | 215 | int cont_write_begin(struct file *, struct address_space *, loff_t, |
| 224 | unsigned, unsigned, struct page **, void **, | 216 | unsigned, unsigned, struct page **, void **, |
| 225 | get_block_t *, loff_t *); | 217 | get_block_t *, loff_t *); |
| @@ -230,12 +222,7 @@ int block_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf, | |||
| 230 | void block_sync_page(struct page *); | 222 | void block_sync_page(struct page *); |
| 231 | sector_t generic_block_bmap(struct address_space *, sector_t, get_block_t *); | 223 | sector_t generic_block_bmap(struct address_space *, sector_t, get_block_t *); |
| 232 | int block_truncate_page(struct address_space *, loff_t, get_block_t *); | 224 | int block_truncate_page(struct address_space *, loff_t, get_block_t *); |
| 233 | int file_fsync(struct file *, int); | 225 | int nobh_write_begin(struct address_space *, loff_t, unsigned, unsigned, |
| 234 | int nobh_write_begin_newtrunc(struct file *, struct address_space *, | ||
| 235 | loff_t, unsigned, unsigned, | ||
| 236 | struct page **, void **, get_block_t*); | ||
| 237 | int nobh_write_begin(struct file *, struct address_space *, | ||
| 238 | loff_t, unsigned, unsigned, | ||
| 239 | struct page **, void **, get_block_t*); | 226 | struct page **, void **, get_block_t*); |
| 240 | int nobh_write_end(struct file *, struct address_space *, | 227 | int nobh_write_end(struct file *, struct address_space *, |
| 241 | loff_t, unsigned, unsigned, | 228 | loff_t, unsigned, unsigned, |
| @@ -314,15 +301,10 @@ map_bh(struct buffer_head *bh, struct super_block *sb, sector_t block) | |||
| 314 | bh->b_size = sb->s_blocksize; | 301 | bh->b_size = sb->s_blocksize; |
| 315 | } | 302 | } |
| 316 | 303 | ||
| 317 | /* | ||
| 318 | * Calling wait_on_buffer() for a zero-ref buffer is illegal, so we call into | ||
| 319 | * __wait_on_buffer() just to trip a debug check. Because debug code in inline | ||
| 320 | * functions is bloaty. | ||
| 321 | */ | ||
| 322 | static inline void wait_on_buffer(struct buffer_head *bh) | 304 | static inline void wait_on_buffer(struct buffer_head *bh) |
| 323 | { | 305 | { |
| 324 | might_sleep(); | 306 | might_sleep(); |
| 325 | if (buffer_locked(bh) || atomic_read(&bh->b_count) == 0) | 307 | if (buffer_locked(bh)) |
| 326 | __wait_on_buffer(bh); | 308 | __wait_on_buffer(bh); |
| 327 | } | 309 | } |
| 328 | 310 | ||
diff --git a/include/linux/byteorder/Kbuild b/include/linux/byteorder/Kbuild index 38437225b092..5896e344ba6c 100644 --- a/include/linux/byteorder/Kbuild +++ b/include/linux/byteorder/Kbuild | |||
| @@ -1,2 +1,2 @@ | |||
| 1 | unifdef-y += big_endian.h | 1 | header-y += big_endian.h |
| 2 | unifdef-y += little_endian.h | 2 | header-y += little_endian.h |
diff --git a/include/linux/caif/caif_socket.h b/include/linux/caif/caif_socket.h index 2a61eb1beb85..d9cb19b7cff7 100644 --- a/include/linux/caif/caif_socket.h +++ b/include/linux/caif/caif_socket.h | |||
| @@ -62,6 +62,7 @@ enum caif_channel_priority { | |||
| 62 | * @CAIFPROTO_DATAGRAM_LOOP: Datagram loopback channel, used for testing. | 62 | * @CAIFPROTO_DATAGRAM_LOOP: Datagram loopback channel, used for testing. |
| 63 | * @CAIFPROTO_UTIL: Utility (Psock) channel. | 63 | * @CAIFPROTO_UTIL: Utility (Psock) channel. |
| 64 | * @CAIFPROTO_RFM: Remote File Manager | 64 | * @CAIFPROTO_RFM: Remote File Manager |
| 65 | * @CAIFPROTO_DEBUG: Debug link | ||
| 65 | * | 66 | * |
| 66 | * This enum defines the CAIF Channel type to be used. This defines | 67 | * This enum defines the CAIF Channel type to be used. This defines |
| 67 | * the service to connect to on the modem. | 68 | * the service to connect to on the modem. |
| @@ -72,6 +73,7 @@ enum caif_protocol_type { | |||
| 72 | CAIFPROTO_DATAGRAM_LOOP, | 73 | CAIFPROTO_DATAGRAM_LOOP, |
| 73 | CAIFPROTO_UTIL, | 74 | CAIFPROTO_UTIL, |
| 74 | CAIFPROTO_RFM, | 75 | CAIFPROTO_RFM, |
| 76 | CAIFPROTO_DEBUG, | ||
| 75 | _CAIFPROTO_MAX | 77 | _CAIFPROTO_MAX |
| 76 | }; | 78 | }; |
| 77 | #define CAIFPROTO_MAX _CAIFPROTO_MAX | 79 | #define CAIFPROTO_MAX _CAIFPROTO_MAX |
| @@ -83,6 +85,28 @@ enum caif_protocol_type { | |||
| 83 | enum caif_at_type { | 85 | enum caif_at_type { |
| 84 | CAIF_ATTYPE_PLAIN = 2 | 86 | CAIF_ATTYPE_PLAIN = 2 |
| 85 | }; | 87 | }; |
| 88 | /** | ||
| 89 | * enum caif_debug_type - Content selection for debug connection | ||
| 90 | * @CAIF_DEBUG_TRACE_INTERACTIVE: Connection will contain | ||
| 91 | * both trace and interactive debug. | ||
| 92 | * @CAIF_DEBUG_TRACE: Connection contains trace only. | ||
| 93 | * @CAIF_DEBUG_INTERACTIVE: Connection to interactive debug. | ||
| 94 | */ | ||
| 95 | enum caif_debug_type { | ||
| 96 | CAIF_DEBUG_TRACE_INTERACTIVE = 0, | ||
| 97 | CAIF_DEBUG_TRACE, | ||
| 98 | CAIF_DEBUG_INTERACTIVE, | ||
| 99 | }; | ||
| 100 | |||
| 101 | /** | ||
| 102 | * enum caif_debug_service - Debug Service Endpoint | ||
| 103 | * @CAIF_RADIO_DEBUG_SERVICE: Debug service on the Radio sub-system | ||
| 104 | * @CAIF_APP_DEBUG_SERVICE: Debug for the applications sub-system | ||
| 105 | */ | ||
| 106 | enum caif_debug_service { | ||
| 107 | CAIF_RADIO_DEBUG_SERVICE = 1, | ||
| 108 | CAIF_APP_DEBUG_SERVICE | ||
| 109 | }; | ||
| 86 | 110 | ||
| 87 | /** | 111 | /** |
| 88 | * struct sockaddr_caif - the sockaddr structure for CAIF sockets. | 112 | * struct sockaddr_caif - the sockaddr structure for CAIF sockets. |
| @@ -109,6 +133,12 @@ enum caif_at_type { | |||
| 109 | * | 133 | * |
| 110 | * @u.rfm.volume: Volume to mount. | 134 | * @u.rfm.volume: Volume to mount. |
| 111 | * | 135 | * |
| 136 | * @u.dbg: Applies when family = CAIFPROTO_DEBUG. | ||
| 137 | * | ||
| 138 | * @u.dbg.type: Type of debug connection to set up | ||
| 139 | * (caif_debug_type). | ||
| 140 | * | ||
| 141 | * @u.dbg.service: Service sub-system to connect (caif_debug_service | ||
| 112 | * Description: | 142 | * Description: |
| 113 | * This structure holds the connect parameters used for setting up a | 143 | * This structure holds the connect parameters used for setting up a |
| 114 | * CAIF Channel. It defines the service to connect to on the modem. | 144 | * CAIF Channel. It defines the service to connect to on the modem. |
| @@ -130,6 +160,10 @@ struct sockaddr_caif { | |||
| 130 | __u32 connection_id; | 160 | __u32 connection_id; |
| 131 | char volume[16]; | 161 | char volume[16]; |
| 132 | } rfm; /* CAIFPROTO_RFM */ | 162 | } rfm; /* CAIFPROTO_RFM */ |
| 163 | struct { | ||
| 164 | __u8 type; /* type:enum caif_debug_type */ | ||
| 165 | __u8 service; /* service:caif_debug_service */ | ||
| 166 | } dbg; /* CAIFPROTO_DEBUG */ | ||
| 133 | } u; | 167 | } u; |
| 134 | }; | 168 | }; |
| 135 | 169 | ||
diff --git a/include/linux/can/platform/flexcan.h b/include/linux/can/platform/flexcan.h new file mode 100644 index 000000000000..72b713ab57e9 --- /dev/null +++ b/include/linux/can/platform/flexcan.h | |||
| @@ -0,0 +1,20 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2010 Marc Kleine-Budde <kernel@pengutronix.de> | ||
| 3 | * | ||
| 4 | * This file is released under the GPLv2 | ||
| 5 | * | ||
| 6 | */ | ||
| 7 | |||
| 8 | #ifndef __CAN_PLATFORM_FLEXCAN_H | ||
| 9 | #define __CAN_PLATFORM_FLEXCAN_H | ||
| 10 | |||
| 11 | /** | ||
| 12 | * struct flexcan_platform_data - flex CAN controller platform data | ||
| 13 | * @transceiver_enable: - called to power on/off the transceiver | ||
| 14 | * | ||
| 15 | */ | ||
| 16 | struct flexcan_platform_data { | ||
| 17 | void (*transceiver_switch)(int enable); | ||
| 18 | }; | ||
| 19 | |||
| 20 | #endif /* __CAN_PLATFORM_FLEXCAN_H */ | ||
diff --git a/include/linux/can/platform/mcp251x.h b/include/linux/can/platform/mcp251x.h index dba28268e651..8e20540043f5 100644 --- a/include/linux/can/platform/mcp251x.h +++ b/include/linux/can/platform/mcp251x.h | |||
| @@ -12,7 +12,6 @@ | |||
| 12 | /** | 12 | /** |
| 13 | * struct mcp251x_platform_data - MCP251X SPI CAN controller platform data | 13 | * struct mcp251x_platform_data - MCP251X SPI CAN controller platform data |
| 14 | * @oscillator_frequency: - oscillator frequency in Hz | 14 | * @oscillator_frequency: - oscillator frequency in Hz |
| 15 | * @model: - actual type of chip | ||
| 16 | * @board_specific_setup: - called before probing the chip (power,reset) | 15 | * @board_specific_setup: - called before probing the chip (power,reset) |
| 17 | * @transceiver_enable: - called to power on/off the transceiver | 16 | * @transceiver_enable: - called to power on/off the transceiver |
| 18 | * @power_enable: - called to power on/off the mcp *and* the | 17 | * @power_enable: - called to power on/off the mcp *and* the |
| @@ -25,9 +24,6 @@ | |||
| 25 | 24 | ||
| 26 | struct mcp251x_platform_data { | 25 | struct mcp251x_platform_data { |
| 27 | unsigned long oscillator_frequency; | 26 | unsigned long oscillator_frequency; |
| 28 | int model; | ||
| 29 | #define CAN_MCP251X_MCP2510 0x2510 | ||
| 30 | #define CAN_MCP251X_MCP2515 0x2515 | ||
| 31 | int (*board_specific_setup)(struct spi_device *spi); | 27 | int (*board_specific_setup)(struct spi_device *spi); |
| 32 | int (*transceiver_enable)(int enable); | 28 | int (*transceiver_enable)(int enable); |
| 33 | int (*power_enable) (int enable); | 29 | int (*power_enable) (int enable); |
diff --git a/include/linux/capability.h b/include/linux/capability.h index 39e5ff512fbe..90012b9ddbf3 100644 --- a/include/linux/capability.h +++ b/include/linux/capability.h | |||
| @@ -49,9 +49,6 @@ typedef struct __user_cap_data_struct { | |||
| 49 | } __user *cap_user_data_t; | 49 | } __user *cap_user_data_t; |
| 50 | 50 | ||
| 51 | 51 | ||
| 52 | #define XATTR_CAPS_SUFFIX "capability" | ||
| 53 | #define XATTR_NAME_CAPS XATTR_SECURITY_PREFIX XATTR_CAPS_SUFFIX | ||
| 54 | |||
| 55 | #define VFS_CAP_REVISION_MASK 0xFF000000 | 52 | #define VFS_CAP_REVISION_MASK 0xFF000000 |
| 56 | #define VFS_CAP_REVISION_SHIFT 24 | 53 | #define VFS_CAP_REVISION_SHIFT 24 |
| 57 | #define VFS_CAP_FLAGS_MASK ~VFS_CAP_REVISION_MASK | 54 | #define VFS_CAP_FLAGS_MASK ~VFS_CAP_REVISION_MASK |
diff --git a/include/linux/ceph/auth.h b/include/linux/ceph/auth.h new file mode 100644 index 000000000000..7fff521d7eb5 --- /dev/null +++ b/include/linux/ceph/auth.h | |||
| @@ -0,0 +1,92 @@ | |||
| 1 | #ifndef _FS_CEPH_AUTH_H | ||
| 2 | #define _FS_CEPH_AUTH_H | ||
| 3 | |||
| 4 | #include <linux/ceph/types.h> | ||
| 5 | #include <linux/ceph/buffer.h> | ||
| 6 | |||
| 7 | /* | ||
| 8 | * Abstract interface for communicating with the authenticate module. | ||
| 9 | * There is some handshake that takes place between us and the monitor | ||
| 10 | * to acquire the necessary keys. These are used to generate an | ||
| 11 | * 'authorizer' that we use when connecting to a service (mds, osd). | ||
| 12 | */ | ||
| 13 | |||
| 14 | struct ceph_auth_client; | ||
| 15 | struct ceph_authorizer; | ||
| 16 | |||
| 17 | struct ceph_auth_client_ops { | ||
| 18 | const char *name; | ||
| 19 | |||
| 20 | /* | ||
| 21 | * true if we are authenticated and can connect to | ||
| 22 | * services. | ||
| 23 | */ | ||
| 24 | int (*is_authenticated)(struct ceph_auth_client *ac); | ||
| 25 | |||
| 26 | /* | ||
| 27 | * true if we should (re)authenticate, e.g., when our tickets | ||
| 28 | * are getting old and crusty. | ||
| 29 | */ | ||
| 30 | int (*should_authenticate)(struct ceph_auth_client *ac); | ||
| 31 | |||
| 32 | /* | ||
| 33 | * build requests and process replies during monitor | ||
| 34 | * handshake. if handle_reply returns -EAGAIN, we build | ||
| 35 | * another request. | ||
| 36 | */ | ||
| 37 | int (*build_request)(struct ceph_auth_client *ac, void *buf, void *end); | ||
| 38 | int (*handle_reply)(struct ceph_auth_client *ac, int result, | ||
| 39 | void *buf, void *end); | ||
| 40 | |||
| 41 | /* | ||
| 42 | * Create authorizer for connecting to a service, and verify | ||
| 43 | * the response to authenticate the service. | ||
| 44 | */ | ||
| 45 | int (*create_authorizer)(struct ceph_auth_client *ac, int peer_type, | ||
| 46 | struct ceph_authorizer **a, | ||
| 47 | void **buf, size_t *len, | ||
| 48 | void **reply_buf, size_t *reply_len); | ||
| 49 | int (*verify_authorizer_reply)(struct ceph_auth_client *ac, | ||
| 50 | struct ceph_authorizer *a, size_t len); | ||
| 51 | void (*destroy_authorizer)(struct ceph_auth_client *ac, | ||
| 52 | struct ceph_authorizer *a); | ||
| 53 | void (*invalidate_authorizer)(struct ceph_auth_client *ac, | ||
| 54 | int peer_type); | ||
| 55 | |||
| 56 | /* reset when we (re)connect to a monitor */ | ||
| 57 | void (*reset)(struct ceph_auth_client *ac); | ||
| 58 | |||
| 59 | void (*destroy)(struct ceph_auth_client *ac); | ||
| 60 | }; | ||
| 61 | |||
| 62 | struct ceph_auth_client { | ||
| 63 | u32 protocol; /* CEPH_AUTH_* */ | ||
| 64 | void *private; /* for use by protocol implementation */ | ||
| 65 | const struct ceph_auth_client_ops *ops; /* null iff protocol==0 */ | ||
| 66 | |||
| 67 | bool negotiating; /* true if negotiating protocol */ | ||
| 68 | const char *name; /* entity name */ | ||
| 69 | u64 global_id; /* our unique id in system */ | ||
| 70 | const char *secret; /* our secret key */ | ||
| 71 | unsigned want_keys; /* which services we want */ | ||
| 72 | }; | ||
| 73 | |||
| 74 | extern struct ceph_auth_client *ceph_auth_init(const char *name, | ||
| 75 | const char *secret); | ||
| 76 | extern void ceph_auth_destroy(struct ceph_auth_client *ac); | ||
| 77 | |||
| 78 | extern void ceph_auth_reset(struct ceph_auth_client *ac); | ||
| 79 | |||
| 80 | extern int ceph_auth_build_hello(struct ceph_auth_client *ac, | ||
| 81 | void *buf, size_t len); | ||
| 82 | extern int ceph_handle_auth_reply(struct ceph_auth_client *ac, | ||
| 83 | void *buf, size_t len, | ||
| 84 | void *reply_buf, size_t reply_len); | ||
| 85 | extern int ceph_entity_name_encode(const char *name, void **p, void *end); | ||
| 86 | |||
| 87 | extern int ceph_build_auth(struct ceph_auth_client *ac, | ||
| 88 | void *msg_buf, size_t msg_len); | ||
| 89 | |||
| 90 | extern int ceph_auth_is_authenticated(struct ceph_auth_client *ac); | ||
| 91 | |||
| 92 | #endif | ||
diff --git a/include/linux/ceph/buffer.h b/include/linux/ceph/buffer.h new file mode 100644 index 000000000000..58d19014068f --- /dev/null +++ b/include/linux/ceph/buffer.h | |||
| @@ -0,0 +1,39 @@ | |||
| 1 | #ifndef __FS_CEPH_BUFFER_H | ||
| 2 | #define __FS_CEPH_BUFFER_H | ||
| 3 | |||
| 4 | #include <linux/kref.h> | ||
| 5 | #include <linux/mm.h> | ||
| 6 | #include <linux/vmalloc.h> | ||
| 7 | #include <linux/types.h> | ||
| 8 | #include <linux/uio.h> | ||
| 9 | |||
| 10 | /* | ||
| 11 | * a simple reference counted buffer. | ||
| 12 | * | ||
| 13 | * use kmalloc for small sizes (<= one page), vmalloc for larger | ||
| 14 | * sizes. | ||
| 15 | */ | ||
| 16 | struct ceph_buffer { | ||
| 17 | struct kref kref; | ||
| 18 | struct kvec vec; | ||
| 19 | size_t alloc_len; | ||
| 20 | bool is_vmalloc; | ||
| 21 | }; | ||
| 22 | |||
| 23 | extern struct ceph_buffer *ceph_buffer_new(size_t len, gfp_t gfp); | ||
| 24 | extern void ceph_buffer_release(struct kref *kref); | ||
| 25 | |||
| 26 | static inline struct ceph_buffer *ceph_buffer_get(struct ceph_buffer *b) | ||
| 27 | { | ||
| 28 | kref_get(&b->kref); | ||
| 29 | return b; | ||
| 30 | } | ||
| 31 | |||
| 32 | static inline void ceph_buffer_put(struct ceph_buffer *b) | ||
| 33 | { | ||
| 34 | kref_put(&b->kref, ceph_buffer_release); | ||
| 35 | } | ||
| 36 | |||
| 37 | extern int ceph_decode_buffer(struct ceph_buffer **b, void **p, void *end); | ||
| 38 | |||
| 39 | #endif | ||
diff --git a/include/linux/ceph/ceph_debug.h b/include/linux/ceph/ceph_debug.h new file mode 100644 index 000000000000..aa2e19182d99 --- /dev/null +++ b/include/linux/ceph/ceph_debug.h | |||
| @@ -0,0 +1,38 @@ | |||
| 1 | #ifndef _FS_CEPH_DEBUG_H | ||
| 2 | #define _FS_CEPH_DEBUG_H | ||
| 3 | |||
| 4 | #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt | ||
| 5 | |||
| 6 | #ifdef CONFIG_CEPH_LIB_PRETTYDEBUG | ||
| 7 | |||
| 8 | /* | ||
| 9 | * wrap pr_debug to include a filename:lineno prefix on each line. | ||
| 10 | * this incurs some overhead (kernel size and execution time) due to | ||
| 11 | * the extra function call at each call site. | ||
| 12 | */ | ||
| 13 | |||
| 14 | # if defined(DEBUG) || defined(CONFIG_DYNAMIC_DEBUG) | ||
| 15 | extern const char *ceph_file_part(const char *s, int len); | ||
| 16 | # define dout(fmt, ...) \ | ||
| 17 | pr_debug("%.*s %12.12s:%-4d : " fmt, \ | ||
| 18 | 8 - (int)sizeof(KBUILD_MODNAME), " ", \ | ||
| 19 | ceph_file_part(__FILE__, sizeof(__FILE__)), \ | ||
| 20 | __LINE__, ##__VA_ARGS__) | ||
| 21 | # else | ||
| 22 | /* faux printk call just to see any compiler warnings. */ | ||
| 23 | # define dout(fmt, ...) do { \ | ||
| 24 | if (0) \ | ||
| 25 | printk(KERN_DEBUG fmt, ##__VA_ARGS__); \ | ||
| 26 | } while (0) | ||
| 27 | # endif | ||
| 28 | |||
| 29 | #else | ||
| 30 | |||
| 31 | /* | ||
| 32 | * or, just wrap pr_debug | ||
| 33 | */ | ||
| 34 | # define dout(fmt, ...) pr_debug(" " fmt, ##__VA_ARGS__) | ||
| 35 | |||
| 36 | #endif | ||
| 37 | |||
| 38 | #endif | ||
diff --git a/include/linux/ceph/ceph_frag.h b/include/linux/ceph/ceph_frag.h new file mode 100644 index 000000000000..5babb8e95352 --- /dev/null +++ b/include/linux/ceph/ceph_frag.h | |||
| @@ -0,0 +1,109 @@ | |||
| 1 | #ifndef FS_CEPH_FRAG_H | ||
| 2 | #define FS_CEPH_FRAG_H | ||
| 3 | |||
| 4 | /* | ||
| 5 | * "Frags" are a way to describe a subset of a 32-bit number space, | ||
| 6 | * using a mask and a value to match against that mask. Any given frag | ||
| 7 | * (subset of the number space) can be partitioned into 2^n sub-frags. | ||
| 8 | * | ||
| 9 | * Frags are encoded into a 32-bit word: | ||
| 10 | * 8 upper bits = "bits" | ||
| 11 | * 24 lower bits = "value" | ||
| 12 | * (We could go to 5+27 bits, but who cares.) | ||
| 13 | * | ||
| 14 | * We use the _most_ significant bits of the 24 bit value. This makes | ||
| 15 | * values logically sort. | ||
| 16 | * | ||
| 17 | * Unfortunately, because the "bits" field is still in the high bits, we | ||
| 18 | * can't sort encoded frags numerically. However, it does allow you | ||
| 19 | * to feed encoded frags as values into frag_contains_value. | ||
| 20 | */ | ||
| 21 | static inline __u32 ceph_frag_make(__u32 b, __u32 v) | ||
| 22 | { | ||
| 23 | return (b << 24) | | ||
| 24 | (v & (0xffffffu << (24-b)) & 0xffffffu); | ||
| 25 | } | ||
| 26 | static inline __u32 ceph_frag_bits(__u32 f) | ||
| 27 | { | ||
| 28 | return f >> 24; | ||
| 29 | } | ||
| 30 | static inline __u32 ceph_frag_value(__u32 f) | ||
| 31 | { | ||
| 32 | return f & 0xffffffu; | ||
| 33 | } | ||
| 34 | static inline __u32 ceph_frag_mask(__u32 f) | ||
| 35 | { | ||
| 36 | return (0xffffffu << (24-ceph_frag_bits(f))) & 0xffffffu; | ||
| 37 | } | ||
| 38 | static inline __u32 ceph_frag_mask_shift(__u32 f) | ||
| 39 | { | ||
| 40 | return 24 - ceph_frag_bits(f); | ||
| 41 | } | ||
| 42 | |||
| 43 | static inline int ceph_frag_contains_value(__u32 f, __u32 v) | ||
| 44 | { | ||
| 45 | return (v & ceph_frag_mask(f)) == ceph_frag_value(f); | ||
| 46 | } | ||
| 47 | static inline int ceph_frag_contains_frag(__u32 f, __u32 sub) | ||
| 48 | { | ||
| 49 | /* is sub as specific as us, and contained by us? */ | ||
| 50 | return ceph_frag_bits(sub) >= ceph_frag_bits(f) && | ||
| 51 | (ceph_frag_value(sub) & ceph_frag_mask(f)) == ceph_frag_value(f); | ||
| 52 | } | ||
| 53 | |||
| 54 | static inline __u32 ceph_frag_parent(__u32 f) | ||
| 55 | { | ||
| 56 | return ceph_frag_make(ceph_frag_bits(f) - 1, | ||
| 57 | ceph_frag_value(f) & (ceph_frag_mask(f) << 1)); | ||
| 58 | } | ||
| 59 | static inline int ceph_frag_is_left_child(__u32 f) | ||
| 60 | { | ||
| 61 | return ceph_frag_bits(f) > 0 && | ||
| 62 | (ceph_frag_value(f) & (0x1000000 >> ceph_frag_bits(f))) == 0; | ||
| 63 | } | ||
| 64 | static inline int ceph_frag_is_right_child(__u32 f) | ||
| 65 | { | ||
| 66 | return ceph_frag_bits(f) > 0 && | ||
| 67 | (ceph_frag_value(f) & (0x1000000 >> ceph_frag_bits(f))) == 1; | ||
| 68 | } | ||
| 69 | static inline __u32 ceph_frag_sibling(__u32 f) | ||
| 70 | { | ||
| 71 | return ceph_frag_make(ceph_frag_bits(f), | ||
| 72 | ceph_frag_value(f) ^ (0x1000000 >> ceph_frag_bits(f))); | ||
| 73 | } | ||
| 74 | static inline __u32 ceph_frag_left_child(__u32 f) | ||
| 75 | { | ||
| 76 | return ceph_frag_make(ceph_frag_bits(f)+1, ceph_frag_value(f)); | ||
| 77 | } | ||
| 78 | static inline __u32 ceph_frag_right_child(__u32 f) | ||
| 79 | { | ||
| 80 | return ceph_frag_make(ceph_frag_bits(f)+1, | ||
| 81 | ceph_frag_value(f) | (0x1000000 >> (1+ceph_frag_bits(f)))); | ||
| 82 | } | ||
| 83 | static inline __u32 ceph_frag_make_child(__u32 f, int by, int i) | ||
| 84 | { | ||
| 85 | int newbits = ceph_frag_bits(f) + by; | ||
| 86 | return ceph_frag_make(newbits, | ||
| 87 | ceph_frag_value(f) | (i << (24 - newbits))); | ||
| 88 | } | ||
| 89 | static inline int ceph_frag_is_leftmost(__u32 f) | ||
| 90 | { | ||
| 91 | return ceph_frag_value(f) == 0; | ||
| 92 | } | ||
| 93 | static inline int ceph_frag_is_rightmost(__u32 f) | ||
| 94 | { | ||
| 95 | return ceph_frag_value(f) == ceph_frag_mask(f); | ||
| 96 | } | ||
| 97 | static inline __u32 ceph_frag_next(__u32 f) | ||
| 98 | { | ||
| 99 | return ceph_frag_make(ceph_frag_bits(f), | ||
| 100 | ceph_frag_value(f) + (0x1000000 >> ceph_frag_bits(f))); | ||
| 101 | } | ||
| 102 | |||
| 103 | /* | ||
| 104 | * comparator to sort frags logically, as when traversing the | ||
| 105 | * number space in ascending order... | ||
| 106 | */ | ||
| 107 | int ceph_frag_compare(__u32 a, __u32 b); | ||
| 108 | |||
| 109 | #endif | ||
diff --git a/include/linux/ceph/ceph_fs.h b/include/linux/ceph/ceph_fs.h new file mode 100644 index 000000000000..c3c74aef289d --- /dev/null +++ b/include/linux/ceph/ceph_fs.h | |||
| @@ -0,0 +1,729 @@ | |||
| 1 | /* | ||
| 2 | * ceph_fs.h - Ceph constants and data types to share between kernel and | ||
| 3 | * user space. | ||
| 4 | * | ||
| 5 | * Most types in this file are defined as little-endian, and are | ||
| 6 | * primarily intended to describe data structures that pass over the | ||
| 7 | * wire or that are stored on disk. | ||
| 8 | * | ||
| 9 | * LGPL2 | ||
| 10 | */ | ||
| 11 | |||
| 12 | #ifndef CEPH_FS_H | ||
| 13 | #define CEPH_FS_H | ||
| 14 | |||
| 15 | #include "msgr.h" | ||
| 16 | #include "rados.h" | ||
| 17 | |||
| 18 | /* | ||
| 19 | * subprotocol versions. when specific messages types or high-level | ||
| 20 | * protocols change, bump the affected components. we keep rev | ||
| 21 | * internal cluster protocols separately from the public, | ||
| 22 | * client-facing protocol. | ||
| 23 | */ | ||
| 24 | #define CEPH_OSD_PROTOCOL 8 /* cluster internal */ | ||
| 25 | #define CEPH_MDS_PROTOCOL 12 /* cluster internal */ | ||
| 26 | #define CEPH_MON_PROTOCOL 5 /* cluster internal */ | ||
| 27 | #define CEPH_OSDC_PROTOCOL 24 /* server/client */ | ||
| 28 | #define CEPH_MDSC_PROTOCOL 32 /* server/client */ | ||
| 29 | #define CEPH_MONC_PROTOCOL 15 /* server/client */ | ||
| 30 | |||
| 31 | |||
| 32 | #define CEPH_INO_ROOT 1 | ||
| 33 | #define CEPH_INO_CEPH 2 /* hidden .ceph dir */ | ||
| 34 | |||
| 35 | /* arbitrary limit on max # of monitors (cluster of 3 is typical) */ | ||
| 36 | #define CEPH_MAX_MON 31 | ||
| 37 | |||
| 38 | |||
| 39 | /* | ||
| 40 | * feature bits | ||
| 41 | */ | ||
| 42 | #define CEPH_FEATURE_UID (1<<0) | ||
| 43 | #define CEPH_FEATURE_NOSRCADDR (1<<1) | ||
| 44 | #define CEPH_FEATURE_MONCLOCKCHECK (1<<2) | ||
| 45 | #define CEPH_FEATURE_FLOCK (1<<3) | ||
| 46 | |||
| 47 | |||
| 48 | /* | ||
| 49 | * ceph_file_layout - describe data layout for a file/inode | ||
| 50 | */ | ||
| 51 | struct ceph_file_layout { | ||
| 52 | /* file -> object mapping */ | ||
| 53 | __le32 fl_stripe_unit; /* stripe unit, in bytes. must be multiple | ||
| 54 | of page size. */ | ||
| 55 | __le32 fl_stripe_count; /* over this many objects */ | ||
| 56 | __le32 fl_object_size; /* until objects are this big, then move to | ||
| 57 | new objects */ | ||
| 58 | __le32 fl_cas_hash; /* 0 = none; 1 = sha256 */ | ||
| 59 | |||
| 60 | /* pg -> disk layout */ | ||
| 61 | __le32 fl_object_stripe_unit; /* for per-object parity, if any */ | ||
| 62 | |||
| 63 | /* object -> pg layout */ | ||
| 64 | __le32 fl_pg_preferred; /* preferred primary for pg (-1 for none) */ | ||
| 65 | __le32 fl_pg_pool; /* namespace, crush ruleset, rep level */ | ||
| 66 | } __attribute__ ((packed)); | ||
| 67 | |||
| 68 | #define CEPH_MIN_STRIPE_UNIT 65536 | ||
| 69 | |||
| 70 | int ceph_file_layout_is_valid(const struct ceph_file_layout *layout); | ||
| 71 | |||
| 72 | |||
| 73 | /* crypto algorithms */ | ||
| 74 | #define CEPH_CRYPTO_NONE 0x0 | ||
| 75 | #define CEPH_CRYPTO_AES 0x1 | ||
| 76 | |||
| 77 | #define CEPH_AES_IV "cephsageyudagreg" | ||
| 78 | |||
| 79 | /* security/authentication protocols */ | ||
| 80 | #define CEPH_AUTH_UNKNOWN 0x0 | ||
| 81 | #define CEPH_AUTH_NONE 0x1 | ||
| 82 | #define CEPH_AUTH_CEPHX 0x2 | ||
| 83 | |||
| 84 | #define CEPH_AUTH_UID_DEFAULT ((__u64) -1) | ||
| 85 | |||
| 86 | |||
| 87 | /********************************************* | ||
| 88 | * message layer | ||
| 89 | */ | ||
| 90 | |||
| 91 | /* | ||
| 92 | * message types | ||
| 93 | */ | ||
| 94 | |||
| 95 | /* misc */ | ||
| 96 | #define CEPH_MSG_SHUTDOWN 1 | ||
| 97 | #define CEPH_MSG_PING 2 | ||
| 98 | |||
| 99 | /* client <-> monitor */ | ||
| 100 | #define CEPH_MSG_MON_MAP 4 | ||
| 101 | #define CEPH_MSG_MON_GET_MAP 5 | ||
| 102 | #define CEPH_MSG_STATFS 13 | ||
| 103 | #define CEPH_MSG_STATFS_REPLY 14 | ||
| 104 | #define CEPH_MSG_MON_SUBSCRIBE 15 | ||
| 105 | #define CEPH_MSG_MON_SUBSCRIBE_ACK 16 | ||
| 106 | #define CEPH_MSG_AUTH 17 | ||
| 107 | #define CEPH_MSG_AUTH_REPLY 18 | ||
| 108 | |||
| 109 | /* client <-> mds */ | ||
| 110 | #define CEPH_MSG_MDS_MAP 21 | ||
| 111 | |||
| 112 | #define CEPH_MSG_CLIENT_SESSION 22 | ||
| 113 | #define CEPH_MSG_CLIENT_RECONNECT 23 | ||
| 114 | |||
| 115 | #define CEPH_MSG_CLIENT_REQUEST 24 | ||
| 116 | #define CEPH_MSG_CLIENT_REQUEST_FORWARD 25 | ||
| 117 | #define CEPH_MSG_CLIENT_REPLY 26 | ||
| 118 | #define CEPH_MSG_CLIENT_CAPS 0x310 | ||
| 119 | #define CEPH_MSG_CLIENT_LEASE 0x311 | ||
| 120 | #define CEPH_MSG_CLIENT_SNAP 0x312 | ||
| 121 | #define CEPH_MSG_CLIENT_CAPRELEASE 0x313 | ||
| 122 | |||
| 123 | /* pool ops */ | ||
| 124 | #define CEPH_MSG_POOLOP_REPLY 48 | ||
| 125 | #define CEPH_MSG_POOLOP 49 | ||
| 126 | |||
| 127 | |||
| 128 | /* osd */ | ||
| 129 | #define CEPH_MSG_OSD_MAP 41 | ||
| 130 | #define CEPH_MSG_OSD_OP 42 | ||
| 131 | #define CEPH_MSG_OSD_OPREPLY 43 | ||
| 132 | |||
| 133 | /* pool operations */ | ||
| 134 | enum { | ||
| 135 | POOL_OP_CREATE = 0x01, | ||
| 136 | POOL_OP_DELETE = 0x02, | ||
| 137 | POOL_OP_AUID_CHANGE = 0x03, | ||
| 138 | POOL_OP_CREATE_SNAP = 0x11, | ||
| 139 | POOL_OP_DELETE_SNAP = 0x12, | ||
| 140 | POOL_OP_CREATE_UNMANAGED_SNAP = 0x21, | ||
| 141 | POOL_OP_DELETE_UNMANAGED_SNAP = 0x22, | ||
| 142 | }; | ||
| 143 | |||
| 144 | struct ceph_mon_request_header { | ||
| 145 | __le64 have_version; | ||
| 146 | __le16 session_mon; | ||
| 147 | __le64 session_mon_tid; | ||
| 148 | } __attribute__ ((packed)); | ||
| 149 | |||
| 150 | struct ceph_mon_statfs { | ||
| 151 | struct ceph_mon_request_header monhdr; | ||
| 152 | struct ceph_fsid fsid; | ||
| 153 | } __attribute__ ((packed)); | ||
| 154 | |||
| 155 | struct ceph_statfs { | ||
| 156 | __le64 kb, kb_used, kb_avail; | ||
| 157 | __le64 num_objects; | ||
| 158 | } __attribute__ ((packed)); | ||
| 159 | |||
| 160 | struct ceph_mon_statfs_reply { | ||
| 161 | struct ceph_fsid fsid; | ||
| 162 | __le64 version; | ||
| 163 | struct ceph_statfs st; | ||
| 164 | } __attribute__ ((packed)); | ||
| 165 | |||
| 166 | const char *ceph_pool_op_name(int op); | ||
| 167 | |||
| 168 | struct ceph_mon_poolop { | ||
| 169 | struct ceph_mon_request_header monhdr; | ||
| 170 | struct ceph_fsid fsid; | ||
| 171 | __le32 pool; | ||
| 172 | __le32 op; | ||
| 173 | __le64 auid; | ||
| 174 | __le64 snapid; | ||
| 175 | __le32 name_len; | ||
| 176 | } __attribute__ ((packed)); | ||
| 177 | |||
| 178 | struct ceph_mon_poolop_reply { | ||
| 179 | struct ceph_mon_request_header monhdr; | ||
| 180 | struct ceph_fsid fsid; | ||
| 181 | __le32 reply_code; | ||
| 182 | __le32 epoch; | ||
| 183 | char has_data; | ||
| 184 | char data[0]; | ||
| 185 | } __attribute__ ((packed)); | ||
| 186 | |||
| 187 | struct ceph_mon_unmanaged_snap { | ||
| 188 | __le64 snapid; | ||
| 189 | } __attribute__ ((packed)); | ||
| 190 | |||
| 191 | struct ceph_osd_getmap { | ||
| 192 | struct ceph_mon_request_header monhdr; | ||
| 193 | struct ceph_fsid fsid; | ||
| 194 | __le32 start; | ||
| 195 | } __attribute__ ((packed)); | ||
| 196 | |||
| 197 | struct ceph_mds_getmap { | ||
| 198 | struct ceph_mon_request_header monhdr; | ||
| 199 | struct ceph_fsid fsid; | ||
| 200 | } __attribute__ ((packed)); | ||
| 201 | |||
| 202 | struct ceph_client_mount { | ||
| 203 | struct ceph_mon_request_header monhdr; | ||
| 204 | } __attribute__ ((packed)); | ||
| 205 | |||
| 206 | struct ceph_mon_subscribe_item { | ||
| 207 | __le64 have_version; __le64 have; | ||
| 208 | __u8 onetime; | ||
| 209 | } __attribute__ ((packed)); | ||
| 210 | |||
| 211 | struct ceph_mon_subscribe_ack { | ||
| 212 | __le32 duration; /* seconds */ | ||
| 213 | struct ceph_fsid fsid; | ||
| 214 | } __attribute__ ((packed)); | ||
| 215 | |||
| 216 | /* | ||
| 217 | * mds states | ||
| 218 | * > 0 -> in | ||
| 219 | * <= 0 -> out | ||
| 220 | */ | ||
| 221 | #define CEPH_MDS_STATE_DNE 0 /* down, does not exist. */ | ||
| 222 | #define CEPH_MDS_STATE_STOPPED -1 /* down, once existed, but no subtrees. | ||
| 223 | empty log. */ | ||
| 224 | #define CEPH_MDS_STATE_BOOT -4 /* up, boot announcement. */ | ||
| 225 | #define CEPH_MDS_STATE_STANDBY -5 /* up, idle. waiting for assignment. */ | ||
| 226 | #define CEPH_MDS_STATE_CREATING -6 /* up, creating MDS instance. */ | ||
| 227 | #define CEPH_MDS_STATE_STARTING -7 /* up, starting previously stopped mds */ | ||
| 228 | #define CEPH_MDS_STATE_STANDBY_REPLAY -8 /* up, tailing active node's journal */ | ||
| 229 | |||
| 230 | #define CEPH_MDS_STATE_REPLAY 8 /* up, replaying journal. */ | ||
| 231 | #define CEPH_MDS_STATE_RESOLVE 9 /* up, disambiguating distributed | ||
| 232 | operations (import, rename, etc.) */ | ||
| 233 | #define CEPH_MDS_STATE_RECONNECT 10 /* up, reconnect to clients */ | ||
| 234 | #define CEPH_MDS_STATE_REJOIN 11 /* up, rejoining distributed cache */ | ||
| 235 | #define CEPH_MDS_STATE_CLIENTREPLAY 12 /* up, replaying client operations */ | ||
| 236 | #define CEPH_MDS_STATE_ACTIVE 13 /* up, active */ | ||
| 237 | #define CEPH_MDS_STATE_STOPPING 14 /* up, but exporting metadata */ | ||
| 238 | |||
| 239 | extern const char *ceph_mds_state_name(int s); | ||
| 240 | |||
| 241 | |||
| 242 | /* | ||
| 243 | * metadata lock types. | ||
| 244 | * - these are bitmasks.. we can compose them | ||
| 245 | * - they also define the lock ordering by the MDS | ||
| 246 | * - a few of these are internal to the mds | ||
| 247 | */ | ||
| 248 | #define CEPH_LOCK_DVERSION 1 | ||
| 249 | #define CEPH_LOCK_DN 2 | ||
| 250 | #define CEPH_LOCK_ISNAP 16 | ||
| 251 | #define CEPH_LOCK_IVERSION 32 /* mds internal */ | ||
| 252 | #define CEPH_LOCK_IFILE 64 | ||
| 253 | #define CEPH_LOCK_IAUTH 128 | ||
| 254 | #define CEPH_LOCK_ILINK 256 | ||
| 255 | #define CEPH_LOCK_IDFT 512 /* dir frag tree */ | ||
| 256 | #define CEPH_LOCK_INEST 1024 /* mds internal */ | ||
| 257 | #define CEPH_LOCK_IXATTR 2048 | ||
| 258 | #define CEPH_LOCK_IFLOCK 4096 /* advisory file locks */ | ||
| 259 | #define CEPH_LOCK_INO 8192 /* immutable inode bits; not a lock */ | ||
| 260 | |||
| 261 | /* client_session ops */ | ||
| 262 | enum { | ||
| 263 | CEPH_SESSION_REQUEST_OPEN, | ||
| 264 | CEPH_SESSION_OPEN, | ||
| 265 | CEPH_SESSION_REQUEST_CLOSE, | ||
| 266 | CEPH_SESSION_CLOSE, | ||
| 267 | CEPH_SESSION_REQUEST_RENEWCAPS, | ||
| 268 | CEPH_SESSION_RENEWCAPS, | ||
| 269 | CEPH_SESSION_STALE, | ||
| 270 | CEPH_SESSION_RECALL_STATE, | ||
| 271 | }; | ||
| 272 | |||
| 273 | extern const char *ceph_session_op_name(int op); | ||
| 274 | |||
| 275 | struct ceph_mds_session_head { | ||
| 276 | __le32 op; | ||
| 277 | __le64 seq; | ||
| 278 | struct ceph_timespec stamp; | ||
| 279 | __le32 max_caps, max_leases; | ||
| 280 | } __attribute__ ((packed)); | ||
| 281 | |||
| 282 | /* client_request */ | ||
| 283 | /* | ||
| 284 | * metadata ops. | ||
| 285 | * & 0x001000 -> write op | ||
| 286 | * & 0x010000 -> follow symlink (e.g. stat(), not lstat()). | ||
| 287 | & & 0x100000 -> use weird ino/path trace | ||
| 288 | */ | ||
| 289 | #define CEPH_MDS_OP_WRITE 0x001000 | ||
| 290 | enum { | ||
| 291 | CEPH_MDS_OP_LOOKUP = 0x00100, | ||
| 292 | CEPH_MDS_OP_GETATTR = 0x00101, | ||
| 293 | CEPH_MDS_OP_LOOKUPHASH = 0x00102, | ||
| 294 | CEPH_MDS_OP_LOOKUPPARENT = 0x00103, | ||
| 295 | |||
| 296 | CEPH_MDS_OP_SETXATTR = 0x01105, | ||
| 297 | CEPH_MDS_OP_RMXATTR = 0x01106, | ||
| 298 | CEPH_MDS_OP_SETLAYOUT = 0x01107, | ||
| 299 | CEPH_MDS_OP_SETATTR = 0x01108, | ||
| 300 | CEPH_MDS_OP_SETFILELOCK= 0x01109, | ||
| 301 | CEPH_MDS_OP_GETFILELOCK= 0x00110, | ||
| 302 | CEPH_MDS_OP_SETDIRLAYOUT=0x0110a, | ||
| 303 | |||
| 304 | CEPH_MDS_OP_MKNOD = 0x01201, | ||
| 305 | CEPH_MDS_OP_LINK = 0x01202, | ||
| 306 | CEPH_MDS_OP_UNLINK = 0x01203, | ||
| 307 | CEPH_MDS_OP_RENAME = 0x01204, | ||
| 308 | CEPH_MDS_OP_MKDIR = 0x01220, | ||
| 309 | CEPH_MDS_OP_RMDIR = 0x01221, | ||
| 310 | CEPH_MDS_OP_SYMLINK = 0x01222, | ||
| 311 | |||
| 312 | CEPH_MDS_OP_CREATE = 0x01301, | ||
| 313 | CEPH_MDS_OP_OPEN = 0x00302, | ||
| 314 | CEPH_MDS_OP_READDIR = 0x00305, | ||
| 315 | |||
| 316 | CEPH_MDS_OP_LOOKUPSNAP = 0x00400, | ||
| 317 | CEPH_MDS_OP_MKSNAP = 0x01400, | ||
| 318 | CEPH_MDS_OP_RMSNAP = 0x01401, | ||
| 319 | CEPH_MDS_OP_LSSNAP = 0x00402, | ||
| 320 | }; | ||
| 321 | |||
| 322 | extern const char *ceph_mds_op_name(int op); | ||
| 323 | |||
| 324 | |||
| 325 | #define CEPH_SETATTR_MODE 1 | ||
| 326 | #define CEPH_SETATTR_UID 2 | ||
| 327 | #define CEPH_SETATTR_GID 4 | ||
| 328 | #define CEPH_SETATTR_MTIME 8 | ||
| 329 | #define CEPH_SETATTR_ATIME 16 | ||
| 330 | #define CEPH_SETATTR_SIZE 32 | ||
| 331 | #define CEPH_SETATTR_CTIME 64 | ||
| 332 | |||
| 333 | union ceph_mds_request_args { | ||
| 334 | struct { | ||
| 335 | __le32 mask; /* CEPH_CAP_* */ | ||
| 336 | } __attribute__ ((packed)) getattr; | ||
| 337 | struct { | ||
| 338 | __le32 mode; | ||
| 339 | __le32 uid; | ||
| 340 | __le32 gid; | ||
| 341 | struct ceph_timespec mtime; | ||
| 342 | struct ceph_timespec atime; | ||
| 343 | __le64 size, old_size; /* old_size needed by truncate */ | ||
| 344 | __le32 mask; /* CEPH_SETATTR_* */ | ||
| 345 | } __attribute__ ((packed)) setattr; | ||
| 346 | struct { | ||
| 347 | __le32 frag; /* which dir fragment */ | ||
| 348 | __le32 max_entries; /* how many dentries to grab */ | ||
| 349 | __le32 max_bytes; | ||
| 350 | } __attribute__ ((packed)) readdir; | ||
| 351 | struct { | ||
| 352 | __le32 mode; | ||
| 353 | __le32 rdev; | ||
| 354 | } __attribute__ ((packed)) mknod; | ||
| 355 | struct { | ||
| 356 | __le32 mode; | ||
| 357 | } __attribute__ ((packed)) mkdir; | ||
| 358 | struct { | ||
| 359 | __le32 flags; | ||
| 360 | __le32 mode; | ||
| 361 | __le32 stripe_unit; /* layout for newly created file */ | ||
| 362 | __le32 stripe_count; /* ... */ | ||
| 363 | __le32 object_size; | ||
| 364 | __le32 file_replication; | ||
| 365 | __le32 preferred; | ||
| 366 | } __attribute__ ((packed)) open; | ||
| 367 | struct { | ||
| 368 | __le32 flags; | ||
| 369 | } __attribute__ ((packed)) setxattr; | ||
| 370 | struct { | ||
| 371 | struct ceph_file_layout layout; | ||
| 372 | } __attribute__ ((packed)) setlayout; | ||
| 373 | struct { | ||
| 374 | __u8 rule; /* currently fcntl or flock */ | ||
| 375 | __u8 type; /* shared, exclusive, remove*/ | ||
| 376 | __le64 pid; /* process id requesting the lock */ | ||
| 377 | __le64 pid_namespace; | ||
| 378 | __le64 start; /* initial location to lock */ | ||
| 379 | __le64 length; /* num bytes to lock from start */ | ||
| 380 | __u8 wait; /* will caller wait for lock to become available? */ | ||
| 381 | } __attribute__ ((packed)) filelock_change; | ||
| 382 | } __attribute__ ((packed)); | ||
| 383 | |||
| 384 | #define CEPH_MDS_FLAG_REPLAY 1 /* this is a replayed op */ | ||
| 385 | #define CEPH_MDS_FLAG_WANT_DENTRY 2 /* want dentry in reply */ | ||
| 386 | |||
| 387 | struct ceph_mds_request_head { | ||
| 388 | __le64 oldest_client_tid; | ||
| 389 | __le32 mdsmap_epoch; /* on client */ | ||
| 390 | __le32 flags; /* CEPH_MDS_FLAG_* */ | ||
| 391 | __u8 num_retry, num_fwd; /* count retry, fwd attempts */ | ||
| 392 | __le16 num_releases; /* # include cap/lease release records */ | ||
| 393 | __le32 op; /* mds op code */ | ||
| 394 | __le32 caller_uid, caller_gid; | ||
| 395 | __le64 ino; /* use this ino for openc, mkdir, mknod, | ||
| 396 | etc. (if replaying) */ | ||
| 397 | union ceph_mds_request_args args; | ||
| 398 | } __attribute__ ((packed)); | ||
| 399 | |||
| 400 | /* cap/lease release record */ | ||
| 401 | struct ceph_mds_request_release { | ||
| 402 | __le64 ino, cap_id; /* ino and unique cap id */ | ||
| 403 | __le32 caps, wanted; /* new issued, wanted */ | ||
| 404 | __le32 seq, issue_seq, mseq; | ||
| 405 | __le32 dname_seq; /* if releasing a dentry lease, a */ | ||
| 406 | __le32 dname_len; /* string follows. */ | ||
| 407 | } __attribute__ ((packed)); | ||
| 408 | |||
| 409 | /* client reply */ | ||
| 410 | struct ceph_mds_reply_head { | ||
| 411 | __le32 op; | ||
| 412 | __le32 result; | ||
| 413 | __le32 mdsmap_epoch; | ||
| 414 | __u8 safe; /* true if committed to disk */ | ||
| 415 | __u8 is_dentry, is_target; /* true if dentry, target inode records | ||
| 416 | are included with reply */ | ||
| 417 | } __attribute__ ((packed)); | ||
| 418 | |||
| 419 | /* one for each node split */ | ||
| 420 | struct ceph_frag_tree_split { | ||
| 421 | __le32 frag; /* this frag splits... */ | ||
| 422 | __le32 by; /* ...by this many bits */ | ||
| 423 | } __attribute__ ((packed)); | ||
| 424 | |||
| 425 | struct ceph_frag_tree_head { | ||
| 426 | __le32 nsplits; /* num ceph_frag_tree_split records */ | ||
| 427 | struct ceph_frag_tree_split splits[]; | ||
| 428 | } __attribute__ ((packed)); | ||
| 429 | |||
| 430 | /* capability issue, for bundling with mds reply */ | ||
| 431 | struct ceph_mds_reply_cap { | ||
| 432 | __le32 caps, wanted; /* caps issued, wanted */ | ||
| 433 | __le64 cap_id; | ||
| 434 | __le32 seq, mseq; | ||
| 435 | __le64 realm; /* snap realm */ | ||
| 436 | __u8 flags; /* CEPH_CAP_FLAG_* */ | ||
| 437 | } __attribute__ ((packed)); | ||
| 438 | |||
| 439 | #define CEPH_CAP_FLAG_AUTH 1 /* cap is issued by auth mds */ | ||
| 440 | |||
| 441 | /* inode record, for bundling with mds reply */ | ||
| 442 | struct ceph_mds_reply_inode { | ||
| 443 | __le64 ino; | ||
| 444 | __le64 snapid; | ||
| 445 | __le32 rdev; | ||
| 446 | __le64 version; /* inode version */ | ||
| 447 | __le64 xattr_version; /* version for xattr blob */ | ||
| 448 | struct ceph_mds_reply_cap cap; /* caps issued for this inode */ | ||
| 449 | struct ceph_file_layout layout; | ||
| 450 | struct ceph_timespec ctime, mtime, atime; | ||
| 451 | __le32 time_warp_seq; | ||
| 452 | __le64 size, max_size, truncate_size; | ||
| 453 | __le32 truncate_seq; | ||
| 454 | __le32 mode, uid, gid; | ||
| 455 | __le32 nlink; | ||
| 456 | __le64 files, subdirs, rbytes, rfiles, rsubdirs; /* dir stats */ | ||
| 457 | struct ceph_timespec rctime; | ||
| 458 | struct ceph_frag_tree_head fragtree; /* (must be at end of struct) */ | ||
| 459 | } __attribute__ ((packed)); | ||
| 460 | /* followed by frag array, then symlink string, then xattr blob */ | ||
| 461 | |||
| 462 | /* reply_lease follows dname, and reply_inode */ | ||
| 463 | struct ceph_mds_reply_lease { | ||
| 464 | __le16 mask; /* lease type(s) */ | ||
| 465 | __le32 duration_ms; /* lease duration */ | ||
| 466 | __le32 seq; | ||
| 467 | } __attribute__ ((packed)); | ||
| 468 | |||
| 469 | struct ceph_mds_reply_dirfrag { | ||
| 470 | __le32 frag; /* fragment */ | ||
| 471 | __le32 auth; /* auth mds, if this is a delegation point */ | ||
| 472 | __le32 ndist; /* number of mds' this is replicated on */ | ||
| 473 | __le32 dist[]; | ||
| 474 | } __attribute__ ((packed)); | ||
| 475 | |||
| 476 | #define CEPH_LOCK_FCNTL 1 | ||
| 477 | #define CEPH_LOCK_FLOCK 2 | ||
| 478 | |||
| 479 | #define CEPH_LOCK_SHARED 1 | ||
| 480 | #define CEPH_LOCK_EXCL 2 | ||
| 481 | #define CEPH_LOCK_UNLOCK 4 | ||
| 482 | |||
| 483 | struct ceph_filelock { | ||
| 484 | __le64 start;/* file offset to start lock at */ | ||
| 485 | __le64 length; /* num bytes to lock; 0 for all following start */ | ||
| 486 | __le64 client; /* which client holds the lock */ | ||
| 487 | __le64 pid; /* process id holding the lock on the client */ | ||
| 488 | __le64 pid_namespace; | ||
| 489 | __u8 type; /* shared lock, exclusive lock, or unlock */ | ||
| 490 | } __attribute__ ((packed)); | ||
| 491 | |||
| 492 | |||
| 493 | /* file access modes */ | ||
| 494 | #define CEPH_FILE_MODE_PIN 0 | ||
| 495 | #define CEPH_FILE_MODE_RD 1 | ||
| 496 | #define CEPH_FILE_MODE_WR 2 | ||
| 497 | #define CEPH_FILE_MODE_RDWR 3 /* RD | WR */ | ||
| 498 | #define CEPH_FILE_MODE_LAZY 4 /* lazy io */ | ||
| 499 | #define CEPH_FILE_MODE_NUM 8 /* bc these are bit fields.. mostly */ | ||
| 500 | |||
| 501 | int ceph_flags_to_mode(int flags); | ||
| 502 | |||
| 503 | |||
| 504 | /* capability bits */ | ||
| 505 | #define CEPH_CAP_PIN 1 /* no specific capabilities beyond the pin */ | ||
| 506 | |||
| 507 | /* generic cap bits */ | ||
| 508 | #define CEPH_CAP_GSHARED 1 /* client can reads */ | ||
| 509 | #define CEPH_CAP_GEXCL 2 /* client can read and update */ | ||
| 510 | #define CEPH_CAP_GCACHE 4 /* (file) client can cache reads */ | ||
| 511 | #define CEPH_CAP_GRD 8 /* (file) client can read */ | ||
| 512 | #define CEPH_CAP_GWR 16 /* (file) client can write */ | ||
| 513 | #define CEPH_CAP_GBUFFER 32 /* (file) client can buffer writes */ | ||
| 514 | #define CEPH_CAP_GWREXTEND 64 /* (file) client can extend EOF */ | ||
| 515 | #define CEPH_CAP_GLAZYIO 128 /* (file) client can perform lazy io */ | ||
| 516 | |||
| 517 | /* per-lock shift */ | ||
| 518 | #define CEPH_CAP_SAUTH 2 | ||
| 519 | #define CEPH_CAP_SLINK 4 | ||
| 520 | #define CEPH_CAP_SXATTR 6 | ||
| 521 | #define CEPH_CAP_SFILE 8 | ||
| 522 | #define CEPH_CAP_SFLOCK 20 | ||
| 523 | |||
| 524 | #define CEPH_CAP_BITS 22 | ||
| 525 | |||
| 526 | /* composed values */ | ||
| 527 | #define CEPH_CAP_AUTH_SHARED (CEPH_CAP_GSHARED << CEPH_CAP_SAUTH) | ||
| 528 | #define CEPH_CAP_AUTH_EXCL (CEPH_CAP_GEXCL << CEPH_CAP_SAUTH) | ||
| 529 | #define CEPH_CAP_LINK_SHARED (CEPH_CAP_GSHARED << CEPH_CAP_SLINK) | ||
| 530 | #define CEPH_CAP_LINK_EXCL (CEPH_CAP_GEXCL << CEPH_CAP_SLINK) | ||
| 531 | #define CEPH_CAP_XATTR_SHARED (CEPH_CAP_GSHARED << CEPH_CAP_SXATTR) | ||
| 532 | #define CEPH_CAP_XATTR_EXCL (CEPH_CAP_GEXCL << CEPH_CAP_SXATTR) | ||
| 533 | #define CEPH_CAP_FILE(x) (x << CEPH_CAP_SFILE) | ||
| 534 | #define CEPH_CAP_FILE_SHARED (CEPH_CAP_GSHARED << CEPH_CAP_SFILE) | ||
| 535 | #define CEPH_CAP_FILE_EXCL (CEPH_CAP_GEXCL << CEPH_CAP_SFILE) | ||
| 536 | #define CEPH_CAP_FILE_CACHE (CEPH_CAP_GCACHE << CEPH_CAP_SFILE) | ||
| 537 | #define CEPH_CAP_FILE_RD (CEPH_CAP_GRD << CEPH_CAP_SFILE) | ||
| 538 | #define CEPH_CAP_FILE_WR (CEPH_CAP_GWR << CEPH_CAP_SFILE) | ||
| 539 | #define CEPH_CAP_FILE_BUFFER (CEPH_CAP_GBUFFER << CEPH_CAP_SFILE) | ||
| 540 | #define CEPH_CAP_FILE_WREXTEND (CEPH_CAP_GWREXTEND << CEPH_CAP_SFILE) | ||
| 541 | #define CEPH_CAP_FILE_LAZYIO (CEPH_CAP_GLAZYIO << CEPH_CAP_SFILE) | ||
| 542 | #define CEPH_CAP_FLOCK_SHARED (CEPH_CAP_GSHARED << CEPH_CAP_SFLOCK) | ||
| 543 | #define CEPH_CAP_FLOCK_EXCL (CEPH_CAP_GEXCL << CEPH_CAP_SFLOCK) | ||
| 544 | |||
| 545 | |||
| 546 | /* cap masks (for getattr) */ | ||
| 547 | #define CEPH_STAT_CAP_INODE CEPH_CAP_PIN | ||
| 548 | #define CEPH_STAT_CAP_TYPE CEPH_CAP_PIN /* mode >> 12 */ | ||
| 549 | #define CEPH_STAT_CAP_SYMLINK CEPH_CAP_PIN | ||
| 550 | #define CEPH_STAT_CAP_UID CEPH_CAP_AUTH_SHARED | ||
| 551 | #define CEPH_STAT_CAP_GID CEPH_CAP_AUTH_SHARED | ||
| 552 | #define CEPH_STAT_CAP_MODE CEPH_CAP_AUTH_SHARED | ||
| 553 | #define CEPH_STAT_CAP_NLINK CEPH_CAP_LINK_SHARED | ||
| 554 | #define CEPH_STAT_CAP_LAYOUT CEPH_CAP_FILE_SHARED | ||
| 555 | #define CEPH_STAT_CAP_MTIME CEPH_CAP_FILE_SHARED | ||
| 556 | #define CEPH_STAT_CAP_SIZE CEPH_CAP_FILE_SHARED | ||
| 557 | #define CEPH_STAT_CAP_ATIME CEPH_CAP_FILE_SHARED /* fixme */ | ||
| 558 | #define CEPH_STAT_CAP_XATTR CEPH_CAP_XATTR_SHARED | ||
| 559 | #define CEPH_STAT_CAP_INODE_ALL (CEPH_CAP_PIN | \ | ||
| 560 | CEPH_CAP_AUTH_SHARED | \ | ||
| 561 | CEPH_CAP_LINK_SHARED | \ | ||
| 562 | CEPH_CAP_FILE_SHARED | \ | ||
| 563 | CEPH_CAP_XATTR_SHARED) | ||
| 564 | |||
| 565 | #define CEPH_CAP_ANY_SHARED (CEPH_CAP_AUTH_SHARED | \ | ||
| 566 | CEPH_CAP_LINK_SHARED | \ | ||
| 567 | CEPH_CAP_XATTR_SHARED | \ | ||
| 568 | CEPH_CAP_FILE_SHARED) | ||
| 569 | #define CEPH_CAP_ANY_RD (CEPH_CAP_ANY_SHARED | CEPH_CAP_FILE_RD | \ | ||
| 570 | CEPH_CAP_FILE_CACHE) | ||
| 571 | |||
| 572 | #define CEPH_CAP_ANY_EXCL (CEPH_CAP_AUTH_EXCL | \ | ||
| 573 | CEPH_CAP_LINK_EXCL | \ | ||
| 574 | CEPH_CAP_XATTR_EXCL | \ | ||
| 575 | CEPH_CAP_FILE_EXCL) | ||
| 576 | #define CEPH_CAP_ANY_FILE_WR (CEPH_CAP_FILE_WR | CEPH_CAP_FILE_BUFFER | \ | ||
| 577 | CEPH_CAP_FILE_EXCL) | ||
| 578 | #define CEPH_CAP_ANY_WR (CEPH_CAP_ANY_EXCL | CEPH_CAP_ANY_FILE_WR) | ||
| 579 | #define CEPH_CAP_ANY (CEPH_CAP_ANY_RD | CEPH_CAP_ANY_EXCL | \ | ||
| 580 | CEPH_CAP_ANY_FILE_WR | CEPH_CAP_FILE_LAZYIO | \ | ||
| 581 | CEPH_CAP_PIN) | ||
| 582 | |||
| 583 | #define CEPH_CAP_LOCKS (CEPH_LOCK_IFILE | CEPH_LOCK_IAUTH | CEPH_LOCK_ILINK | \ | ||
| 584 | CEPH_LOCK_IXATTR) | ||
| 585 | |||
| 586 | int ceph_caps_for_mode(int mode); | ||
| 587 | |||
| 588 | enum { | ||
| 589 | CEPH_CAP_OP_GRANT, /* mds->client grant */ | ||
| 590 | CEPH_CAP_OP_REVOKE, /* mds->client revoke */ | ||
| 591 | CEPH_CAP_OP_TRUNC, /* mds->client trunc notify */ | ||
| 592 | CEPH_CAP_OP_EXPORT, /* mds has exported the cap */ | ||
| 593 | CEPH_CAP_OP_IMPORT, /* mds has imported the cap */ | ||
| 594 | CEPH_CAP_OP_UPDATE, /* client->mds update */ | ||
| 595 | CEPH_CAP_OP_DROP, /* client->mds drop cap bits */ | ||
| 596 | CEPH_CAP_OP_FLUSH, /* client->mds cap writeback */ | ||
| 597 | CEPH_CAP_OP_FLUSH_ACK, /* mds->client flushed */ | ||
| 598 | CEPH_CAP_OP_FLUSHSNAP, /* client->mds flush snapped metadata */ | ||
| 599 | CEPH_CAP_OP_FLUSHSNAP_ACK, /* mds->client flushed snapped metadata */ | ||
| 600 | CEPH_CAP_OP_RELEASE, /* client->mds release (clean) cap */ | ||
| 601 | CEPH_CAP_OP_RENEW, /* client->mds renewal request */ | ||
| 602 | }; | ||
| 603 | |||
| 604 | extern const char *ceph_cap_op_name(int op); | ||
| 605 | |||
| 606 | /* | ||
| 607 | * caps message, used for capability callbacks, acks, requests, etc. | ||
| 608 | */ | ||
| 609 | struct ceph_mds_caps { | ||
| 610 | __le32 op; /* CEPH_CAP_OP_* */ | ||
| 611 | __le64 ino, realm; | ||
| 612 | __le64 cap_id; | ||
| 613 | __le32 seq, issue_seq; | ||
| 614 | __le32 caps, wanted, dirty; /* latest issued/wanted/dirty */ | ||
| 615 | __le32 migrate_seq; | ||
| 616 | __le64 snap_follows; | ||
| 617 | __le32 snap_trace_len; | ||
| 618 | |||
| 619 | /* authlock */ | ||
| 620 | __le32 uid, gid, mode; | ||
| 621 | |||
| 622 | /* linklock */ | ||
| 623 | __le32 nlink; | ||
| 624 | |||
| 625 | /* xattrlock */ | ||
| 626 | __le32 xattr_len; | ||
| 627 | __le64 xattr_version; | ||
| 628 | |||
| 629 | /* filelock */ | ||
| 630 | __le64 size, max_size, truncate_size; | ||
| 631 | __le32 truncate_seq; | ||
| 632 | struct ceph_timespec mtime, atime, ctime; | ||
| 633 | struct ceph_file_layout layout; | ||
| 634 | __le32 time_warp_seq; | ||
| 635 | } __attribute__ ((packed)); | ||
| 636 | |||
| 637 | /* cap release msg head */ | ||
| 638 | struct ceph_mds_cap_release { | ||
| 639 | __le32 num; /* number of cap_items that follow */ | ||
| 640 | } __attribute__ ((packed)); | ||
| 641 | |||
| 642 | struct ceph_mds_cap_item { | ||
| 643 | __le64 ino; | ||
| 644 | __le64 cap_id; | ||
| 645 | __le32 migrate_seq, seq; | ||
| 646 | } __attribute__ ((packed)); | ||
| 647 | |||
| 648 | #define CEPH_MDS_LEASE_REVOKE 1 /* mds -> client */ | ||
| 649 | #define CEPH_MDS_LEASE_RELEASE 2 /* client -> mds */ | ||
| 650 | #define CEPH_MDS_LEASE_RENEW 3 /* client <-> mds */ | ||
| 651 | #define CEPH_MDS_LEASE_REVOKE_ACK 4 /* client -> mds */ | ||
| 652 | |||
| 653 | extern const char *ceph_lease_op_name(int o); | ||
| 654 | |||
| 655 | /* lease msg header */ | ||
| 656 | struct ceph_mds_lease { | ||
| 657 | __u8 action; /* CEPH_MDS_LEASE_* */ | ||
| 658 | __le16 mask; /* which lease */ | ||
| 659 | __le64 ino; | ||
| 660 | __le64 first, last; /* snap range */ | ||
| 661 | __le32 seq; | ||
| 662 | __le32 duration_ms; /* duration of renewal */ | ||
| 663 | } __attribute__ ((packed)); | ||
| 664 | /* followed by a __le32+string for dname */ | ||
| 665 | |||
| 666 | /* client reconnect */ | ||
| 667 | struct ceph_mds_cap_reconnect { | ||
| 668 | __le64 cap_id; | ||
| 669 | __le32 wanted; | ||
| 670 | __le32 issued; | ||
| 671 | __le64 snaprealm; | ||
| 672 | __le64 pathbase; /* base ino for our path to this ino */ | ||
| 673 | __le32 flock_len; /* size of flock state blob, if any */ | ||
| 674 | } __attribute__ ((packed)); | ||
| 675 | /* followed by flock blob */ | ||
| 676 | |||
| 677 | struct ceph_mds_cap_reconnect_v1 { | ||
| 678 | __le64 cap_id; | ||
| 679 | __le32 wanted; | ||
| 680 | __le32 issued; | ||
| 681 | __le64 size; | ||
| 682 | struct ceph_timespec mtime, atime; | ||
| 683 | __le64 snaprealm; | ||
| 684 | __le64 pathbase; /* base ino for our path to this ino */ | ||
| 685 | } __attribute__ ((packed)); | ||
| 686 | |||
| 687 | struct ceph_mds_snaprealm_reconnect { | ||
| 688 | __le64 ino; /* snap realm base */ | ||
| 689 | __le64 seq; /* snap seq for this snap realm */ | ||
| 690 | __le64 parent; /* parent realm */ | ||
| 691 | } __attribute__ ((packed)); | ||
| 692 | |||
| 693 | /* | ||
| 694 | * snaps | ||
| 695 | */ | ||
| 696 | enum { | ||
| 697 | CEPH_SNAP_OP_UPDATE, /* CREATE or DESTROY */ | ||
| 698 | CEPH_SNAP_OP_CREATE, | ||
| 699 | CEPH_SNAP_OP_DESTROY, | ||
| 700 | CEPH_SNAP_OP_SPLIT, | ||
| 701 | }; | ||
| 702 | |||
| 703 | extern const char *ceph_snap_op_name(int o); | ||
| 704 | |||
| 705 | /* snap msg header */ | ||
| 706 | struct ceph_mds_snap_head { | ||
| 707 | __le32 op; /* CEPH_SNAP_OP_* */ | ||
| 708 | __le64 split; /* ino to split off, if any */ | ||
| 709 | __le32 num_split_inos; /* # inos belonging to new child realm */ | ||
| 710 | __le32 num_split_realms; /* # child realms udner new child realm */ | ||
| 711 | __le32 trace_len; /* size of snap trace blob */ | ||
| 712 | } __attribute__ ((packed)); | ||
| 713 | /* followed by split ino list, then split realms, then the trace blob */ | ||
| 714 | |||
| 715 | /* | ||
| 716 | * encode info about a snaprealm, as viewed by a client | ||
| 717 | */ | ||
| 718 | struct ceph_mds_snap_realm { | ||
| 719 | __le64 ino; /* ino */ | ||
| 720 | __le64 created; /* snap: when created */ | ||
| 721 | __le64 parent; /* ino: parent realm */ | ||
| 722 | __le64 parent_since; /* snap: same parent since */ | ||
| 723 | __le64 seq; /* snap: version */ | ||
| 724 | __le32 num_snaps; | ||
| 725 | __le32 num_prior_parent_snaps; | ||
| 726 | } __attribute__ ((packed)); | ||
| 727 | /* followed by my snap list, then prior parent snap list */ | ||
| 728 | |||
| 729 | #endif | ||
diff --git a/include/linux/ceph/ceph_hash.h b/include/linux/ceph/ceph_hash.h new file mode 100644 index 000000000000..d099c3f90236 --- /dev/null +++ b/include/linux/ceph/ceph_hash.h | |||
| @@ -0,0 +1,13 @@ | |||
| 1 | #ifndef FS_CEPH_HASH_H | ||
| 2 | #define FS_CEPH_HASH_H | ||
| 3 | |||
| 4 | #define CEPH_STR_HASH_LINUX 0x1 /* linux dcache hash */ | ||
| 5 | #define CEPH_STR_HASH_RJENKINS 0x2 /* robert jenkins' */ | ||
| 6 | |||
| 7 | extern unsigned ceph_str_hash_linux(const char *s, unsigned len); | ||
| 8 | extern unsigned ceph_str_hash_rjenkins(const char *s, unsigned len); | ||
| 9 | |||
| 10 | extern unsigned ceph_str_hash(int type, const char *s, unsigned len); | ||
| 11 | extern const char *ceph_str_hash_name(int type); | ||
| 12 | |||
| 13 | #endif | ||
diff --git a/include/linux/ceph/debugfs.h b/include/linux/ceph/debugfs.h new file mode 100644 index 000000000000..2a79702e092b --- /dev/null +++ b/include/linux/ceph/debugfs.h | |||
| @@ -0,0 +1,33 @@ | |||
| 1 | #ifndef _FS_CEPH_DEBUGFS_H | ||
| 2 | #define _FS_CEPH_DEBUGFS_H | ||
| 3 | |||
| 4 | #include "ceph_debug.h" | ||
| 5 | #include "types.h" | ||
| 6 | |||
| 7 | #define CEPH_DEFINE_SHOW_FUNC(name) \ | ||
| 8 | static int name##_open(struct inode *inode, struct file *file) \ | ||
| 9 | { \ | ||
| 10 | struct seq_file *sf; \ | ||
| 11 | int ret; \ | ||
| 12 | \ | ||
| 13 | ret = single_open(file, name, NULL); \ | ||
| 14 | sf = file->private_data; \ | ||
| 15 | sf->private = inode->i_private; \ | ||
| 16 | return ret; \ | ||
| 17 | } \ | ||
| 18 | \ | ||
| 19 | static const struct file_operations name##_fops = { \ | ||
| 20 | .open = name##_open, \ | ||
| 21 | .read = seq_read, \ | ||
| 22 | .llseek = seq_lseek, \ | ||
| 23 | .release = single_release, \ | ||
| 24 | }; | ||
| 25 | |||
| 26 | /* debugfs.c */ | ||
| 27 | extern int ceph_debugfs_init(void); | ||
| 28 | extern void ceph_debugfs_cleanup(void); | ||
| 29 | extern int ceph_debugfs_client_init(struct ceph_client *client); | ||
| 30 | extern void ceph_debugfs_client_cleanup(struct ceph_client *client); | ||
| 31 | |||
| 32 | #endif | ||
| 33 | |||
diff --git a/include/linux/ceph/decode.h b/include/linux/ceph/decode.h new file mode 100644 index 000000000000..c5b6939fb32a --- /dev/null +++ b/include/linux/ceph/decode.h | |||
| @@ -0,0 +1,201 @@ | |||
| 1 | #ifndef __CEPH_DECODE_H | ||
| 2 | #define __CEPH_DECODE_H | ||
| 3 | |||
| 4 | #include <asm/unaligned.h> | ||
| 5 | #include <linux/time.h> | ||
| 6 | |||
| 7 | #include "types.h" | ||
| 8 | |||
| 9 | /* | ||
| 10 | * in all cases, | ||
| 11 | * void **p pointer to position pointer | ||
| 12 | * void *end pointer to end of buffer (last byte + 1) | ||
| 13 | */ | ||
| 14 | |||
| 15 | static inline u64 ceph_decode_64(void **p) | ||
| 16 | { | ||
| 17 | u64 v = get_unaligned_le64(*p); | ||
| 18 | *p += sizeof(u64); | ||
| 19 | return v; | ||
| 20 | } | ||
| 21 | static inline u32 ceph_decode_32(void **p) | ||
| 22 | { | ||
| 23 | u32 v = get_unaligned_le32(*p); | ||
| 24 | *p += sizeof(u32); | ||
| 25 | return v; | ||
| 26 | } | ||
| 27 | static inline u16 ceph_decode_16(void **p) | ||
| 28 | { | ||
| 29 | u16 v = get_unaligned_le16(*p); | ||
| 30 | *p += sizeof(u16); | ||
| 31 | return v; | ||
| 32 | } | ||
| 33 | static inline u8 ceph_decode_8(void **p) | ||
| 34 | { | ||
| 35 | u8 v = *(u8 *)*p; | ||
| 36 | (*p)++; | ||
| 37 | return v; | ||
| 38 | } | ||
| 39 | static inline void ceph_decode_copy(void **p, void *pv, size_t n) | ||
| 40 | { | ||
| 41 | memcpy(pv, *p, n); | ||
| 42 | *p += n; | ||
| 43 | } | ||
| 44 | |||
| 45 | /* | ||
| 46 | * bounds check input. | ||
| 47 | */ | ||
| 48 | #define ceph_decode_need(p, end, n, bad) \ | ||
| 49 | do { \ | ||
| 50 | if (unlikely(*(p) + (n) > (end))) \ | ||
| 51 | goto bad; \ | ||
| 52 | } while (0) | ||
| 53 | |||
| 54 | #define ceph_decode_64_safe(p, end, v, bad) \ | ||
| 55 | do { \ | ||
| 56 | ceph_decode_need(p, end, sizeof(u64), bad); \ | ||
| 57 | v = ceph_decode_64(p); \ | ||
| 58 | } while (0) | ||
| 59 | #define ceph_decode_32_safe(p, end, v, bad) \ | ||
| 60 | do { \ | ||
| 61 | ceph_decode_need(p, end, sizeof(u32), bad); \ | ||
| 62 | v = ceph_decode_32(p); \ | ||
| 63 | } while (0) | ||
| 64 | #define ceph_decode_16_safe(p, end, v, bad) \ | ||
| 65 | do { \ | ||
| 66 | ceph_decode_need(p, end, sizeof(u16), bad); \ | ||
| 67 | v = ceph_decode_16(p); \ | ||
| 68 | } while (0) | ||
| 69 | #define ceph_decode_8_safe(p, end, v, bad) \ | ||
| 70 | do { \ | ||
| 71 | ceph_decode_need(p, end, sizeof(u8), bad); \ | ||
| 72 | v = ceph_decode_8(p); \ | ||
| 73 | } while (0) | ||
| 74 | |||
| 75 | #define ceph_decode_copy_safe(p, end, pv, n, bad) \ | ||
| 76 | do { \ | ||
| 77 | ceph_decode_need(p, end, n, bad); \ | ||
| 78 | ceph_decode_copy(p, pv, n); \ | ||
| 79 | } while (0) | ||
| 80 | |||
| 81 | /* | ||
| 82 | * struct ceph_timespec <-> struct timespec | ||
| 83 | */ | ||
| 84 | static inline void ceph_decode_timespec(struct timespec *ts, | ||
| 85 | const struct ceph_timespec *tv) | ||
| 86 | { | ||
| 87 | ts->tv_sec = le32_to_cpu(tv->tv_sec); | ||
| 88 | ts->tv_nsec = le32_to_cpu(tv->tv_nsec); | ||
| 89 | } | ||
| 90 | static inline void ceph_encode_timespec(struct ceph_timespec *tv, | ||
| 91 | const struct timespec *ts) | ||
| 92 | { | ||
| 93 | tv->tv_sec = cpu_to_le32(ts->tv_sec); | ||
| 94 | tv->tv_nsec = cpu_to_le32(ts->tv_nsec); | ||
| 95 | } | ||
| 96 | |||
| 97 | /* | ||
| 98 | * sockaddr_storage <-> ceph_sockaddr | ||
| 99 | */ | ||
| 100 | static inline void ceph_encode_addr(struct ceph_entity_addr *a) | ||
| 101 | { | ||
| 102 | __be16 ss_family = htons(a->in_addr.ss_family); | ||
| 103 | a->in_addr.ss_family = *(__u16 *)&ss_family; | ||
| 104 | } | ||
| 105 | static inline void ceph_decode_addr(struct ceph_entity_addr *a) | ||
| 106 | { | ||
| 107 | __be16 ss_family = *(__be16 *)&a->in_addr.ss_family; | ||
| 108 | a->in_addr.ss_family = ntohs(ss_family); | ||
| 109 | WARN_ON(a->in_addr.ss_family == 512); | ||
| 110 | } | ||
| 111 | |||
| 112 | /* | ||
| 113 | * encoders | ||
| 114 | */ | ||
| 115 | static inline void ceph_encode_64(void **p, u64 v) | ||
| 116 | { | ||
| 117 | put_unaligned_le64(v, (__le64 *)*p); | ||
| 118 | *p += sizeof(u64); | ||
| 119 | } | ||
| 120 | static inline void ceph_encode_32(void **p, u32 v) | ||
| 121 | { | ||
| 122 | put_unaligned_le32(v, (__le32 *)*p); | ||
| 123 | *p += sizeof(u32); | ||
| 124 | } | ||
| 125 | static inline void ceph_encode_16(void **p, u16 v) | ||
| 126 | { | ||
| 127 | put_unaligned_le16(v, (__le16 *)*p); | ||
| 128 | *p += sizeof(u16); | ||
| 129 | } | ||
| 130 | static inline void ceph_encode_8(void **p, u8 v) | ||
| 131 | { | ||
| 132 | *(u8 *)*p = v; | ||
| 133 | (*p)++; | ||
| 134 | } | ||
| 135 | static inline void ceph_encode_copy(void **p, const void *s, int len) | ||
| 136 | { | ||
| 137 | memcpy(*p, s, len); | ||
| 138 | *p += len; | ||
| 139 | } | ||
| 140 | |||
| 141 | /* | ||
| 142 | * filepath, string encoders | ||
| 143 | */ | ||
| 144 | static inline void ceph_encode_filepath(void **p, void *end, | ||
| 145 | u64 ino, const char *path) | ||
| 146 | { | ||
| 147 | u32 len = path ? strlen(path) : 0; | ||
| 148 | BUG_ON(*p + sizeof(ino) + sizeof(len) + len > end); | ||
| 149 | ceph_encode_8(p, 1); | ||
| 150 | ceph_encode_64(p, ino); | ||
| 151 | ceph_encode_32(p, len); | ||
| 152 | if (len) | ||
| 153 | memcpy(*p, path, len); | ||
| 154 | *p += len; | ||
| 155 | } | ||
| 156 | |||
| 157 | static inline void ceph_encode_string(void **p, void *end, | ||
| 158 | const char *s, u32 len) | ||
| 159 | { | ||
| 160 | BUG_ON(*p + sizeof(len) + len > end); | ||
| 161 | ceph_encode_32(p, len); | ||
| 162 | if (len) | ||
| 163 | memcpy(*p, s, len); | ||
| 164 | *p += len; | ||
| 165 | } | ||
| 166 | |||
| 167 | #define ceph_encode_need(p, end, n, bad) \ | ||
| 168 | do { \ | ||
| 169 | if (unlikely(*(p) + (n) > (end))) \ | ||
| 170 | goto bad; \ | ||
| 171 | } while (0) | ||
| 172 | |||
| 173 | #define ceph_encode_64_safe(p, end, v, bad) \ | ||
| 174 | do { \ | ||
| 175 | ceph_encode_need(p, end, sizeof(u64), bad); \ | ||
| 176 | ceph_encode_64(p, v); \ | ||
| 177 | } while (0) | ||
| 178 | #define ceph_encode_32_safe(p, end, v, bad) \ | ||
| 179 | do { \ | ||
| 180 | ceph_encode_need(p, end, sizeof(u32), bad); \ | ||
| 181 | ceph_encode_32(p, v); \ | ||
| 182 | } while (0) | ||
| 183 | #define ceph_encode_16_safe(p, end, v, bad) \ | ||
| 184 | do { \ | ||
| 185 | ceph_encode_need(p, end, sizeof(u16), bad); \ | ||
| 186 | ceph_encode_16(p, v); \ | ||
| 187 | } while (0) | ||
| 188 | |||
| 189 | #define ceph_encode_copy_safe(p, end, pv, n, bad) \ | ||
| 190 | do { \ | ||
| 191 | ceph_encode_need(p, end, n, bad); \ | ||
| 192 | ceph_encode_copy(p, pv, n); \ | ||
| 193 | } while (0) | ||
| 194 | #define ceph_encode_string_safe(p, end, s, n, bad) \ | ||
| 195 | do { \ | ||
| 196 | ceph_encode_need(p, end, n, bad); \ | ||
| 197 | ceph_encode_string(p, end, s, n); \ | ||
| 198 | } while (0) | ||
| 199 | |||
| 200 | |||
| 201 | #endif | ||
diff --git a/include/linux/ceph/libceph.h b/include/linux/ceph/libceph.h new file mode 100644 index 000000000000..f22b2e941686 --- /dev/null +++ b/include/linux/ceph/libceph.h | |||
| @@ -0,0 +1,249 @@ | |||
| 1 | #ifndef _FS_CEPH_LIBCEPH_H | ||
| 2 | #define _FS_CEPH_LIBCEPH_H | ||
| 3 | |||
| 4 | #include "ceph_debug.h" | ||
| 5 | |||
| 6 | #include <asm/unaligned.h> | ||
| 7 | #include <linux/backing-dev.h> | ||
| 8 | #include <linux/completion.h> | ||
| 9 | #include <linux/exportfs.h> | ||
| 10 | #include <linux/fs.h> | ||
| 11 | #include <linux/mempool.h> | ||
| 12 | #include <linux/pagemap.h> | ||
| 13 | #include <linux/wait.h> | ||
| 14 | #include <linux/writeback.h> | ||
| 15 | #include <linux/slab.h> | ||
| 16 | |||
| 17 | #include "types.h" | ||
| 18 | #include "messenger.h" | ||
| 19 | #include "msgpool.h" | ||
| 20 | #include "mon_client.h" | ||
| 21 | #include "osd_client.h" | ||
| 22 | #include "ceph_fs.h" | ||
| 23 | |||
| 24 | /* | ||
| 25 | * Supported features | ||
| 26 | */ | ||
| 27 | #define CEPH_FEATURE_SUPPORTED_DEFAULT CEPH_FEATURE_NOSRCADDR | ||
| 28 | #define CEPH_FEATURE_REQUIRED_DEFAULT CEPH_FEATURE_NOSRCADDR | ||
| 29 | |||
| 30 | /* | ||
| 31 | * mount options | ||
| 32 | */ | ||
| 33 | #define CEPH_OPT_FSID (1<<0) | ||
| 34 | #define CEPH_OPT_NOSHARE (1<<1) /* don't share client with other sbs */ | ||
| 35 | #define CEPH_OPT_MYIP (1<<2) /* specified my ip */ | ||
| 36 | #define CEPH_OPT_NOCRC (1<<3) /* no data crc on writes */ | ||
| 37 | |||
| 38 | #define CEPH_OPT_DEFAULT (0); | ||
| 39 | |||
| 40 | #define ceph_set_opt(client, opt) \ | ||
| 41 | (client)->options->flags |= CEPH_OPT_##opt; | ||
| 42 | #define ceph_test_opt(client, opt) \ | ||
| 43 | (!!((client)->options->flags & CEPH_OPT_##opt)) | ||
| 44 | |||
| 45 | struct ceph_options { | ||
| 46 | int flags; | ||
| 47 | struct ceph_fsid fsid; | ||
| 48 | struct ceph_entity_addr my_addr; | ||
| 49 | int mount_timeout; | ||
| 50 | int osd_idle_ttl; | ||
| 51 | int osd_timeout; | ||
| 52 | int osd_keepalive_timeout; | ||
| 53 | |||
| 54 | /* | ||
| 55 | * any type that can't be simply compared or doesn't need need | ||
| 56 | * to be compared should go beyond this point, | ||
| 57 | * ceph_compare_options() should be updated accordingly | ||
| 58 | */ | ||
| 59 | |||
| 60 | struct ceph_entity_addr *mon_addr; /* should be the first | ||
| 61 | pointer type of args */ | ||
| 62 | int num_mon; | ||
| 63 | char *name; | ||
| 64 | char *secret; | ||
| 65 | }; | ||
| 66 | |||
| 67 | /* | ||
| 68 | * defaults | ||
| 69 | */ | ||
| 70 | #define CEPH_MOUNT_TIMEOUT_DEFAULT 60 | ||
| 71 | #define CEPH_OSD_TIMEOUT_DEFAULT 60 /* seconds */ | ||
| 72 | #define CEPH_OSD_KEEPALIVE_DEFAULT 5 | ||
| 73 | #define CEPH_OSD_IDLE_TTL_DEFAULT 60 | ||
| 74 | #define CEPH_MOUNT_RSIZE_DEFAULT (512*1024) /* readahead */ | ||
| 75 | |||
| 76 | #define CEPH_MSG_MAX_FRONT_LEN (16*1024*1024) | ||
| 77 | #define CEPH_MSG_MAX_DATA_LEN (16*1024*1024) | ||
| 78 | |||
| 79 | #define CEPH_AUTH_NAME_DEFAULT "guest" | ||
| 80 | |||
| 81 | /* | ||
| 82 | * Delay telling the MDS we no longer want caps, in case we reopen | ||
| 83 | * the file. Delay a minimum amount of time, even if we send a cap | ||
| 84 | * message for some other reason. Otherwise, take the oppotunity to | ||
| 85 | * update the mds to avoid sending another message later. | ||
| 86 | */ | ||
| 87 | #define CEPH_CAPS_WANTED_DELAY_MIN_DEFAULT 5 /* cap release delay */ | ||
| 88 | #define CEPH_CAPS_WANTED_DELAY_MAX_DEFAULT 60 /* cap release delay */ | ||
| 89 | |||
| 90 | #define CEPH_CAP_RELEASE_SAFETY_DEFAULT (CEPH_CAPS_PER_RELEASE * 4) | ||
| 91 | |||
| 92 | /* mount state */ | ||
| 93 | enum { | ||
| 94 | CEPH_MOUNT_MOUNTING, | ||
| 95 | CEPH_MOUNT_MOUNTED, | ||
| 96 | CEPH_MOUNT_UNMOUNTING, | ||
| 97 | CEPH_MOUNT_UNMOUNTED, | ||
| 98 | CEPH_MOUNT_SHUTDOWN, | ||
| 99 | }; | ||
| 100 | |||
| 101 | /* | ||
| 102 | * subtract jiffies | ||
| 103 | */ | ||
| 104 | static inline unsigned long time_sub(unsigned long a, unsigned long b) | ||
| 105 | { | ||
| 106 | BUG_ON(time_after(b, a)); | ||
| 107 | return (long)a - (long)b; | ||
| 108 | } | ||
| 109 | |||
| 110 | struct ceph_mds_client; | ||
| 111 | |||
| 112 | /* | ||
| 113 | * per client state | ||
| 114 | * | ||
| 115 | * possibly shared by multiple mount points, if they are | ||
| 116 | * mounting the same ceph filesystem/cluster. | ||
| 117 | */ | ||
| 118 | struct ceph_client { | ||
| 119 | struct ceph_fsid fsid; | ||
| 120 | bool have_fsid; | ||
| 121 | |||
| 122 | void *private; | ||
| 123 | |||
| 124 | struct ceph_options *options; | ||
| 125 | |||
| 126 | struct mutex mount_mutex; /* serialize mount attempts */ | ||
| 127 | wait_queue_head_t auth_wq; | ||
| 128 | int auth_err; | ||
| 129 | |||
| 130 | int (*extra_mon_dispatch)(struct ceph_client *, struct ceph_msg *); | ||
| 131 | |||
| 132 | u32 supported_features; | ||
| 133 | u32 required_features; | ||
| 134 | |||
| 135 | struct ceph_messenger *msgr; /* messenger instance */ | ||
| 136 | struct ceph_mon_client monc; | ||
| 137 | struct ceph_osd_client osdc; | ||
| 138 | |||
| 139 | #ifdef CONFIG_DEBUG_FS | ||
| 140 | struct dentry *debugfs_dir; | ||
| 141 | struct dentry *debugfs_monmap; | ||
| 142 | struct dentry *debugfs_osdmap; | ||
| 143 | #endif | ||
| 144 | }; | ||
| 145 | |||
| 146 | |||
| 147 | |||
| 148 | /* | ||
| 149 | * snapshots | ||
| 150 | */ | ||
| 151 | |||
| 152 | /* | ||
| 153 | * A "snap context" is the set of existing snapshots when we | ||
| 154 | * write data. It is used by the OSD to guide its COW behavior. | ||
| 155 | * | ||
| 156 | * The ceph_snap_context is refcounted, and attached to each dirty | ||
| 157 | * page, indicating which context the dirty data belonged when it was | ||
| 158 | * dirtied. | ||
| 159 | */ | ||
| 160 | struct ceph_snap_context { | ||
| 161 | atomic_t nref; | ||
| 162 | u64 seq; | ||
| 163 | int num_snaps; | ||
| 164 | u64 snaps[]; | ||
| 165 | }; | ||
| 166 | |||
| 167 | static inline struct ceph_snap_context * | ||
| 168 | ceph_get_snap_context(struct ceph_snap_context *sc) | ||
| 169 | { | ||
| 170 | /* | ||
| 171 | printk("get_snap_context %p %d -> %d\n", sc, atomic_read(&sc->nref), | ||
| 172 | atomic_read(&sc->nref)+1); | ||
| 173 | */ | ||
| 174 | if (sc) | ||
| 175 | atomic_inc(&sc->nref); | ||
| 176 | return sc; | ||
| 177 | } | ||
| 178 | |||
| 179 | static inline void ceph_put_snap_context(struct ceph_snap_context *sc) | ||
| 180 | { | ||
| 181 | if (!sc) | ||
| 182 | return; | ||
| 183 | /* | ||
| 184 | printk("put_snap_context %p %d -> %d\n", sc, atomic_read(&sc->nref), | ||
| 185 | atomic_read(&sc->nref)-1); | ||
| 186 | */ | ||
| 187 | if (atomic_dec_and_test(&sc->nref)) { | ||
| 188 | /*printk(" deleting snap_context %p\n", sc);*/ | ||
| 189 | kfree(sc); | ||
| 190 | } | ||
| 191 | } | ||
| 192 | |||
| 193 | /* | ||
| 194 | * calculate the number of pages a given length and offset map onto, | ||
| 195 | * if we align the data. | ||
| 196 | */ | ||
| 197 | static inline int calc_pages_for(u64 off, u64 len) | ||
| 198 | { | ||
| 199 | return ((off+len+PAGE_CACHE_SIZE-1) >> PAGE_CACHE_SHIFT) - | ||
| 200 | (off >> PAGE_CACHE_SHIFT); | ||
| 201 | } | ||
| 202 | |||
| 203 | /* ceph_common.c */ | ||
| 204 | extern const char *ceph_msg_type_name(int type); | ||
| 205 | extern int ceph_check_fsid(struct ceph_client *client, struct ceph_fsid *fsid); | ||
| 206 | extern struct kmem_cache *ceph_inode_cachep; | ||
| 207 | extern struct kmem_cache *ceph_cap_cachep; | ||
| 208 | extern struct kmem_cache *ceph_dentry_cachep; | ||
| 209 | extern struct kmem_cache *ceph_file_cachep; | ||
| 210 | |||
| 211 | extern int ceph_parse_options(struct ceph_options **popt, char *options, | ||
| 212 | const char *dev_name, const char *dev_name_end, | ||
| 213 | int (*parse_extra_token)(char *c, void *private), | ||
| 214 | void *private); | ||
| 215 | extern void ceph_destroy_options(struct ceph_options *opt); | ||
| 216 | extern int ceph_compare_options(struct ceph_options *new_opt, | ||
| 217 | struct ceph_client *client); | ||
| 218 | extern struct ceph_client *ceph_create_client(struct ceph_options *opt, | ||
| 219 | void *private); | ||
| 220 | extern u64 ceph_client_id(struct ceph_client *client); | ||
| 221 | extern void ceph_destroy_client(struct ceph_client *client); | ||
| 222 | extern int __ceph_open_session(struct ceph_client *client, | ||
| 223 | unsigned long started); | ||
| 224 | extern int ceph_open_session(struct ceph_client *client); | ||
| 225 | |||
| 226 | /* pagevec.c */ | ||
| 227 | extern void ceph_release_page_vector(struct page **pages, int num_pages); | ||
| 228 | |||
| 229 | extern struct page **ceph_get_direct_page_vector(const char __user *data, | ||
| 230 | int num_pages, | ||
| 231 | loff_t off, size_t len); | ||
| 232 | extern void ceph_put_page_vector(struct page **pages, int num_pages); | ||
| 233 | extern void ceph_release_page_vector(struct page **pages, int num_pages); | ||
| 234 | extern struct page **ceph_alloc_page_vector(int num_pages, gfp_t flags); | ||
| 235 | extern int ceph_copy_user_to_page_vector(struct page **pages, | ||
| 236 | const char __user *data, | ||
| 237 | loff_t off, size_t len); | ||
| 238 | extern int ceph_copy_to_page_vector(struct page **pages, | ||
| 239 | const char *data, | ||
| 240 | loff_t off, size_t len); | ||
| 241 | extern int ceph_copy_from_page_vector(struct page **pages, | ||
| 242 | char *data, | ||
| 243 | loff_t off, size_t len); | ||
| 244 | extern int ceph_copy_page_vector_to_user(struct page **pages, char __user *data, | ||
| 245 | loff_t off, size_t len); | ||
| 246 | extern void ceph_zero_page_vector_range(int off, int len, struct page **pages); | ||
| 247 | |||
| 248 | |||
| 249 | #endif /* _FS_CEPH_SUPER_H */ | ||
diff --git a/include/linux/ceph/mdsmap.h b/include/linux/ceph/mdsmap.h new file mode 100644 index 000000000000..4c5cb0880bba --- /dev/null +++ b/include/linux/ceph/mdsmap.h | |||
| @@ -0,0 +1,62 @@ | |||
| 1 | #ifndef _FS_CEPH_MDSMAP_H | ||
| 2 | #define _FS_CEPH_MDSMAP_H | ||
| 3 | |||
| 4 | #include "types.h" | ||
| 5 | |||
| 6 | /* | ||
| 7 | * mds map - describe servers in the mds cluster. | ||
| 8 | * | ||
| 9 | * we limit fields to those the client actually xcares about | ||
| 10 | */ | ||
| 11 | struct ceph_mds_info { | ||
| 12 | u64 global_id; | ||
| 13 | struct ceph_entity_addr addr; | ||
| 14 | s32 state; | ||
| 15 | int num_export_targets; | ||
| 16 | bool laggy; | ||
| 17 | u32 *export_targets; | ||
| 18 | }; | ||
| 19 | |||
| 20 | struct ceph_mdsmap { | ||
| 21 | u32 m_epoch, m_client_epoch, m_last_failure; | ||
| 22 | u32 m_root; | ||
| 23 | u32 m_session_timeout; /* seconds */ | ||
| 24 | u32 m_session_autoclose; /* seconds */ | ||
| 25 | u64 m_max_file_size; | ||
| 26 | u32 m_max_mds; /* size of m_addr, m_state arrays */ | ||
| 27 | struct ceph_mds_info *m_info; | ||
| 28 | |||
| 29 | /* which object pools file data can be stored in */ | ||
| 30 | int m_num_data_pg_pools; | ||
| 31 | u32 *m_data_pg_pools; | ||
| 32 | u32 m_cas_pg_pool; | ||
| 33 | }; | ||
| 34 | |||
| 35 | static inline struct ceph_entity_addr * | ||
| 36 | ceph_mdsmap_get_addr(struct ceph_mdsmap *m, int w) | ||
| 37 | { | ||
| 38 | if (w >= m->m_max_mds) | ||
| 39 | return NULL; | ||
| 40 | return &m->m_info[w].addr; | ||
| 41 | } | ||
| 42 | |||
| 43 | static inline int ceph_mdsmap_get_state(struct ceph_mdsmap *m, int w) | ||
| 44 | { | ||
| 45 | BUG_ON(w < 0); | ||
| 46 | if (w >= m->m_max_mds) | ||
| 47 | return CEPH_MDS_STATE_DNE; | ||
| 48 | return m->m_info[w].state; | ||
| 49 | } | ||
| 50 | |||
| 51 | static inline bool ceph_mdsmap_is_laggy(struct ceph_mdsmap *m, int w) | ||
| 52 | { | ||
| 53 | if (w >= 0 && w < m->m_max_mds) | ||
| 54 | return m->m_info[w].laggy; | ||
| 55 | return false; | ||
| 56 | } | ||
| 57 | |||
| 58 | extern int ceph_mdsmap_get_random_mds(struct ceph_mdsmap *m); | ||
| 59 | extern struct ceph_mdsmap *ceph_mdsmap_decode(void **p, void *end); | ||
| 60 | extern void ceph_mdsmap_destroy(struct ceph_mdsmap *m); | ||
| 61 | |||
| 62 | #endif | ||
diff --git a/include/linux/ceph/messenger.h b/include/linux/ceph/messenger.h new file mode 100644 index 000000000000..5956d62c3057 --- /dev/null +++ b/include/linux/ceph/messenger.h | |||
| @@ -0,0 +1,261 @@ | |||
| 1 | #ifndef __FS_CEPH_MESSENGER_H | ||
| 2 | #define __FS_CEPH_MESSENGER_H | ||
| 3 | |||
| 4 | #include <linux/kref.h> | ||
| 5 | #include <linux/mutex.h> | ||
| 6 | #include <linux/net.h> | ||
| 7 | #include <linux/radix-tree.h> | ||
| 8 | #include <linux/uio.h> | ||
| 9 | #include <linux/version.h> | ||
| 10 | #include <linux/workqueue.h> | ||
| 11 | |||
| 12 | #include "types.h" | ||
| 13 | #include "buffer.h" | ||
| 14 | |||
| 15 | struct ceph_msg; | ||
| 16 | struct ceph_connection; | ||
| 17 | |||
| 18 | extern struct workqueue_struct *ceph_msgr_wq; /* receive work queue */ | ||
| 19 | |||
| 20 | /* | ||
| 21 | * Ceph defines these callbacks for handling connection events. | ||
| 22 | */ | ||
| 23 | struct ceph_connection_operations { | ||
| 24 | struct ceph_connection *(*get)(struct ceph_connection *); | ||
| 25 | void (*put)(struct ceph_connection *); | ||
| 26 | |||
| 27 | /* handle an incoming message. */ | ||
| 28 | void (*dispatch) (struct ceph_connection *con, struct ceph_msg *m); | ||
| 29 | |||
| 30 | /* authorize an outgoing connection */ | ||
| 31 | int (*get_authorizer) (struct ceph_connection *con, | ||
| 32 | void **buf, int *len, int *proto, | ||
| 33 | void **reply_buf, int *reply_len, int force_new); | ||
| 34 | int (*verify_authorizer_reply) (struct ceph_connection *con, int len); | ||
| 35 | int (*invalidate_authorizer)(struct ceph_connection *con); | ||
| 36 | |||
| 37 | /* protocol version mismatch */ | ||
| 38 | void (*bad_proto) (struct ceph_connection *con); | ||
| 39 | |||
| 40 | /* there was some error on the socket (disconnect, whatever) */ | ||
| 41 | void (*fault) (struct ceph_connection *con); | ||
| 42 | |||
| 43 | /* a remote host as terminated a message exchange session, and messages | ||
| 44 | * we sent (or they tried to send us) may be lost. */ | ||
| 45 | void (*peer_reset) (struct ceph_connection *con); | ||
| 46 | |||
| 47 | struct ceph_msg * (*alloc_msg) (struct ceph_connection *con, | ||
| 48 | struct ceph_msg_header *hdr, | ||
| 49 | int *skip); | ||
| 50 | }; | ||
| 51 | |||
| 52 | /* use format string %s%d */ | ||
| 53 | #define ENTITY_NAME(n) ceph_entity_type_name((n).type), le64_to_cpu((n).num) | ||
| 54 | |||
| 55 | struct ceph_messenger { | ||
| 56 | struct ceph_entity_inst inst; /* my name+address */ | ||
| 57 | struct ceph_entity_addr my_enc_addr; | ||
| 58 | struct page *zero_page; /* used in certain error cases */ | ||
| 59 | |||
| 60 | bool nocrc; | ||
| 61 | |||
| 62 | /* | ||
| 63 | * the global_seq counts connections i (attempt to) initiate | ||
| 64 | * in order to disambiguate certain connect race conditions. | ||
| 65 | */ | ||
| 66 | u32 global_seq; | ||
| 67 | spinlock_t global_seq_lock; | ||
| 68 | |||
| 69 | u32 supported_features; | ||
| 70 | u32 required_features; | ||
| 71 | }; | ||
| 72 | |||
| 73 | /* | ||
| 74 | * a single message. it contains a header (src, dest, message type, etc.), | ||
| 75 | * footer (crc values, mainly), a "front" message body, and possibly a | ||
| 76 | * data payload (stored in some number of pages). | ||
| 77 | */ | ||
| 78 | struct ceph_msg { | ||
| 79 | struct ceph_msg_header hdr; /* header */ | ||
| 80 | struct ceph_msg_footer footer; /* footer */ | ||
| 81 | struct kvec front; /* unaligned blobs of message */ | ||
| 82 | struct ceph_buffer *middle; | ||
| 83 | struct page **pages; /* data payload. NOT OWNER. */ | ||
| 84 | unsigned nr_pages; /* size of page array */ | ||
| 85 | struct ceph_pagelist *pagelist; /* instead of pages */ | ||
| 86 | struct list_head list_head; | ||
| 87 | struct kref kref; | ||
| 88 | struct bio *bio; /* instead of pages/pagelist */ | ||
| 89 | struct bio *bio_iter; /* bio iterator */ | ||
| 90 | int bio_seg; /* current bio segment */ | ||
| 91 | struct ceph_pagelist *trail; /* the trailing part of the data */ | ||
| 92 | bool front_is_vmalloc; | ||
| 93 | bool more_to_follow; | ||
| 94 | bool needs_out_seq; | ||
| 95 | int front_max; | ||
| 96 | |||
| 97 | struct ceph_msgpool *pool; | ||
| 98 | }; | ||
| 99 | |||
| 100 | struct ceph_msg_pos { | ||
| 101 | int page, page_pos; /* which page; offset in page */ | ||
| 102 | int data_pos; /* offset in data payload */ | ||
| 103 | int did_page_crc; /* true if we've calculated crc for current page */ | ||
| 104 | }; | ||
| 105 | |||
| 106 | /* ceph connection fault delay defaults, for exponential backoff */ | ||
| 107 | #define BASE_DELAY_INTERVAL (HZ/2) | ||
| 108 | #define MAX_DELAY_INTERVAL (5 * 60 * HZ) | ||
| 109 | |||
| 110 | /* | ||
| 111 | * ceph_connection state bit flags | ||
| 112 | * | ||
| 113 | * QUEUED and BUSY are used together to ensure that only a single | ||
| 114 | * thread is currently opening, reading or writing data to the socket. | ||
| 115 | */ | ||
| 116 | #define LOSSYTX 0 /* we can close channel or drop messages on errors */ | ||
| 117 | #define CONNECTING 1 | ||
| 118 | #define NEGOTIATING 2 | ||
| 119 | #define KEEPALIVE_PENDING 3 | ||
| 120 | #define WRITE_PENDING 4 /* we have data ready to send */ | ||
| 121 | #define QUEUED 5 /* there is work queued on this connection */ | ||
| 122 | #define BUSY 6 /* work is being done */ | ||
| 123 | #define STANDBY 8 /* no outgoing messages, socket closed. we keep | ||
| 124 | * the ceph_connection around to maintain shared | ||
| 125 | * state with the peer. */ | ||
| 126 | #define CLOSED 10 /* we've closed the connection */ | ||
| 127 | #define SOCK_CLOSED 11 /* socket state changed to closed */ | ||
| 128 | #define OPENING 13 /* open connection w/ (possibly new) peer */ | ||
| 129 | #define DEAD 14 /* dead, about to kfree */ | ||
| 130 | |||
| 131 | /* | ||
| 132 | * A single connection with another host. | ||
| 133 | * | ||
| 134 | * We maintain a queue of outgoing messages, and some session state to | ||
| 135 | * ensure that we can preserve the lossless, ordered delivery of | ||
| 136 | * messages in the case of a TCP disconnect. | ||
| 137 | */ | ||
| 138 | struct ceph_connection { | ||
| 139 | void *private; | ||
| 140 | atomic_t nref; | ||
| 141 | |||
| 142 | const struct ceph_connection_operations *ops; | ||
| 143 | |||
| 144 | struct ceph_messenger *msgr; | ||
| 145 | struct socket *sock; | ||
| 146 | unsigned long state; /* connection state (see flags above) */ | ||
| 147 | const char *error_msg; /* error message, if any */ | ||
| 148 | |||
| 149 | struct ceph_entity_addr peer_addr; /* peer address */ | ||
| 150 | struct ceph_entity_name peer_name; /* peer name */ | ||
| 151 | struct ceph_entity_addr peer_addr_for_me; | ||
| 152 | unsigned peer_features; | ||
| 153 | u32 connect_seq; /* identify the most recent connection | ||
| 154 | attempt for this connection, client */ | ||
| 155 | u32 peer_global_seq; /* peer's global seq for this connection */ | ||
| 156 | |||
| 157 | int auth_retry; /* true if we need a newer authorizer */ | ||
| 158 | void *auth_reply_buf; /* where to put the authorizer reply */ | ||
| 159 | int auth_reply_buf_len; | ||
| 160 | |||
| 161 | struct mutex mutex; | ||
| 162 | |||
| 163 | /* out queue */ | ||
| 164 | struct list_head out_queue; | ||
| 165 | struct list_head out_sent; /* sending or sent but unacked */ | ||
| 166 | u64 out_seq; /* last message queued for send */ | ||
| 167 | bool out_keepalive_pending; | ||
| 168 | |||
| 169 | u64 in_seq, in_seq_acked; /* last message received, acked */ | ||
| 170 | |||
| 171 | /* connection negotiation temps */ | ||
| 172 | char in_banner[CEPH_BANNER_MAX_LEN]; | ||
| 173 | union { | ||
| 174 | struct { /* outgoing connection */ | ||
| 175 | struct ceph_msg_connect out_connect; | ||
| 176 | struct ceph_msg_connect_reply in_reply; | ||
| 177 | }; | ||
| 178 | struct { /* incoming */ | ||
| 179 | struct ceph_msg_connect in_connect; | ||
| 180 | struct ceph_msg_connect_reply out_reply; | ||
| 181 | }; | ||
| 182 | }; | ||
| 183 | struct ceph_entity_addr actual_peer_addr; | ||
| 184 | |||
| 185 | /* message out temps */ | ||
| 186 | struct ceph_msg *out_msg; /* sending message (== tail of | ||
| 187 | out_sent) */ | ||
| 188 | bool out_msg_done; | ||
| 189 | struct ceph_msg_pos out_msg_pos; | ||
| 190 | |||
| 191 | struct kvec out_kvec[8], /* sending header/footer data */ | ||
| 192 | *out_kvec_cur; | ||
| 193 | int out_kvec_left; /* kvec's left in out_kvec */ | ||
| 194 | int out_skip; /* skip this many bytes */ | ||
| 195 | int out_kvec_bytes; /* total bytes left */ | ||
| 196 | bool out_kvec_is_msg; /* kvec refers to out_msg */ | ||
| 197 | int out_more; /* there is more data after the kvecs */ | ||
| 198 | __le64 out_temp_ack; /* for writing an ack */ | ||
| 199 | |||
| 200 | /* message in temps */ | ||
| 201 | struct ceph_msg_header in_hdr; | ||
| 202 | struct ceph_msg *in_msg; | ||
| 203 | struct ceph_msg_pos in_msg_pos; | ||
| 204 | u32 in_front_crc, in_middle_crc, in_data_crc; /* calculated crc */ | ||
| 205 | |||
| 206 | char in_tag; /* protocol control byte */ | ||
| 207 | int in_base_pos; /* bytes read */ | ||
| 208 | __le64 in_temp_ack; /* for reading an ack */ | ||
| 209 | |||
| 210 | struct delayed_work work; /* send|recv work */ | ||
| 211 | unsigned long delay; /* current delay interval */ | ||
| 212 | }; | ||
| 213 | |||
| 214 | |||
| 215 | extern const char *ceph_pr_addr(const struct sockaddr_storage *ss); | ||
| 216 | extern int ceph_parse_ips(const char *c, const char *end, | ||
| 217 | struct ceph_entity_addr *addr, | ||
| 218 | int max_count, int *count); | ||
| 219 | |||
| 220 | |||
| 221 | extern int ceph_msgr_init(void); | ||
| 222 | extern void ceph_msgr_exit(void); | ||
| 223 | extern void ceph_msgr_flush(void); | ||
| 224 | |||
| 225 | extern struct ceph_messenger *ceph_messenger_create( | ||
| 226 | struct ceph_entity_addr *myaddr, | ||
| 227 | u32 features, u32 required); | ||
| 228 | extern void ceph_messenger_destroy(struct ceph_messenger *); | ||
| 229 | |||
| 230 | extern void ceph_con_init(struct ceph_messenger *msgr, | ||
| 231 | struct ceph_connection *con); | ||
| 232 | extern void ceph_con_open(struct ceph_connection *con, | ||
| 233 | struct ceph_entity_addr *addr); | ||
| 234 | extern bool ceph_con_opened(struct ceph_connection *con); | ||
| 235 | extern void ceph_con_close(struct ceph_connection *con); | ||
| 236 | extern void ceph_con_send(struct ceph_connection *con, struct ceph_msg *msg); | ||
| 237 | extern void ceph_con_revoke(struct ceph_connection *con, struct ceph_msg *msg); | ||
| 238 | extern void ceph_con_revoke_message(struct ceph_connection *con, | ||
| 239 | struct ceph_msg *msg); | ||
| 240 | extern void ceph_con_keepalive(struct ceph_connection *con); | ||
| 241 | extern struct ceph_connection *ceph_con_get(struct ceph_connection *con); | ||
| 242 | extern void ceph_con_put(struct ceph_connection *con); | ||
| 243 | |||
| 244 | extern struct ceph_msg *ceph_msg_new(int type, int front_len, gfp_t flags); | ||
| 245 | extern void ceph_msg_kfree(struct ceph_msg *m); | ||
| 246 | |||
| 247 | |||
| 248 | static inline struct ceph_msg *ceph_msg_get(struct ceph_msg *msg) | ||
| 249 | { | ||
| 250 | kref_get(&msg->kref); | ||
| 251 | return msg; | ||
| 252 | } | ||
| 253 | extern void ceph_msg_last_put(struct kref *kref); | ||
| 254 | static inline void ceph_msg_put(struct ceph_msg *msg) | ||
| 255 | { | ||
| 256 | kref_put(&msg->kref, ceph_msg_last_put); | ||
| 257 | } | ||
| 258 | |||
| 259 | extern void ceph_msg_dump(struct ceph_msg *msg); | ||
| 260 | |||
| 261 | #endif | ||
diff --git a/include/linux/ceph/mon_client.h b/include/linux/ceph/mon_client.h new file mode 100644 index 000000000000..545f85917780 --- /dev/null +++ b/include/linux/ceph/mon_client.h | |||
| @@ -0,0 +1,122 @@ | |||
| 1 | #ifndef _FS_CEPH_MON_CLIENT_H | ||
| 2 | #define _FS_CEPH_MON_CLIENT_H | ||
| 3 | |||
| 4 | #include <linux/completion.h> | ||
| 5 | #include <linux/kref.h> | ||
| 6 | #include <linux/rbtree.h> | ||
| 7 | |||
| 8 | #include "messenger.h" | ||
| 9 | |||
| 10 | struct ceph_client; | ||
| 11 | struct ceph_mount_args; | ||
| 12 | struct ceph_auth_client; | ||
| 13 | |||
| 14 | /* | ||
| 15 | * The monitor map enumerates the set of all monitors. | ||
| 16 | */ | ||
| 17 | struct ceph_monmap { | ||
| 18 | struct ceph_fsid fsid; | ||
| 19 | u32 epoch; | ||
| 20 | u32 num_mon; | ||
| 21 | struct ceph_entity_inst mon_inst[0]; | ||
| 22 | }; | ||
| 23 | |||
| 24 | struct ceph_mon_client; | ||
| 25 | struct ceph_mon_generic_request; | ||
| 26 | |||
| 27 | |||
| 28 | /* | ||
| 29 | * Generic mechanism for resending monitor requests. | ||
| 30 | */ | ||
| 31 | typedef void (*ceph_monc_request_func_t)(struct ceph_mon_client *monc, | ||
| 32 | int newmon); | ||
| 33 | |||
| 34 | /* a pending monitor request */ | ||
| 35 | struct ceph_mon_request { | ||
| 36 | struct ceph_mon_client *monc; | ||
| 37 | struct delayed_work delayed_work; | ||
| 38 | unsigned long delay; | ||
| 39 | ceph_monc_request_func_t do_request; | ||
| 40 | }; | ||
| 41 | |||
| 42 | /* | ||
| 43 | * ceph_mon_generic_request is being used for the statfs and poolop requests | ||
| 44 | * which are bening done a bit differently because we need to get data back | ||
| 45 | * to the caller | ||
| 46 | */ | ||
| 47 | struct ceph_mon_generic_request { | ||
| 48 | struct kref kref; | ||
| 49 | u64 tid; | ||
| 50 | struct rb_node node; | ||
| 51 | int result; | ||
| 52 | void *buf; | ||
| 53 | int buf_len; | ||
| 54 | struct completion completion; | ||
| 55 | struct ceph_msg *request; /* original request */ | ||
| 56 | struct ceph_msg *reply; /* and reply */ | ||
| 57 | }; | ||
| 58 | |||
| 59 | struct ceph_mon_client { | ||
| 60 | struct ceph_client *client; | ||
| 61 | struct ceph_monmap *monmap; | ||
| 62 | |||
| 63 | struct mutex mutex; | ||
| 64 | struct delayed_work delayed_work; | ||
| 65 | |||
| 66 | struct ceph_auth_client *auth; | ||
| 67 | struct ceph_msg *m_auth, *m_auth_reply, *m_subscribe, *m_subscribe_ack; | ||
| 68 | int pending_auth; | ||
| 69 | |||
| 70 | bool hunting; | ||
| 71 | int cur_mon; /* last monitor i contacted */ | ||
| 72 | unsigned long sub_sent, sub_renew_after; | ||
| 73 | struct ceph_connection *con; | ||
| 74 | bool have_fsid; | ||
| 75 | |||
| 76 | /* pending generic requests */ | ||
| 77 | struct rb_root generic_request_tree; | ||
| 78 | int num_generic_requests; | ||
| 79 | u64 last_tid; | ||
| 80 | |||
| 81 | /* mds/osd map */ | ||
| 82 | int want_mdsmap; | ||
| 83 | int want_next_osdmap; /* 1 = want, 2 = want+asked */ | ||
| 84 | u32 have_osdmap, have_mdsmap; | ||
| 85 | |||
| 86 | #ifdef CONFIG_DEBUG_FS | ||
| 87 | struct dentry *debugfs_file; | ||
| 88 | #endif | ||
| 89 | }; | ||
| 90 | |||
| 91 | extern struct ceph_monmap *ceph_monmap_decode(void *p, void *end); | ||
| 92 | extern int ceph_monmap_contains(struct ceph_monmap *m, | ||
| 93 | struct ceph_entity_addr *addr); | ||
| 94 | |||
| 95 | extern int ceph_monc_init(struct ceph_mon_client *monc, struct ceph_client *cl); | ||
| 96 | extern void ceph_monc_stop(struct ceph_mon_client *monc); | ||
| 97 | |||
| 98 | /* | ||
| 99 | * The model here is to indicate that we need a new map of at least | ||
| 100 | * epoch @want, and also call in when we receive a map. We will | ||
| 101 | * periodically rerequest the map from the monitor cluster until we | ||
| 102 | * get what we want. | ||
| 103 | */ | ||
| 104 | extern int ceph_monc_got_mdsmap(struct ceph_mon_client *monc, u32 have); | ||
| 105 | extern int ceph_monc_got_osdmap(struct ceph_mon_client *monc, u32 have); | ||
| 106 | |||
| 107 | extern void ceph_monc_request_next_osdmap(struct ceph_mon_client *monc); | ||
| 108 | |||
| 109 | extern int ceph_monc_do_statfs(struct ceph_mon_client *monc, | ||
| 110 | struct ceph_statfs *buf); | ||
| 111 | |||
| 112 | extern int ceph_monc_open_session(struct ceph_mon_client *monc); | ||
| 113 | |||
| 114 | extern int ceph_monc_validate_auth(struct ceph_mon_client *monc); | ||
| 115 | |||
| 116 | extern int ceph_monc_create_snapid(struct ceph_mon_client *monc, | ||
| 117 | u32 pool, u64 *snapid); | ||
| 118 | |||
| 119 | extern int ceph_monc_delete_snapid(struct ceph_mon_client *monc, | ||
| 120 | u32 pool, u64 snapid); | ||
| 121 | |||
| 122 | #endif | ||
diff --git a/include/linux/ceph/msgpool.h b/include/linux/ceph/msgpool.h new file mode 100644 index 000000000000..a362605f9368 --- /dev/null +++ b/include/linux/ceph/msgpool.h | |||
| @@ -0,0 +1,25 @@ | |||
| 1 | #ifndef _FS_CEPH_MSGPOOL | ||
| 2 | #define _FS_CEPH_MSGPOOL | ||
| 3 | |||
| 4 | #include <linux/mempool.h> | ||
| 5 | #include "messenger.h" | ||
| 6 | |||
| 7 | /* | ||
| 8 | * we use memory pools for preallocating messages we may receive, to | ||
| 9 | * avoid unexpected OOM conditions. | ||
| 10 | */ | ||
| 11 | struct ceph_msgpool { | ||
| 12 | const char *name; | ||
| 13 | mempool_t *pool; | ||
| 14 | int front_len; /* preallocated payload size */ | ||
| 15 | }; | ||
| 16 | |||
| 17 | extern int ceph_msgpool_init(struct ceph_msgpool *pool, | ||
| 18 | int front_len, int size, bool blocking, | ||
| 19 | const char *name); | ||
| 20 | extern void ceph_msgpool_destroy(struct ceph_msgpool *pool); | ||
| 21 | extern struct ceph_msg *ceph_msgpool_get(struct ceph_msgpool *, | ||
| 22 | int front_len); | ||
| 23 | extern void ceph_msgpool_put(struct ceph_msgpool *, struct ceph_msg *); | ||
| 24 | |||
| 25 | #endif | ||
diff --git a/include/linux/ceph/msgr.h b/include/linux/ceph/msgr.h new file mode 100644 index 000000000000..680d3d648cac --- /dev/null +++ b/include/linux/ceph/msgr.h | |||
| @@ -0,0 +1,175 @@ | |||
| 1 | #ifndef CEPH_MSGR_H | ||
| 2 | #define CEPH_MSGR_H | ||
| 3 | |||
| 4 | /* | ||
| 5 | * Data types for message passing layer used by Ceph. | ||
| 6 | */ | ||
| 7 | |||
| 8 | #define CEPH_MON_PORT 6789 /* default monitor port */ | ||
| 9 | |||
| 10 | /* | ||
| 11 | * client-side processes will try to bind to ports in this | ||
| 12 | * range, simply for the benefit of tools like nmap or wireshark | ||
| 13 | * that would like to identify the protocol. | ||
| 14 | */ | ||
| 15 | #define CEPH_PORT_FIRST 6789 | ||
| 16 | #define CEPH_PORT_START 6800 /* non-monitors start here */ | ||
| 17 | #define CEPH_PORT_LAST 6900 | ||
| 18 | |||
| 19 | /* | ||
| 20 | * tcp connection banner. include a protocol version. and adjust | ||
| 21 | * whenever the wire protocol changes. try to keep this string length | ||
| 22 | * constant. | ||
| 23 | */ | ||
| 24 | #define CEPH_BANNER "ceph v027" | ||
| 25 | #define CEPH_BANNER_MAX_LEN 30 | ||
| 26 | |||
| 27 | |||
| 28 | /* | ||
| 29 | * Rollover-safe type and comparator for 32-bit sequence numbers. | ||
| 30 | * Comparator returns -1, 0, or 1. | ||
| 31 | */ | ||
| 32 | typedef __u32 ceph_seq_t; | ||
| 33 | |||
| 34 | static inline __s32 ceph_seq_cmp(__u32 a, __u32 b) | ||
| 35 | { | ||
| 36 | return (__s32)a - (__s32)b; | ||
| 37 | } | ||
| 38 | |||
| 39 | |||
| 40 | /* | ||
| 41 | * entity_name -- logical name for a process participating in the | ||
| 42 | * network, e.g. 'mds0' or 'osd3'. | ||
| 43 | */ | ||
| 44 | struct ceph_entity_name { | ||
| 45 | __u8 type; /* CEPH_ENTITY_TYPE_* */ | ||
| 46 | __le64 num; | ||
| 47 | } __attribute__ ((packed)); | ||
| 48 | |||
| 49 | #define CEPH_ENTITY_TYPE_MON 0x01 | ||
| 50 | #define CEPH_ENTITY_TYPE_MDS 0x02 | ||
| 51 | #define CEPH_ENTITY_TYPE_OSD 0x04 | ||
| 52 | #define CEPH_ENTITY_TYPE_CLIENT 0x08 | ||
| 53 | #define CEPH_ENTITY_TYPE_AUTH 0x20 | ||
| 54 | |||
| 55 | #define CEPH_ENTITY_TYPE_ANY 0xFF | ||
| 56 | |||
| 57 | extern const char *ceph_entity_type_name(int type); | ||
| 58 | |||
| 59 | /* | ||
| 60 | * entity_addr -- network address | ||
| 61 | */ | ||
| 62 | struct ceph_entity_addr { | ||
| 63 | __le32 type; | ||
| 64 | __le32 nonce; /* unique id for process (e.g. pid) */ | ||
| 65 | struct sockaddr_storage in_addr; | ||
| 66 | } __attribute__ ((packed)); | ||
| 67 | |||
| 68 | struct ceph_entity_inst { | ||
| 69 | struct ceph_entity_name name; | ||
| 70 | struct ceph_entity_addr addr; | ||
| 71 | } __attribute__ ((packed)); | ||
| 72 | |||
| 73 | |||
| 74 | /* used by message exchange protocol */ | ||
| 75 | #define CEPH_MSGR_TAG_READY 1 /* server->client: ready for messages */ | ||
| 76 | #define CEPH_MSGR_TAG_RESETSESSION 2 /* server->client: reset, try again */ | ||
| 77 | #define CEPH_MSGR_TAG_WAIT 3 /* server->client: wait for racing | ||
| 78 | incoming connection */ | ||
| 79 | #define CEPH_MSGR_TAG_RETRY_SESSION 4 /* server->client + cseq: try again | ||
| 80 | with higher cseq */ | ||
| 81 | #define CEPH_MSGR_TAG_RETRY_GLOBAL 5 /* server->client + gseq: try again | ||
| 82 | with higher gseq */ | ||
| 83 | #define CEPH_MSGR_TAG_CLOSE 6 /* closing pipe */ | ||
| 84 | #define CEPH_MSGR_TAG_MSG 7 /* message */ | ||
| 85 | #define CEPH_MSGR_TAG_ACK 8 /* message ack */ | ||
| 86 | #define CEPH_MSGR_TAG_KEEPALIVE 9 /* just a keepalive byte! */ | ||
| 87 | #define CEPH_MSGR_TAG_BADPROTOVER 10 /* bad protocol version */ | ||
| 88 | #define CEPH_MSGR_TAG_BADAUTHORIZER 11 /* bad authorizer */ | ||
| 89 | #define CEPH_MSGR_TAG_FEATURES 12 /* insufficient features */ | ||
| 90 | |||
| 91 | |||
| 92 | /* | ||
| 93 | * connection negotiation | ||
| 94 | */ | ||
| 95 | struct ceph_msg_connect { | ||
| 96 | __le64 features; /* supported feature bits */ | ||
| 97 | __le32 host_type; /* CEPH_ENTITY_TYPE_* */ | ||
| 98 | __le32 global_seq; /* count connections initiated by this host */ | ||
| 99 | __le32 connect_seq; /* count connections initiated in this session */ | ||
| 100 | __le32 protocol_version; | ||
| 101 | __le32 authorizer_protocol; | ||
| 102 | __le32 authorizer_len; | ||
| 103 | __u8 flags; /* CEPH_MSG_CONNECT_* */ | ||
| 104 | } __attribute__ ((packed)); | ||
| 105 | |||
| 106 | struct ceph_msg_connect_reply { | ||
| 107 | __u8 tag; | ||
| 108 | __le64 features; /* feature bits for this session */ | ||
| 109 | __le32 global_seq; | ||
| 110 | __le32 connect_seq; | ||
| 111 | __le32 protocol_version; | ||
| 112 | __le32 authorizer_len; | ||
| 113 | __u8 flags; | ||
| 114 | } __attribute__ ((packed)); | ||
| 115 | |||
| 116 | #define CEPH_MSG_CONNECT_LOSSY 1 /* messages i send may be safely dropped */ | ||
| 117 | |||
| 118 | |||
| 119 | /* | ||
| 120 | * message header | ||
| 121 | */ | ||
| 122 | struct ceph_msg_header_old { | ||
| 123 | __le64 seq; /* message seq# for this session */ | ||
| 124 | __le64 tid; /* transaction id */ | ||
| 125 | __le16 type; /* message type */ | ||
| 126 | __le16 priority; /* priority. higher value == higher priority */ | ||
| 127 | __le16 version; /* version of message encoding */ | ||
| 128 | |||
| 129 | __le32 front_len; /* bytes in main payload */ | ||
| 130 | __le32 middle_len;/* bytes in middle payload */ | ||
| 131 | __le32 data_len; /* bytes of data payload */ | ||
| 132 | __le16 data_off; /* sender: include full offset; | ||
| 133 | receiver: mask against ~PAGE_MASK */ | ||
| 134 | |||
| 135 | struct ceph_entity_inst src, orig_src; | ||
| 136 | __le32 reserved; | ||
| 137 | __le32 crc; /* header crc32c */ | ||
| 138 | } __attribute__ ((packed)); | ||
| 139 | |||
| 140 | struct ceph_msg_header { | ||
| 141 | __le64 seq; /* message seq# for this session */ | ||
| 142 | __le64 tid; /* transaction id */ | ||
| 143 | __le16 type; /* message type */ | ||
| 144 | __le16 priority; /* priority. higher value == higher priority */ | ||
| 145 | __le16 version; /* version of message encoding */ | ||
| 146 | |||
| 147 | __le32 front_len; /* bytes in main payload */ | ||
| 148 | __le32 middle_len;/* bytes in middle payload */ | ||
| 149 | __le32 data_len; /* bytes of data payload */ | ||
| 150 | __le16 data_off; /* sender: include full offset; | ||
| 151 | receiver: mask against ~PAGE_MASK */ | ||
| 152 | |||
| 153 | struct ceph_entity_name src; | ||
| 154 | __le32 reserved; | ||
| 155 | __le32 crc; /* header crc32c */ | ||
| 156 | } __attribute__ ((packed)); | ||
| 157 | |||
| 158 | #define CEPH_MSG_PRIO_LOW 64 | ||
| 159 | #define CEPH_MSG_PRIO_DEFAULT 127 | ||
| 160 | #define CEPH_MSG_PRIO_HIGH 196 | ||
| 161 | #define CEPH_MSG_PRIO_HIGHEST 255 | ||
| 162 | |||
| 163 | /* | ||
| 164 | * follows data payload | ||
| 165 | */ | ||
| 166 | struct ceph_msg_footer { | ||
| 167 | __le32 front_crc, middle_crc, data_crc; | ||
| 168 | __u8 flags; | ||
| 169 | } __attribute__ ((packed)); | ||
| 170 | |||
| 171 | #define CEPH_MSG_FOOTER_COMPLETE (1<<0) /* msg wasn't aborted */ | ||
| 172 | #define CEPH_MSG_FOOTER_NOCRC (1<<1) /* no data crc */ | ||
| 173 | |||
| 174 | |||
| 175 | #endif | ||
diff --git a/include/linux/ceph/osd_client.h b/include/linux/ceph/osd_client.h new file mode 100644 index 000000000000..6c91fb032c39 --- /dev/null +++ b/include/linux/ceph/osd_client.h | |||
| @@ -0,0 +1,234 @@ | |||
| 1 | #ifndef _FS_CEPH_OSD_CLIENT_H | ||
| 2 | #define _FS_CEPH_OSD_CLIENT_H | ||
| 3 | |||
| 4 | #include <linux/completion.h> | ||
| 5 | #include <linux/kref.h> | ||
| 6 | #include <linux/mempool.h> | ||
| 7 | #include <linux/rbtree.h> | ||
| 8 | |||
| 9 | #include "types.h" | ||
| 10 | #include "osdmap.h" | ||
| 11 | #include "messenger.h" | ||
| 12 | |||
| 13 | struct ceph_msg; | ||
| 14 | struct ceph_snap_context; | ||
| 15 | struct ceph_osd_request; | ||
| 16 | struct ceph_osd_client; | ||
| 17 | struct ceph_authorizer; | ||
| 18 | struct ceph_pagelist; | ||
| 19 | |||
| 20 | /* | ||
| 21 | * completion callback for async writepages | ||
| 22 | */ | ||
| 23 | typedef void (*ceph_osdc_callback_t)(struct ceph_osd_request *, | ||
| 24 | struct ceph_msg *); | ||
| 25 | |||
| 26 | /* a given osd we're communicating with */ | ||
| 27 | struct ceph_osd { | ||
| 28 | atomic_t o_ref; | ||
| 29 | struct ceph_osd_client *o_osdc; | ||
| 30 | int o_osd; | ||
| 31 | int o_incarnation; | ||
| 32 | struct rb_node o_node; | ||
| 33 | struct ceph_connection o_con; | ||
| 34 | struct list_head o_requests; | ||
| 35 | struct list_head o_osd_lru; | ||
| 36 | struct ceph_authorizer *o_authorizer; | ||
| 37 | void *o_authorizer_buf, *o_authorizer_reply_buf; | ||
| 38 | size_t o_authorizer_buf_len, o_authorizer_reply_buf_len; | ||
| 39 | unsigned long lru_ttl; | ||
| 40 | int o_marked_for_keepalive; | ||
| 41 | struct list_head o_keepalive_item; | ||
| 42 | }; | ||
| 43 | |||
| 44 | /* an in-flight request */ | ||
| 45 | struct ceph_osd_request { | ||
| 46 | u64 r_tid; /* unique for this client */ | ||
| 47 | struct rb_node r_node; | ||
| 48 | struct list_head r_req_lru_item; | ||
| 49 | struct list_head r_osd_item; | ||
| 50 | struct ceph_osd *r_osd; | ||
| 51 | struct ceph_pg r_pgid; | ||
| 52 | int r_pg_osds[CEPH_PG_MAX_SIZE]; | ||
| 53 | int r_num_pg_osds; | ||
| 54 | |||
| 55 | struct ceph_connection *r_con_filling_msg; | ||
| 56 | |||
| 57 | struct ceph_msg *r_request, *r_reply; | ||
| 58 | int r_result; | ||
| 59 | int r_flags; /* any additional flags for the osd */ | ||
| 60 | u32 r_sent; /* >0 if r_request is sending/sent */ | ||
| 61 | int r_got_reply; | ||
| 62 | |||
| 63 | struct ceph_osd_client *r_osdc; | ||
| 64 | struct kref r_kref; | ||
| 65 | bool r_mempool; | ||
| 66 | struct completion r_completion, r_safe_completion; | ||
| 67 | ceph_osdc_callback_t r_callback, r_safe_callback; | ||
| 68 | struct ceph_eversion r_reassert_version; | ||
| 69 | struct list_head r_unsafe_item; | ||
| 70 | |||
| 71 | struct inode *r_inode; /* for use by callbacks */ | ||
| 72 | void *r_priv; /* ditto */ | ||
| 73 | |||
| 74 | char r_oid[40]; /* object name */ | ||
| 75 | int r_oid_len; | ||
| 76 | unsigned long r_stamp; /* send OR check time */ | ||
| 77 | bool r_resend; /* msg send failed, needs retry */ | ||
| 78 | |||
| 79 | struct ceph_file_layout r_file_layout; | ||
| 80 | struct ceph_snap_context *r_snapc; /* snap context for writes */ | ||
| 81 | unsigned r_num_pages; /* size of page array (follows) */ | ||
| 82 | struct page **r_pages; /* pages for data payload */ | ||
| 83 | int r_pages_from_pool; | ||
| 84 | int r_own_pages; /* if true, i own page list */ | ||
| 85 | #ifdef CONFIG_BLOCK | ||
| 86 | struct bio *r_bio; /* instead of pages */ | ||
| 87 | #endif | ||
| 88 | |||
| 89 | struct ceph_pagelist *r_trail; /* trailing part of the data */ | ||
| 90 | }; | ||
| 91 | |||
| 92 | struct ceph_osd_client { | ||
| 93 | struct ceph_client *client; | ||
| 94 | |||
| 95 | struct ceph_osdmap *osdmap; /* current map */ | ||
| 96 | struct rw_semaphore map_sem; | ||
| 97 | struct completion map_waiters; | ||
| 98 | u64 last_requested_map; | ||
| 99 | |||
| 100 | struct mutex request_mutex; | ||
| 101 | struct rb_root osds; /* osds */ | ||
| 102 | struct list_head osd_lru; /* idle osds */ | ||
| 103 | u64 timeout_tid; /* tid of timeout triggering rq */ | ||
| 104 | u64 last_tid; /* tid of last request */ | ||
| 105 | struct rb_root requests; /* pending requests */ | ||
| 106 | struct list_head req_lru; /* pending requests lru */ | ||
| 107 | int num_requests; | ||
| 108 | struct delayed_work timeout_work; | ||
| 109 | struct delayed_work osds_timeout_work; | ||
| 110 | #ifdef CONFIG_DEBUG_FS | ||
| 111 | struct dentry *debugfs_file; | ||
| 112 | #endif | ||
| 113 | |||
| 114 | mempool_t *req_mempool; | ||
| 115 | |||
| 116 | struct ceph_msgpool msgpool_op; | ||
| 117 | struct ceph_msgpool msgpool_op_reply; | ||
| 118 | }; | ||
| 119 | |||
| 120 | struct ceph_osd_req_op { | ||
| 121 | u16 op; /* CEPH_OSD_OP_* */ | ||
| 122 | u32 flags; /* CEPH_OSD_FLAG_* */ | ||
| 123 | union { | ||
| 124 | struct { | ||
| 125 | u64 offset, length; | ||
| 126 | u64 truncate_size; | ||
| 127 | u32 truncate_seq; | ||
| 128 | } extent; | ||
| 129 | struct { | ||
| 130 | const char *name; | ||
| 131 | u32 name_len; | ||
| 132 | const char *val; | ||
| 133 | u32 value_len; | ||
| 134 | __u8 cmp_op; /* CEPH_OSD_CMPXATTR_OP_* */ | ||
| 135 | __u8 cmp_mode; /* CEPH_OSD_CMPXATTR_MODE_* */ | ||
| 136 | } xattr; | ||
| 137 | struct { | ||
| 138 | const char *class_name; | ||
| 139 | __u8 class_len; | ||
| 140 | const char *method_name; | ||
| 141 | __u8 method_len; | ||
| 142 | __u8 argc; | ||
| 143 | const char *indata; | ||
| 144 | u32 indata_len; | ||
| 145 | } cls; | ||
| 146 | struct { | ||
| 147 | u64 cookie, count; | ||
| 148 | } pgls; | ||
| 149 | struct { | ||
| 150 | u64 snapid; | ||
| 151 | } snap; | ||
| 152 | }; | ||
| 153 | u32 payload_len; | ||
| 154 | }; | ||
| 155 | |||
| 156 | extern int ceph_osdc_init(struct ceph_osd_client *osdc, | ||
| 157 | struct ceph_client *client); | ||
| 158 | extern void ceph_osdc_stop(struct ceph_osd_client *osdc); | ||
| 159 | |||
| 160 | extern void ceph_osdc_handle_reply(struct ceph_osd_client *osdc, | ||
| 161 | struct ceph_msg *msg); | ||
| 162 | extern void ceph_osdc_handle_map(struct ceph_osd_client *osdc, | ||
| 163 | struct ceph_msg *msg); | ||
| 164 | |||
| 165 | extern void ceph_calc_raw_layout(struct ceph_osd_client *osdc, | ||
| 166 | struct ceph_file_layout *layout, | ||
| 167 | u64 snapid, | ||
| 168 | u64 off, u64 *plen, u64 *bno, | ||
| 169 | struct ceph_osd_request *req, | ||
| 170 | struct ceph_osd_req_op *op); | ||
| 171 | |||
| 172 | extern struct ceph_osd_request *ceph_osdc_alloc_request(struct ceph_osd_client *osdc, | ||
| 173 | int flags, | ||
| 174 | struct ceph_snap_context *snapc, | ||
| 175 | struct ceph_osd_req_op *ops, | ||
| 176 | bool use_mempool, | ||
| 177 | gfp_t gfp_flags, | ||
| 178 | struct page **pages, | ||
| 179 | struct bio *bio); | ||
| 180 | |||
| 181 | extern void ceph_osdc_build_request(struct ceph_osd_request *req, | ||
| 182 | u64 off, u64 *plen, | ||
| 183 | struct ceph_osd_req_op *src_ops, | ||
| 184 | struct ceph_snap_context *snapc, | ||
| 185 | struct timespec *mtime, | ||
| 186 | const char *oid, | ||
| 187 | int oid_len); | ||
| 188 | |||
| 189 | extern struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *, | ||
| 190 | struct ceph_file_layout *layout, | ||
| 191 | struct ceph_vino vino, | ||
| 192 | u64 offset, u64 *len, int op, int flags, | ||
| 193 | struct ceph_snap_context *snapc, | ||
| 194 | int do_sync, u32 truncate_seq, | ||
| 195 | u64 truncate_size, | ||
| 196 | struct timespec *mtime, | ||
| 197 | bool use_mempool, int num_reply); | ||
| 198 | |||
| 199 | static inline void ceph_osdc_get_request(struct ceph_osd_request *req) | ||
| 200 | { | ||
| 201 | kref_get(&req->r_kref); | ||
| 202 | } | ||
| 203 | extern void ceph_osdc_release_request(struct kref *kref); | ||
| 204 | static inline void ceph_osdc_put_request(struct ceph_osd_request *req) | ||
| 205 | { | ||
| 206 | kref_put(&req->r_kref, ceph_osdc_release_request); | ||
| 207 | } | ||
| 208 | |||
| 209 | extern int ceph_osdc_start_request(struct ceph_osd_client *osdc, | ||
| 210 | struct ceph_osd_request *req, | ||
| 211 | bool nofail); | ||
| 212 | extern int ceph_osdc_wait_request(struct ceph_osd_client *osdc, | ||
| 213 | struct ceph_osd_request *req); | ||
| 214 | extern void ceph_osdc_sync(struct ceph_osd_client *osdc); | ||
| 215 | |||
| 216 | extern int ceph_osdc_readpages(struct ceph_osd_client *osdc, | ||
| 217 | struct ceph_vino vino, | ||
| 218 | struct ceph_file_layout *layout, | ||
| 219 | u64 off, u64 *plen, | ||
| 220 | u32 truncate_seq, u64 truncate_size, | ||
| 221 | struct page **pages, int nr_pages); | ||
| 222 | |||
| 223 | extern int ceph_osdc_writepages(struct ceph_osd_client *osdc, | ||
| 224 | struct ceph_vino vino, | ||
| 225 | struct ceph_file_layout *layout, | ||
| 226 | struct ceph_snap_context *sc, | ||
| 227 | u64 off, u64 len, | ||
| 228 | u32 truncate_seq, u64 truncate_size, | ||
| 229 | struct timespec *mtime, | ||
| 230 | struct page **pages, int nr_pages, | ||
| 231 | int flags, int do_sync, bool nofail); | ||
| 232 | |||
| 233 | #endif | ||
| 234 | |||
diff --git a/include/linux/ceph/osdmap.h b/include/linux/ceph/osdmap.h new file mode 100644 index 000000000000..ba4c205cbb01 --- /dev/null +++ b/include/linux/ceph/osdmap.h | |||
| @@ -0,0 +1,130 @@ | |||
| 1 | #ifndef _FS_CEPH_OSDMAP_H | ||
| 2 | #define _FS_CEPH_OSDMAP_H | ||
| 3 | |||
| 4 | #include <linux/rbtree.h> | ||
| 5 | #include "types.h" | ||
| 6 | #include "ceph_fs.h" | ||
| 7 | #include <linux/crush/crush.h> | ||
| 8 | |||
| 9 | /* | ||
| 10 | * The osd map describes the current membership of the osd cluster and | ||
| 11 | * specifies the mapping of objects to placement groups and placement | ||
| 12 | * groups to (sets of) osds. That is, it completely specifies the | ||
| 13 | * (desired) distribution of all data objects in the system at some | ||
| 14 | * point in time. | ||
| 15 | * | ||
| 16 | * Each map version is identified by an epoch, which increases monotonically. | ||
| 17 | * | ||
| 18 | * The map can be updated either via an incremental map (diff) describing | ||
| 19 | * the change between two successive epochs, or as a fully encoded map. | ||
| 20 | */ | ||
| 21 | struct ceph_pg_pool_info { | ||
| 22 | struct rb_node node; | ||
| 23 | int id; | ||
| 24 | struct ceph_pg_pool v; | ||
| 25 | int pg_num_mask, pgp_num_mask, lpg_num_mask, lpgp_num_mask; | ||
| 26 | char *name; | ||
| 27 | }; | ||
| 28 | |||
| 29 | struct ceph_pg_mapping { | ||
| 30 | struct rb_node node; | ||
| 31 | struct ceph_pg pgid; | ||
| 32 | int len; | ||
| 33 | int osds[]; | ||
| 34 | }; | ||
| 35 | |||
| 36 | struct ceph_osdmap { | ||
| 37 | struct ceph_fsid fsid; | ||
| 38 | u32 epoch; | ||
| 39 | u32 mkfs_epoch; | ||
| 40 | struct ceph_timespec created, modified; | ||
| 41 | |||
| 42 | u32 flags; /* CEPH_OSDMAP_* */ | ||
| 43 | |||
| 44 | u32 max_osd; /* size of osd_state, _offload, _addr arrays */ | ||
| 45 | u8 *osd_state; /* CEPH_OSD_* */ | ||
| 46 | u32 *osd_weight; /* 0 = failed, 0x10000 = 100% normal */ | ||
| 47 | struct ceph_entity_addr *osd_addr; | ||
| 48 | |||
| 49 | struct rb_root pg_temp; | ||
| 50 | struct rb_root pg_pools; | ||
| 51 | u32 pool_max; | ||
| 52 | |||
| 53 | /* the CRUSH map specifies the mapping of placement groups to | ||
| 54 | * the list of osds that store+replicate them. */ | ||
| 55 | struct crush_map *crush; | ||
| 56 | }; | ||
| 57 | |||
| 58 | /* | ||
| 59 | * file layout helpers | ||
| 60 | */ | ||
| 61 | #define ceph_file_layout_su(l) ((__s32)le32_to_cpu((l).fl_stripe_unit)) | ||
| 62 | #define ceph_file_layout_stripe_count(l) \ | ||
| 63 | ((__s32)le32_to_cpu((l).fl_stripe_count)) | ||
| 64 | #define ceph_file_layout_object_size(l) ((__s32)le32_to_cpu((l).fl_object_size)) | ||
| 65 | #define ceph_file_layout_cas_hash(l) ((__s32)le32_to_cpu((l).fl_cas_hash)) | ||
| 66 | #define ceph_file_layout_object_su(l) \ | ||
| 67 | ((__s32)le32_to_cpu((l).fl_object_stripe_unit)) | ||
| 68 | #define ceph_file_layout_pg_preferred(l) \ | ||
| 69 | ((__s32)le32_to_cpu((l).fl_pg_preferred)) | ||
| 70 | #define ceph_file_layout_pg_pool(l) \ | ||
| 71 | ((__s32)le32_to_cpu((l).fl_pg_pool)) | ||
| 72 | |||
| 73 | static inline unsigned ceph_file_layout_stripe_width(struct ceph_file_layout *l) | ||
| 74 | { | ||
| 75 | return le32_to_cpu(l->fl_stripe_unit) * | ||
| 76 | le32_to_cpu(l->fl_stripe_count); | ||
| 77 | } | ||
| 78 | |||
| 79 | /* "period" == bytes before i start on a new set of objects */ | ||
| 80 | static inline unsigned ceph_file_layout_period(struct ceph_file_layout *l) | ||
| 81 | { | ||
| 82 | return le32_to_cpu(l->fl_object_size) * | ||
| 83 | le32_to_cpu(l->fl_stripe_count); | ||
| 84 | } | ||
| 85 | |||
| 86 | |||
| 87 | static inline int ceph_osd_is_up(struct ceph_osdmap *map, int osd) | ||
| 88 | { | ||
| 89 | return (osd < map->max_osd) && (map->osd_state[osd] & CEPH_OSD_UP); | ||
| 90 | } | ||
| 91 | |||
| 92 | static inline bool ceph_osdmap_flag(struct ceph_osdmap *map, int flag) | ||
| 93 | { | ||
| 94 | return map && (map->flags & flag); | ||
| 95 | } | ||
| 96 | |||
| 97 | extern char *ceph_osdmap_state_str(char *str, int len, int state); | ||
| 98 | |||
| 99 | static inline struct ceph_entity_addr *ceph_osd_addr(struct ceph_osdmap *map, | ||
| 100 | int osd) | ||
| 101 | { | ||
| 102 | if (osd >= map->max_osd) | ||
| 103 | return NULL; | ||
| 104 | return &map->osd_addr[osd]; | ||
| 105 | } | ||
| 106 | |||
| 107 | extern struct ceph_osdmap *osdmap_decode(void **p, void *end); | ||
| 108 | extern struct ceph_osdmap *osdmap_apply_incremental(void **p, void *end, | ||
| 109 | struct ceph_osdmap *map, | ||
| 110 | struct ceph_messenger *msgr); | ||
| 111 | extern void ceph_osdmap_destroy(struct ceph_osdmap *map); | ||
| 112 | |||
| 113 | /* calculate mapping of a file extent to an object */ | ||
| 114 | extern void ceph_calc_file_object_mapping(struct ceph_file_layout *layout, | ||
| 115 | u64 off, u64 *plen, | ||
| 116 | u64 *bno, u64 *oxoff, u64 *oxlen); | ||
| 117 | |||
| 118 | /* calculate mapping of object to a placement group */ | ||
| 119 | extern int ceph_calc_object_layout(struct ceph_object_layout *ol, | ||
| 120 | const char *oid, | ||
| 121 | struct ceph_file_layout *fl, | ||
| 122 | struct ceph_osdmap *osdmap); | ||
| 123 | extern int ceph_calc_pg_acting(struct ceph_osdmap *osdmap, struct ceph_pg pgid, | ||
| 124 | int *acting); | ||
| 125 | extern int ceph_calc_pg_primary(struct ceph_osdmap *osdmap, | ||
| 126 | struct ceph_pg pgid); | ||
| 127 | |||
| 128 | extern int ceph_pg_poolid_by_name(struct ceph_osdmap *map, const char *name); | ||
| 129 | |||
| 130 | #endif | ||
diff --git a/include/linux/ceph/pagelist.h b/include/linux/ceph/pagelist.h new file mode 100644 index 000000000000..9660d6b0a35d --- /dev/null +++ b/include/linux/ceph/pagelist.h | |||
| @@ -0,0 +1,75 @@ | |||
| 1 | #ifndef __FS_CEPH_PAGELIST_H | ||
| 2 | #define __FS_CEPH_PAGELIST_H | ||
| 3 | |||
| 4 | #include <linux/list.h> | ||
| 5 | |||
| 6 | struct ceph_pagelist { | ||
| 7 | struct list_head head; | ||
| 8 | void *mapped_tail; | ||
| 9 | size_t length; | ||
| 10 | size_t room; | ||
| 11 | struct list_head free_list; | ||
| 12 | size_t num_pages_free; | ||
| 13 | }; | ||
| 14 | |||
| 15 | struct ceph_pagelist_cursor { | ||
| 16 | struct ceph_pagelist *pl; /* pagelist, for error checking */ | ||
| 17 | struct list_head *page_lru; /* page in list */ | ||
| 18 | size_t room; /* room remaining to reset to */ | ||
| 19 | }; | ||
| 20 | |||
| 21 | static inline void ceph_pagelist_init(struct ceph_pagelist *pl) | ||
| 22 | { | ||
| 23 | INIT_LIST_HEAD(&pl->head); | ||
| 24 | pl->mapped_tail = NULL; | ||
| 25 | pl->length = 0; | ||
| 26 | pl->room = 0; | ||
| 27 | INIT_LIST_HEAD(&pl->free_list); | ||
| 28 | pl->num_pages_free = 0; | ||
| 29 | } | ||
| 30 | |||
| 31 | extern int ceph_pagelist_release(struct ceph_pagelist *pl); | ||
| 32 | |||
| 33 | extern int ceph_pagelist_append(struct ceph_pagelist *pl, const void *d, size_t l); | ||
| 34 | |||
| 35 | extern int ceph_pagelist_reserve(struct ceph_pagelist *pl, size_t space); | ||
| 36 | |||
| 37 | extern int ceph_pagelist_free_reserve(struct ceph_pagelist *pl); | ||
| 38 | |||
| 39 | extern void ceph_pagelist_set_cursor(struct ceph_pagelist *pl, | ||
| 40 | struct ceph_pagelist_cursor *c); | ||
| 41 | |||
| 42 | extern int ceph_pagelist_truncate(struct ceph_pagelist *pl, | ||
| 43 | struct ceph_pagelist_cursor *c); | ||
| 44 | |||
| 45 | static inline int ceph_pagelist_encode_64(struct ceph_pagelist *pl, u64 v) | ||
| 46 | { | ||
| 47 | __le64 ev = cpu_to_le64(v); | ||
| 48 | return ceph_pagelist_append(pl, &ev, sizeof(ev)); | ||
| 49 | } | ||
| 50 | static inline int ceph_pagelist_encode_32(struct ceph_pagelist *pl, u32 v) | ||
| 51 | { | ||
| 52 | __le32 ev = cpu_to_le32(v); | ||
| 53 | return ceph_pagelist_append(pl, &ev, sizeof(ev)); | ||
| 54 | } | ||
| 55 | static inline int ceph_pagelist_encode_16(struct ceph_pagelist *pl, u16 v) | ||
| 56 | { | ||
| 57 | __le16 ev = cpu_to_le16(v); | ||
| 58 | return ceph_pagelist_append(pl, &ev, sizeof(ev)); | ||
| 59 | } | ||
| 60 | static inline int ceph_pagelist_encode_8(struct ceph_pagelist *pl, u8 v) | ||
| 61 | { | ||
| 62 | return ceph_pagelist_append(pl, &v, 1); | ||
| 63 | } | ||
| 64 | static inline int ceph_pagelist_encode_string(struct ceph_pagelist *pl, | ||
| 65 | char *s, size_t len) | ||
| 66 | { | ||
| 67 | int ret = ceph_pagelist_encode_32(pl, len); | ||
| 68 | if (ret) | ||
| 69 | return ret; | ||
| 70 | if (len) | ||
| 71 | return ceph_pagelist_append(pl, s, len); | ||
| 72 | return 0; | ||
| 73 | } | ||
| 74 | |||
| 75 | #endif | ||
diff --git a/include/linux/ceph/rados.h b/include/linux/ceph/rados.h new file mode 100644 index 000000000000..6d5247f2e81b --- /dev/null +++ b/include/linux/ceph/rados.h | |||
| @@ -0,0 +1,405 @@ | |||
| 1 | #ifndef CEPH_RADOS_H | ||
| 2 | #define CEPH_RADOS_H | ||
| 3 | |||
| 4 | /* | ||
| 5 | * Data types for the Ceph distributed object storage layer RADOS | ||
| 6 | * (Reliable Autonomic Distributed Object Store). | ||
| 7 | */ | ||
| 8 | |||
| 9 | #include "msgr.h" | ||
| 10 | |||
| 11 | /* | ||
| 12 | * osdmap encoding versions | ||
| 13 | */ | ||
| 14 | #define CEPH_OSDMAP_INC_VERSION 5 | ||
| 15 | #define CEPH_OSDMAP_INC_VERSION_EXT 5 | ||
| 16 | #define CEPH_OSDMAP_VERSION 5 | ||
| 17 | #define CEPH_OSDMAP_VERSION_EXT 5 | ||
| 18 | |||
| 19 | /* | ||
| 20 | * fs id | ||
| 21 | */ | ||
| 22 | struct ceph_fsid { | ||
| 23 | unsigned char fsid[16]; | ||
| 24 | }; | ||
| 25 | |||
| 26 | static inline int ceph_fsid_compare(const struct ceph_fsid *a, | ||
| 27 | const struct ceph_fsid *b) | ||
| 28 | { | ||
| 29 | return memcmp(a, b, sizeof(*a)); | ||
| 30 | } | ||
| 31 | |||
| 32 | /* | ||
| 33 | * ino, object, etc. | ||
| 34 | */ | ||
| 35 | typedef __le64 ceph_snapid_t; | ||
| 36 | #define CEPH_SNAPDIR ((__u64)(-1)) /* reserved for hidden .snap dir */ | ||
| 37 | #define CEPH_NOSNAP ((__u64)(-2)) /* "head", "live" revision */ | ||
| 38 | #define CEPH_MAXSNAP ((__u64)(-3)) /* largest valid snapid */ | ||
| 39 | |||
| 40 | struct ceph_timespec { | ||
| 41 | __le32 tv_sec; | ||
| 42 | __le32 tv_nsec; | ||
| 43 | } __attribute__ ((packed)); | ||
| 44 | |||
| 45 | |||
| 46 | /* | ||
| 47 | * object layout - how objects are mapped into PGs | ||
| 48 | */ | ||
| 49 | #define CEPH_OBJECT_LAYOUT_HASH 1 | ||
| 50 | #define CEPH_OBJECT_LAYOUT_LINEAR 2 | ||
| 51 | #define CEPH_OBJECT_LAYOUT_HASHINO 3 | ||
| 52 | |||
| 53 | /* | ||
| 54 | * pg layout -- how PGs are mapped onto (sets of) OSDs | ||
| 55 | */ | ||
| 56 | #define CEPH_PG_LAYOUT_CRUSH 0 | ||
| 57 | #define CEPH_PG_LAYOUT_HASH 1 | ||
| 58 | #define CEPH_PG_LAYOUT_LINEAR 2 | ||
| 59 | #define CEPH_PG_LAYOUT_HYBRID 3 | ||
| 60 | |||
| 61 | #define CEPH_PG_MAX_SIZE 16 /* max # osds in a single pg */ | ||
| 62 | |||
| 63 | /* | ||
| 64 | * placement group. | ||
| 65 | * we encode this into one __le64. | ||
| 66 | */ | ||
| 67 | struct ceph_pg { | ||
| 68 | __le16 preferred; /* preferred primary osd */ | ||
| 69 | __le16 ps; /* placement seed */ | ||
| 70 | __le32 pool; /* object pool */ | ||
| 71 | } __attribute__ ((packed)); | ||
| 72 | |||
| 73 | /* | ||
| 74 | * pg_pool is a set of pgs storing a pool of objects | ||
| 75 | * | ||
| 76 | * pg_num -- base number of pseudorandomly placed pgs | ||
| 77 | * | ||
| 78 | * pgp_num -- effective number when calculating pg placement. this | ||
| 79 | * is used for pg_num increases. new pgs result in data being "split" | ||
| 80 | * into new pgs. for this to proceed smoothly, new pgs are intiially | ||
| 81 | * colocated with their parents; that is, pgp_num doesn't increase | ||
| 82 | * until the new pgs have successfully split. only _then_ are the new | ||
| 83 | * pgs placed independently. | ||
| 84 | * | ||
| 85 | * lpg_num -- localized pg count (per device). replicas are randomly | ||
| 86 | * selected. | ||
| 87 | * | ||
| 88 | * lpgp_num -- as above. | ||
| 89 | */ | ||
| 90 | #define CEPH_PG_TYPE_REP 1 | ||
| 91 | #define CEPH_PG_TYPE_RAID4 2 | ||
| 92 | #define CEPH_PG_POOL_VERSION 2 | ||
| 93 | struct ceph_pg_pool { | ||
| 94 | __u8 type; /* CEPH_PG_TYPE_* */ | ||
| 95 | __u8 size; /* number of osds in each pg */ | ||
| 96 | __u8 crush_ruleset; /* crush placement rule */ | ||
| 97 | __u8 object_hash; /* hash mapping object name to ps */ | ||
| 98 | __le32 pg_num, pgp_num; /* number of pg's */ | ||
| 99 | __le32 lpg_num, lpgp_num; /* number of localized pg's */ | ||
| 100 | __le32 last_change; /* most recent epoch changed */ | ||
| 101 | __le64 snap_seq; /* seq for per-pool snapshot */ | ||
| 102 | __le32 snap_epoch; /* epoch of last snap */ | ||
| 103 | __le32 num_snaps; | ||
| 104 | __le32 num_removed_snap_intervals; /* if non-empty, NO per-pool snaps */ | ||
| 105 | __le64 auid; /* who owns the pg */ | ||
| 106 | } __attribute__ ((packed)); | ||
| 107 | |||
| 108 | /* | ||
| 109 | * stable_mod func is used to control number of placement groups. | ||
| 110 | * similar to straight-up modulo, but produces a stable mapping as b | ||
| 111 | * increases over time. b is the number of bins, and bmask is the | ||
| 112 | * containing power of 2 minus 1. | ||
| 113 | * | ||
| 114 | * b <= bmask and bmask=(2**n)-1 | ||
| 115 | * e.g., b=12 -> bmask=15, b=123 -> bmask=127 | ||
| 116 | */ | ||
| 117 | static inline int ceph_stable_mod(int x, int b, int bmask) | ||
| 118 | { | ||
| 119 | if ((x & bmask) < b) | ||
| 120 | return x & bmask; | ||
| 121 | else | ||
| 122 | return x & (bmask >> 1); | ||
| 123 | } | ||
| 124 | |||
| 125 | /* | ||
| 126 | * object layout - how a given object should be stored. | ||
| 127 | */ | ||
| 128 | struct ceph_object_layout { | ||
| 129 | struct ceph_pg ol_pgid; /* raw pg, with _full_ ps precision. */ | ||
| 130 | __le32 ol_stripe_unit; /* for per-object parity, if any */ | ||
| 131 | } __attribute__ ((packed)); | ||
| 132 | |||
| 133 | /* | ||
| 134 | * compound epoch+version, used by storage layer to serialize mutations | ||
| 135 | */ | ||
| 136 | struct ceph_eversion { | ||
| 137 | __le32 epoch; | ||
| 138 | __le64 version; | ||
| 139 | } __attribute__ ((packed)); | ||
| 140 | |||
| 141 | /* | ||
| 142 | * osd map bits | ||
| 143 | */ | ||
| 144 | |||
| 145 | /* status bits */ | ||
| 146 | #define CEPH_OSD_EXISTS 1 | ||
| 147 | #define CEPH_OSD_UP 2 | ||
| 148 | |||
| 149 | /* osd weights. fixed point value: 0x10000 == 1.0 ("in"), 0 == "out" */ | ||
| 150 | #define CEPH_OSD_IN 0x10000 | ||
| 151 | #define CEPH_OSD_OUT 0 | ||
| 152 | |||
| 153 | |||
| 154 | /* | ||
| 155 | * osd map flag bits | ||
| 156 | */ | ||
| 157 | #define CEPH_OSDMAP_NEARFULL (1<<0) /* sync writes (near ENOSPC) */ | ||
| 158 | #define CEPH_OSDMAP_FULL (1<<1) /* no data writes (ENOSPC) */ | ||
| 159 | #define CEPH_OSDMAP_PAUSERD (1<<2) /* pause all reads */ | ||
| 160 | #define CEPH_OSDMAP_PAUSEWR (1<<3) /* pause all writes */ | ||
| 161 | #define CEPH_OSDMAP_PAUSEREC (1<<4) /* pause recovery */ | ||
| 162 | |||
| 163 | /* | ||
| 164 | * osd ops | ||
| 165 | */ | ||
| 166 | #define CEPH_OSD_OP_MODE 0xf000 | ||
| 167 | #define CEPH_OSD_OP_MODE_RD 0x1000 | ||
| 168 | #define CEPH_OSD_OP_MODE_WR 0x2000 | ||
| 169 | #define CEPH_OSD_OP_MODE_RMW 0x3000 | ||
| 170 | #define CEPH_OSD_OP_MODE_SUB 0x4000 | ||
| 171 | |||
| 172 | #define CEPH_OSD_OP_TYPE 0x0f00 | ||
| 173 | #define CEPH_OSD_OP_TYPE_LOCK 0x0100 | ||
| 174 | #define CEPH_OSD_OP_TYPE_DATA 0x0200 | ||
| 175 | #define CEPH_OSD_OP_TYPE_ATTR 0x0300 | ||
| 176 | #define CEPH_OSD_OP_TYPE_EXEC 0x0400 | ||
| 177 | #define CEPH_OSD_OP_TYPE_PG 0x0500 | ||
| 178 | |||
| 179 | enum { | ||
| 180 | /** data **/ | ||
| 181 | /* read */ | ||
| 182 | CEPH_OSD_OP_READ = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 1, | ||
| 183 | CEPH_OSD_OP_STAT = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 2, | ||
| 184 | |||
| 185 | /* fancy read */ | ||
| 186 | CEPH_OSD_OP_MASKTRUNC = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 4, | ||
| 187 | |||
| 188 | /* write */ | ||
| 189 | CEPH_OSD_OP_WRITE = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 1, | ||
| 190 | CEPH_OSD_OP_WRITEFULL = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 2, | ||
| 191 | CEPH_OSD_OP_TRUNCATE = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 3, | ||
| 192 | CEPH_OSD_OP_ZERO = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 4, | ||
| 193 | CEPH_OSD_OP_DELETE = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 5, | ||
| 194 | |||
| 195 | /* fancy write */ | ||
| 196 | CEPH_OSD_OP_APPEND = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 6, | ||
| 197 | CEPH_OSD_OP_STARTSYNC = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 7, | ||
| 198 | CEPH_OSD_OP_SETTRUNC = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 8, | ||
| 199 | CEPH_OSD_OP_TRIMTRUNC = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 9, | ||
| 200 | |||
| 201 | CEPH_OSD_OP_TMAPUP = CEPH_OSD_OP_MODE_RMW | CEPH_OSD_OP_TYPE_DATA | 10, | ||
| 202 | CEPH_OSD_OP_TMAPPUT = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 11, | ||
| 203 | CEPH_OSD_OP_TMAPGET = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 12, | ||
| 204 | |||
| 205 | CEPH_OSD_OP_CREATE = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 13, | ||
| 206 | CEPH_OSD_OP_ROLLBACK= CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 14, | ||
| 207 | |||
| 208 | /** attrs **/ | ||
| 209 | /* read */ | ||
| 210 | CEPH_OSD_OP_GETXATTR = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_ATTR | 1, | ||
| 211 | CEPH_OSD_OP_GETXATTRS = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_ATTR | 2, | ||
| 212 | CEPH_OSD_OP_CMPXATTR = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_ATTR | 3, | ||
| 213 | |||
| 214 | /* write */ | ||
| 215 | CEPH_OSD_OP_SETXATTR = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_ATTR | 1, | ||
| 216 | CEPH_OSD_OP_SETXATTRS = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_ATTR | 2, | ||
| 217 | CEPH_OSD_OP_RESETXATTRS = CEPH_OSD_OP_MODE_WR|CEPH_OSD_OP_TYPE_ATTR | 3, | ||
| 218 | CEPH_OSD_OP_RMXATTR = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_ATTR | 4, | ||
| 219 | |||
| 220 | /** subop **/ | ||
| 221 | CEPH_OSD_OP_PULL = CEPH_OSD_OP_MODE_SUB | 1, | ||
| 222 | CEPH_OSD_OP_PUSH = CEPH_OSD_OP_MODE_SUB | 2, | ||
| 223 | CEPH_OSD_OP_BALANCEREADS = CEPH_OSD_OP_MODE_SUB | 3, | ||
| 224 | CEPH_OSD_OP_UNBALANCEREADS = CEPH_OSD_OP_MODE_SUB | 4, | ||
| 225 | CEPH_OSD_OP_SCRUB = CEPH_OSD_OP_MODE_SUB | 5, | ||
| 226 | |||
| 227 | /** lock **/ | ||
| 228 | CEPH_OSD_OP_WRLOCK = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_LOCK | 1, | ||
| 229 | CEPH_OSD_OP_WRUNLOCK = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_LOCK | 2, | ||
| 230 | CEPH_OSD_OP_RDLOCK = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_LOCK | 3, | ||
| 231 | CEPH_OSD_OP_RDUNLOCK = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_LOCK | 4, | ||
| 232 | CEPH_OSD_OP_UPLOCK = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_LOCK | 5, | ||
| 233 | CEPH_OSD_OP_DNLOCK = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_LOCK | 6, | ||
| 234 | |||
| 235 | /** exec **/ | ||
| 236 | CEPH_OSD_OP_CALL = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_EXEC | 1, | ||
| 237 | |||
| 238 | /** pg **/ | ||
| 239 | CEPH_OSD_OP_PGLS = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_PG | 1, | ||
| 240 | }; | ||
| 241 | |||
| 242 | static inline int ceph_osd_op_type_lock(int op) | ||
| 243 | { | ||
| 244 | return (op & CEPH_OSD_OP_TYPE) == CEPH_OSD_OP_TYPE_LOCK; | ||
| 245 | } | ||
| 246 | static inline int ceph_osd_op_type_data(int op) | ||
| 247 | { | ||
| 248 | return (op & CEPH_OSD_OP_TYPE) == CEPH_OSD_OP_TYPE_DATA; | ||
| 249 | } | ||
| 250 | static inline int ceph_osd_op_type_attr(int op) | ||
| 251 | { | ||
| 252 | return (op & CEPH_OSD_OP_TYPE) == CEPH_OSD_OP_TYPE_ATTR; | ||
| 253 | } | ||
| 254 | static inline int ceph_osd_op_type_exec(int op) | ||
| 255 | { | ||
| 256 | return (op & CEPH_OSD_OP_TYPE) == CEPH_OSD_OP_TYPE_EXEC; | ||
| 257 | } | ||
| 258 | static inline int ceph_osd_op_type_pg(int op) | ||
| 259 | { | ||
| 260 | return (op & CEPH_OSD_OP_TYPE) == CEPH_OSD_OP_TYPE_PG; | ||
| 261 | } | ||
| 262 | |||
| 263 | static inline int ceph_osd_op_mode_subop(int op) | ||
| 264 | { | ||
| 265 | return (op & CEPH_OSD_OP_MODE) == CEPH_OSD_OP_MODE_SUB; | ||
| 266 | } | ||
| 267 | static inline int ceph_osd_op_mode_read(int op) | ||
| 268 | { | ||
| 269 | return (op & CEPH_OSD_OP_MODE) == CEPH_OSD_OP_MODE_RD; | ||
| 270 | } | ||
| 271 | static inline int ceph_osd_op_mode_modify(int op) | ||
| 272 | { | ||
| 273 | return (op & CEPH_OSD_OP_MODE) == CEPH_OSD_OP_MODE_WR; | ||
| 274 | } | ||
| 275 | |||
| 276 | /* | ||
| 277 | * note that the following tmap stuff is also defined in the ceph librados.h | ||
| 278 | * any modification here needs to be updated there | ||
| 279 | */ | ||
| 280 | #define CEPH_OSD_TMAP_HDR 'h' | ||
| 281 | #define CEPH_OSD_TMAP_SET 's' | ||
| 282 | #define CEPH_OSD_TMAP_RM 'r' | ||
| 283 | |||
| 284 | extern const char *ceph_osd_op_name(int op); | ||
| 285 | |||
| 286 | |||
| 287 | /* | ||
| 288 | * osd op flags | ||
| 289 | * | ||
| 290 | * An op may be READ, WRITE, or READ|WRITE. | ||
| 291 | */ | ||
| 292 | enum { | ||
| 293 | CEPH_OSD_FLAG_ACK = 1, /* want (or is) "ack" ack */ | ||
| 294 | CEPH_OSD_FLAG_ONNVRAM = 2, /* want (or is) "onnvram" ack */ | ||
| 295 | CEPH_OSD_FLAG_ONDISK = 4, /* want (or is) "ondisk" ack */ | ||
| 296 | CEPH_OSD_FLAG_RETRY = 8, /* resend attempt */ | ||
| 297 | CEPH_OSD_FLAG_READ = 16, /* op may read */ | ||
| 298 | CEPH_OSD_FLAG_WRITE = 32, /* op may write */ | ||
| 299 | CEPH_OSD_FLAG_ORDERSNAP = 64, /* EOLDSNAP if snapc is out of order */ | ||
| 300 | CEPH_OSD_FLAG_PEERSTAT = 128, /* msg includes osd_peer_stat */ | ||
| 301 | CEPH_OSD_FLAG_BALANCE_READS = 256, | ||
| 302 | CEPH_OSD_FLAG_PARALLELEXEC = 512, /* execute op in parallel */ | ||
| 303 | CEPH_OSD_FLAG_PGOP = 1024, /* pg op, no object */ | ||
| 304 | CEPH_OSD_FLAG_EXEC = 2048, /* op may exec */ | ||
| 305 | CEPH_OSD_FLAG_EXEC_PUBLIC = 4096, /* op may exec (public) */ | ||
| 306 | }; | ||
| 307 | |||
| 308 | enum { | ||
| 309 | CEPH_OSD_OP_FLAG_EXCL = 1, /* EXCL object create */ | ||
| 310 | }; | ||
| 311 | |||
| 312 | #define EOLDSNAPC ERESTART /* ORDERSNAP flag set; writer has old snapc*/ | ||
| 313 | #define EBLACKLISTED ESHUTDOWN /* blacklisted */ | ||
| 314 | |||
| 315 | /* xattr comparison */ | ||
| 316 | enum { | ||
| 317 | CEPH_OSD_CMPXATTR_OP_NOP = 0, | ||
| 318 | CEPH_OSD_CMPXATTR_OP_EQ = 1, | ||
| 319 | CEPH_OSD_CMPXATTR_OP_NE = 2, | ||
| 320 | CEPH_OSD_CMPXATTR_OP_GT = 3, | ||
| 321 | CEPH_OSD_CMPXATTR_OP_GTE = 4, | ||
| 322 | CEPH_OSD_CMPXATTR_OP_LT = 5, | ||
| 323 | CEPH_OSD_CMPXATTR_OP_LTE = 6 | ||
| 324 | }; | ||
| 325 | |||
| 326 | enum { | ||
| 327 | CEPH_OSD_CMPXATTR_MODE_STRING = 1, | ||
| 328 | CEPH_OSD_CMPXATTR_MODE_U64 = 2 | ||
| 329 | }; | ||
| 330 | |||
| 331 | /* | ||
| 332 | * an individual object operation. each may be accompanied by some data | ||
| 333 | * payload | ||
| 334 | */ | ||
| 335 | struct ceph_osd_op { | ||
| 336 | __le16 op; /* CEPH_OSD_OP_* */ | ||
| 337 | __le32 flags; /* CEPH_OSD_FLAG_* */ | ||
| 338 | union { | ||
| 339 | struct { | ||
| 340 | __le64 offset, length; | ||
| 341 | __le64 truncate_size; | ||
| 342 | __le32 truncate_seq; | ||
| 343 | } __attribute__ ((packed)) extent; | ||
| 344 | struct { | ||
| 345 | __le32 name_len; | ||
| 346 | __le32 value_len; | ||
| 347 | __u8 cmp_op; /* CEPH_OSD_CMPXATTR_OP_* */ | ||
| 348 | __u8 cmp_mode; /* CEPH_OSD_CMPXATTR_MODE_* */ | ||
| 349 | } __attribute__ ((packed)) xattr; | ||
| 350 | struct { | ||
| 351 | __u8 class_len; | ||
| 352 | __u8 method_len; | ||
| 353 | __u8 argc; | ||
| 354 | __le32 indata_len; | ||
| 355 | } __attribute__ ((packed)) cls; | ||
| 356 | struct { | ||
| 357 | __le64 cookie, count; | ||
| 358 | } __attribute__ ((packed)) pgls; | ||
| 359 | struct { | ||
| 360 | __le64 snapid; | ||
| 361 | } __attribute__ ((packed)) snap; | ||
| 362 | }; | ||
| 363 | __le32 payload_len; | ||
| 364 | } __attribute__ ((packed)); | ||
| 365 | |||
| 366 | /* | ||
| 367 | * osd request message header. each request may include multiple | ||
| 368 | * ceph_osd_op object operations. | ||
| 369 | */ | ||
| 370 | struct ceph_osd_request_head { | ||
| 371 | __le32 client_inc; /* client incarnation */ | ||
| 372 | struct ceph_object_layout layout; /* pgid */ | ||
| 373 | __le32 osdmap_epoch; /* client's osdmap epoch */ | ||
| 374 | |||
| 375 | __le32 flags; | ||
| 376 | |||
| 377 | struct ceph_timespec mtime; /* for mutations only */ | ||
| 378 | struct ceph_eversion reassert_version; /* if we are replaying op */ | ||
| 379 | |||
| 380 | __le32 object_len; /* length of object name */ | ||
| 381 | |||
| 382 | __le64 snapid; /* snapid to read */ | ||
| 383 | __le64 snap_seq; /* writer's snap context */ | ||
| 384 | __le32 num_snaps; | ||
| 385 | |||
| 386 | __le16 num_ops; | ||
| 387 | struct ceph_osd_op ops[]; /* followed by ops[], obj, ticket, snaps */ | ||
| 388 | } __attribute__ ((packed)); | ||
| 389 | |||
| 390 | struct ceph_osd_reply_head { | ||
| 391 | __le32 client_inc; /* client incarnation */ | ||
| 392 | __le32 flags; | ||
| 393 | struct ceph_object_layout layout; | ||
| 394 | __le32 osdmap_epoch; | ||
| 395 | struct ceph_eversion reassert_version; /* for replaying uncommitted */ | ||
| 396 | |||
| 397 | __le32 result; /* result code */ | ||
| 398 | |||
| 399 | __le32 object_len; /* length of object name */ | ||
| 400 | __le32 num_ops; | ||
| 401 | struct ceph_osd_op ops[0]; /* ops[], object */ | ||
| 402 | } __attribute__ ((packed)); | ||
| 403 | |||
| 404 | |||
| 405 | #endif | ||
diff --git a/include/linux/ceph/types.h b/include/linux/ceph/types.h new file mode 100644 index 000000000000..28b35a005ec2 --- /dev/null +++ b/include/linux/ceph/types.h | |||
| @@ -0,0 +1,29 @@ | |||
| 1 | #ifndef _FS_CEPH_TYPES_H | ||
| 2 | #define _FS_CEPH_TYPES_H | ||
| 3 | |||
| 4 | /* needed before including ceph_fs.h */ | ||
| 5 | #include <linux/in.h> | ||
| 6 | #include <linux/types.h> | ||
| 7 | #include <linux/fcntl.h> | ||
| 8 | #include <linux/string.h> | ||
| 9 | |||
| 10 | #include "ceph_fs.h" | ||
| 11 | #include "ceph_frag.h" | ||
| 12 | #include "ceph_hash.h" | ||
| 13 | |||
| 14 | /* | ||
| 15 | * Identify inodes by both their ino AND snapshot id (a u64). | ||
| 16 | */ | ||
| 17 | struct ceph_vino { | ||
| 18 | u64 ino; | ||
| 19 | u64 snap; | ||
| 20 | }; | ||
| 21 | |||
| 22 | |||
| 23 | /* context for the caps reservation mechanism */ | ||
| 24 | struct ceph_cap_reservation { | ||
| 25 | int count; | ||
| 26 | }; | ||
| 27 | |||
| 28 | |||
| 29 | #endif | ||
diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h index e3d00fdb858d..ed4ba111bc8d 100644 --- a/include/linux/cgroup.h +++ b/include/linux/cgroup.h | |||
| @@ -75,7 +75,7 @@ struct cgroup_subsys_state { | |||
| 75 | 75 | ||
| 76 | unsigned long flags; | 76 | unsigned long flags; |
| 77 | /* ID for this css, if possible */ | 77 | /* ID for this css, if possible */ |
| 78 | struct css_id *id; | 78 | struct css_id __rcu *id; |
| 79 | }; | 79 | }; |
| 80 | 80 | ||
| 81 | /* bits in struct cgroup_subsys_state flags field */ | 81 | /* bits in struct cgroup_subsys_state flags field */ |
| @@ -154,6 +154,10 @@ enum { | |||
| 154 | * A thread in rmdir() is wating for this cgroup. | 154 | * A thread in rmdir() is wating for this cgroup. |
| 155 | */ | 155 | */ |
| 156 | CGRP_WAIT_ON_RMDIR, | 156 | CGRP_WAIT_ON_RMDIR, |
| 157 | /* | ||
| 158 | * Clone cgroup values when creating a new child cgroup | ||
| 159 | */ | ||
| 160 | CGRP_CLONE_CHILDREN, | ||
| 157 | }; | 161 | }; |
| 158 | 162 | ||
| 159 | /* which pidlist file are we talking about? */ | 163 | /* which pidlist file are we talking about? */ |
| @@ -205,7 +209,7 @@ struct cgroup { | |||
| 205 | struct list_head children; /* my children */ | 209 | struct list_head children; /* my children */ |
| 206 | 210 | ||
| 207 | struct cgroup *parent; /* my parent */ | 211 | struct cgroup *parent; /* my parent */ |
| 208 | struct dentry *dentry; /* cgroup fs entry, RCU protected */ | 212 | struct dentry __rcu *dentry; /* cgroup fs entry, RCU protected */ |
| 209 | 213 | ||
| 210 | /* Private pointers for each registered subsystem */ | 214 | /* Private pointers for each registered subsystem */ |
| 211 | struct cgroup_subsys_state *subsys[CGROUP_SUBSYS_COUNT]; | 215 | struct cgroup_subsys_state *subsys[CGROUP_SUBSYS_COUNT]; |
| @@ -578,6 +582,12 @@ struct task_struct *cgroup_iter_next(struct cgroup *cgrp, | |||
| 578 | void cgroup_iter_end(struct cgroup *cgrp, struct cgroup_iter *it); | 582 | void cgroup_iter_end(struct cgroup *cgrp, struct cgroup_iter *it); |
| 579 | int cgroup_scan_tasks(struct cgroup_scanner *scan); | 583 | int cgroup_scan_tasks(struct cgroup_scanner *scan); |
| 580 | int cgroup_attach_task(struct cgroup *, struct task_struct *); | 584 | int cgroup_attach_task(struct cgroup *, struct task_struct *); |
| 585 | int cgroup_attach_task_all(struct task_struct *from, struct task_struct *); | ||
| 586 | |||
| 587 | static inline int cgroup_attach_task_current_cg(struct task_struct *tsk) | ||
| 588 | { | ||
| 589 | return cgroup_attach_task_all(current, tsk); | ||
| 590 | } | ||
| 581 | 591 | ||
| 582 | /* | 592 | /* |
| 583 | * CSS ID is ID for cgroup_subsys_state structs under subsys. This only works | 593 | * CSS ID is ID for cgroup_subsys_state structs under subsys. This only works |
| @@ -634,6 +644,17 @@ static inline int cgroupstats_build(struct cgroupstats *stats, | |||
| 634 | return -EINVAL; | 644 | return -EINVAL; |
| 635 | } | 645 | } |
| 636 | 646 | ||
| 647 | /* No cgroups - nothing to do */ | ||
| 648 | static inline int cgroup_attach_task_all(struct task_struct *from, | ||
| 649 | struct task_struct *t) | ||
| 650 | { | ||
| 651 | return 0; | ||
| 652 | } | ||
| 653 | static inline int cgroup_attach_task_current_cg(struct task_struct *t) | ||
| 654 | { | ||
| 655 | return 0; | ||
| 656 | } | ||
| 657 | |||
| 637 | #endif /* !CONFIG_CGROUPS */ | 658 | #endif /* !CONFIG_CGROUPS */ |
| 638 | 659 | ||
| 639 | #endif /* _LINUX_CGROUP_H */ | 660 | #endif /* _LINUX_CGROUP_H */ |
diff --git a/include/linux/clocksource.h b/include/linux/clocksource.h index 5ea3c60c160c..c37b21ad5a3b 100644 --- a/include/linux/clocksource.h +++ b/include/linux/clocksource.h | |||
| @@ -292,6 +292,8 @@ clocks_calc_mult_shift(u32 *mult, u32 *shift, u32 from, u32 to, u32 minsec); | |||
| 292 | */ | 292 | */ |
| 293 | extern int | 293 | extern int |
| 294 | __clocksource_register_scale(struct clocksource *cs, u32 scale, u32 freq); | 294 | __clocksource_register_scale(struct clocksource *cs, u32 scale, u32 freq); |
| 295 | extern void | ||
| 296 | __clocksource_updatefreq_scale(struct clocksource *cs, u32 scale, u32 freq); | ||
| 295 | 297 | ||
| 296 | static inline int clocksource_register_hz(struct clocksource *cs, u32 hz) | 298 | static inline int clocksource_register_hz(struct clocksource *cs, u32 hz) |
| 297 | { | 299 | { |
| @@ -303,6 +305,15 @@ static inline int clocksource_register_khz(struct clocksource *cs, u32 khz) | |||
| 303 | return __clocksource_register_scale(cs, 1000, khz); | 305 | return __clocksource_register_scale(cs, 1000, khz); |
| 304 | } | 306 | } |
| 305 | 307 | ||
| 308 | static inline void __clocksource_updatefreq_hz(struct clocksource *cs, u32 hz) | ||
| 309 | { | ||
| 310 | __clocksource_updatefreq_scale(cs, 1, hz); | ||
| 311 | } | ||
| 312 | |||
| 313 | static inline void __clocksource_updatefreq_khz(struct clocksource *cs, u32 khz) | ||
| 314 | { | ||
| 315 | __clocksource_updatefreq_scale(cs, 1000, khz); | ||
| 316 | } | ||
| 306 | 317 | ||
| 307 | static inline void | 318 | static inline void |
| 308 | clocksource_calc_mult_shift(struct clocksource *cs, u32 freq, u32 minsec) | 319 | clocksource_calc_mult_shift(struct clocksource *cs, u32 freq, u32 minsec) |
| @@ -313,11 +324,13 @@ clocksource_calc_mult_shift(struct clocksource *cs, u32 freq, u32 minsec) | |||
| 313 | 324 | ||
| 314 | #ifdef CONFIG_GENERIC_TIME_VSYSCALL | 325 | #ifdef CONFIG_GENERIC_TIME_VSYSCALL |
| 315 | extern void | 326 | extern void |
| 316 | update_vsyscall(struct timespec *ts, struct clocksource *c, u32 mult); | 327 | update_vsyscall(struct timespec *ts, struct timespec *wtm, |
| 328 | struct clocksource *c, u32 mult); | ||
| 317 | extern void update_vsyscall_tz(void); | 329 | extern void update_vsyscall_tz(void); |
| 318 | #else | 330 | #else |
| 319 | static inline void | 331 | static inline void |
| 320 | update_vsyscall(struct timespec *ts, struct clocksource *c, u32 mult) | 332 | update_vsyscall(struct timespec *ts, struct timespec *wtm, |
| 333 | struct clocksource *c, u32 mult) | ||
| 321 | { | 334 | { |
| 322 | } | 335 | } |
| 323 | 336 | ||
diff --git a/include/linux/coda_fs_i.h b/include/linux/coda_fs_i.h index b3ef0c461578..e35071b1de0e 100644 --- a/include/linux/coda_fs_i.h +++ b/include/linux/coda_fs_i.h | |||
| @@ -10,19 +10,24 @@ | |||
| 10 | 10 | ||
| 11 | #include <linux/types.h> | 11 | #include <linux/types.h> |
| 12 | #include <linux/list.h> | 12 | #include <linux/list.h> |
| 13 | #include <linux/spinlock.h> | ||
| 13 | #include <linux/coda.h> | 14 | #include <linux/coda.h> |
| 14 | 15 | ||
| 15 | /* | 16 | /* |
| 16 | * coda fs inode data | 17 | * coda fs inode data |
| 18 | * c_lock protects accesses to c_flags, c_mapcount, c_cached_epoch, c_uid and | ||
| 19 | * c_cached_perm. | ||
| 20 | * vfs_inode is set only when the inode is created and never changes. | ||
| 21 | * c_fid is set when the inode is created and should be considered immutable. | ||
| 17 | */ | 22 | */ |
| 18 | struct coda_inode_info { | 23 | struct coda_inode_info { |
| 19 | struct CodaFid c_fid; /* Coda identifier */ | 24 | struct CodaFid c_fid; /* Coda identifier */ |
| 20 | u_short c_flags; /* flags (see below) */ | 25 | u_short c_flags; /* flags (see below) */ |
| 21 | struct list_head c_cilist; /* list of all coda inodes */ | ||
| 22 | unsigned int c_mapcount; /* nr of times this inode is mapped */ | 26 | unsigned int c_mapcount; /* nr of times this inode is mapped */ |
| 23 | unsigned int c_cached_epoch; /* epoch for cached permissions */ | 27 | unsigned int c_cached_epoch; /* epoch for cached permissions */ |
| 24 | vuid_t c_uid; /* fsuid for cached permissions */ | 28 | vuid_t c_uid; /* fsuid for cached permissions */ |
| 25 | unsigned int c_cached_perm; /* cached access permissions */ | 29 | unsigned int c_cached_perm; /* cached access permissions */ |
| 30 | spinlock_t c_lock; | ||
| 26 | struct inode vfs_inode; | 31 | struct inode vfs_inode; |
| 27 | }; | 32 | }; |
| 28 | 33 | ||
diff --git a/include/linux/coda_linux.h b/include/linux/coda_linux.h index dcc228aa335a..2e914d0771b9 100644 --- a/include/linux/coda_linux.h +++ b/include/linux/coda_linux.h | |||
| @@ -89,7 +89,11 @@ static __inline__ char *coda_i2s(struct inode *inode) | |||
| 89 | /* this will not zap the inode away */ | 89 | /* this will not zap the inode away */ |
| 90 | static __inline__ void coda_flag_inode(struct inode *inode, int flag) | 90 | static __inline__ void coda_flag_inode(struct inode *inode, int flag) |
| 91 | { | 91 | { |
| 92 | ITOC(inode)->c_flags |= flag; | 92 | struct coda_inode_info *cii = ITOC(inode); |
| 93 | |||
| 94 | spin_lock(&cii->c_lock); | ||
| 95 | cii->c_flags |= flag; | ||
| 96 | spin_unlock(&cii->c_lock); | ||
| 93 | } | 97 | } |
| 94 | 98 | ||
| 95 | #endif | 99 | #endif |
diff --git a/include/linux/coda_psdev.h b/include/linux/coda_psdev.h index 8859e2ede9fe..72f2d2f0af91 100644 --- a/include/linux/coda_psdev.h +++ b/include/linux/coda_psdev.h | |||
| @@ -8,6 +8,7 @@ | |||
| 8 | 8 | ||
| 9 | #ifdef __KERNEL__ | 9 | #ifdef __KERNEL__ |
| 10 | #include <linux/backing-dev.h> | 10 | #include <linux/backing-dev.h> |
| 11 | #include <linux/mutex.h> | ||
| 11 | 12 | ||
| 12 | struct kstatfs; | 13 | struct kstatfs; |
| 13 | 14 | ||
| @@ -20,6 +21,7 @@ struct venus_comm { | |||
| 20 | int vc_inuse; | 21 | int vc_inuse; |
| 21 | struct super_block *vc_sb; | 22 | struct super_block *vc_sb; |
| 22 | struct backing_dev_info bdi; | 23 | struct backing_dev_info bdi; |
| 24 | struct mutex vc_mutex; | ||
| 23 | }; | 25 | }; |
| 24 | 26 | ||
| 25 | 27 | ||
| @@ -63,7 +65,7 @@ int venus_symlink(struct super_block *sb, struct CodaFid *fid, | |||
| 63 | int venus_access(struct super_block *sb, struct CodaFid *fid, int mask); | 65 | int venus_access(struct super_block *sb, struct CodaFid *fid, int mask); |
| 64 | int venus_pioctl(struct super_block *sb, struct CodaFid *fid, | 66 | int venus_pioctl(struct super_block *sb, struct CodaFid *fid, |
| 65 | unsigned int cmd, struct PioctlData *data); | 67 | unsigned int cmd, struct PioctlData *data); |
| 66 | int coda_downcall(int opcode, union outputArgs *out, struct super_block *sb); | 68 | int coda_downcall(struct venus_comm *vcp, int opcode, union outputArgs *out); |
| 67 | int venus_fsync(struct super_block *sb, struct CodaFid *fid); | 69 | int venus_fsync(struct super_block *sb, struct CodaFid *fid); |
| 68 | int venus_statfs(struct dentry *dentry, struct kstatfs *sfs); | 70 | int venus_statfs(struct dentry *dentry, struct kstatfs *sfs); |
| 69 | 71 | ||
| @@ -86,9 +88,9 @@ struct upc_req { | |||
| 86 | wait_queue_head_t uc_sleep; /* process' wait queue */ | 88 | wait_queue_head_t uc_sleep; /* process' wait queue */ |
| 87 | }; | 89 | }; |
| 88 | 90 | ||
| 89 | #define REQ_ASYNC 0x1 | 91 | #define CODA_REQ_ASYNC 0x1 |
| 90 | #define REQ_READ 0x2 | 92 | #define CODA_REQ_READ 0x2 |
| 91 | #define REQ_WRITE 0x4 | 93 | #define CODA_REQ_WRITE 0x4 |
| 92 | #define REQ_ABORT 0x8 | 94 | #define CODA_REQ_ABORT 0x8 |
| 93 | 95 | ||
| 94 | #endif | 96 | #endif |
diff --git a/include/linux/compat.h b/include/linux/compat.h index 168f7daa7bde..5778b559d59c 100644 --- a/include/linux/compat.h +++ b/include/linux/compat.h | |||
| @@ -331,7 +331,7 @@ asmlinkage long compat_sys_epoll_pwait(int epfd, | |||
| 331 | const compat_sigset_t __user *sigmask, | 331 | const compat_sigset_t __user *sigmask, |
| 332 | compat_size_t sigsetsize); | 332 | compat_size_t sigsetsize); |
| 333 | 333 | ||
| 334 | asmlinkage long compat_sys_utimensat(unsigned int dfd, char __user *filename, | 334 | asmlinkage long compat_sys_utimensat(unsigned int dfd, const char __user *filename, |
| 335 | struct compat_timespec __user *t, int flags); | 335 | struct compat_timespec __user *t, int flags); |
| 336 | 336 | ||
| 337 | asmlinkage long compat_sys_signalfd(int ufd, | 337 | asmlinkage long compat_sys_signalfd(int ufd, |
| @@ -348,9 +348,9 @@ asmlinkage long compat_sys_move_pages(pid_t pid, unsigned long nr_page, | |||
| 348 | const int __user *nodes, | 348 | const int __user *nodes, |
| 349 | int __user *status, | 349 | int __user *status, |
| 350 | int flags); | 350 | int flags); |
| 351 | asmlinkage long compat_sys_futimesat(unsigned int dfd, char __user *filename, | 351 | asmlinkage long compat_sys_futimesat(unsigned int dfd, const char __user *filename, |
| 352 | struct compat_timeval __user *t); | 352 | struct compat_timeval __user *t); |
| 353 | asmlinkage long compat_sys_newfstatat(unsigned int dfd, char __user * filename, | 353 | asmlinkage long compat_sys_newfstatat(unsigned int dfd, const char __user * filename, |
| 354 | struct compat_stat __user *statbuf, | 354 | struct compat_stat __user *statbuf, |
| 355 | int flag); | 355 | int flag); |
| 356 | asmlinkage long compat_sys_openat(unsigned int dfd, const char __user *filename, | 356 | asmlinkage long compat_sys_openat(unsigned int dfd, const char __user *filename, |
| @@ -360,5 +360,8 @@ extern ssize_t compat_rw_copy_check_uvector(int type, | |||
| 360 | const struct compat_iovec __user *uvector, unsigned long nr_segs, | 360 | const struct compat_iovec __user *uvector, unsigned long nr_segs, |
| 361 | unsigned long fast_segs, struct iovec *fast_pointer, | 361 | unsigned long fast_segs, struct iovec *fast_pointer, |
| 362 | struct iovec **ret_pointer); | 362 | struct iovec **ret_pointer); |
| 363 | |||
| 364 | extern void __user *compat_alloc_user_space(unsigned long len); | ||
| 365 | |||
| 363 | #endif /* CONFIG_COMPAT */ | 366 | #endif /* CONFIG_COMPAT */ |
| 364 | #endif /* _LINUX_COMPAT_H */ | 367 | #endif /* _LINUX_COMPAT_H */ |
diff --git a/include/linux/compiler-gcc.h b/include/linux/compiler-gcc.h index 0da5b187f124..16508bcddacc 100644 --- a/include/linux/compiler-gcc.h +++ b/include/linux/compiler-gcc.h | |||
| @@ -35,8 +35,7 @@ | |||
| 35 | (typeof(ptr)) (__ptr + (off)); }) | 35 | (typeof(ptr)) (__ptr + (off)); }) |
| 36 | 36 | ||
| 37 | /* &a[0] degrades to a pointer: a different type from an array */ | 37 | /* &a[0] degrades to a pointer: a different type from an array */ |
| 38 | #define __must_be_array(a) \ | 38 | #define __must_be_array(a) BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0])) |
| 39 | BUILD_BUG_ON_ZERO(__builtin_types_compatible_p(typeof(a), typeof(&a[0]))) | ||
| 40 | 39 | ||
| 41 | /* | 40 | /* |
| 42 | * Force always-inline if the user requests it so via the .config, | 41 | * Force always-inline if the user requests it so via the .config, |
diff --git a/include/linux/compiler.h b/include/linux/compiler.h index a5a472b10746..320d6c94ff84 100644 --- a/include/linux/compiler.h +++ b/include/linux/compiler.h | |||
| @@ -16,6 +16,11 @@ | |||
| 16 | # define __release(x) __context__(x,-1) | 16 | # define __release(x) __context__(x,-1) |
| 17 | # define __cond_lock(x,c) ((c) ? ({ __acquire(x); 1; }) : 0) | 17 | # define __cond_lock(x,c) ((c) ? ({ __acquire(x); 1; }) : 0) |
| 18 | # define __percpu __attribute__((noderef, address_space(3))) | 18 | # define __percpu __attribute__((noderef, address_space(3))) |
| 19 | #ifdef CONFIG_SPARSE_RCU_POINTER | ||
| 20 | # define __rcu __attribute__((noderef, address_space(4))) | ||
| 21 | #else | ||
| 22 | # define __rcu | ||
| 23 | #endif | ||
| 19 | extern void __chk_user_ptr(const volatile void __user *); | 24 | extern void __chk_user_ptr(const volatile void __user *); |
| 20 | extern void __chk_io_ptr(const volatile void __iomem *); | 25 | extern void __chk_io_ptr(const volatile void __iomem *); |
| 21 | #else | 26 | #else |
| @@ -34,6 +39,7 @@ extern void __chk_io_ptr(const volatile void __iomem *); | |||
| 34 | # define __release(x) (void)0 | 39 | # define __release(x) (void)0 |
| 35 | # define __cond_lock(x,c) (c) | 40 | # define __cond_lock(x,c) (c) |
| 36 | # define __percpu | 41 | # define __percpu |
| 42 | # define __rcu | ||
| 37 | #endif | 43 | #endif |
| 38 | 44 | ||
| 39 | #ifdef __KERNEL__ | 45 | #ifdef __KERNEL__ |
diff --git a/include/linux/completion.h b/include/linux/completion.h index 51e3145196f6..36d57f74cd01 100644 --- a/include/linux/completion.h +++ b/include/linux/completion.h | |||
| @@ -10,7 +10,7 @@ | |||
| 10 | 10 | ||
| 11 | #include <linux/wait.h> | 11 | #include <linux/wait.h> |
| 12 | 12 | ||
| 13 | /** | 13 | /* |
| 14 | * struct completion - structure used to maintain state for a "completion" | 14 | * struct completion - structure used to maintain state for a "completion" |
| 15 | * | 15 | * |
| 16 | * This is the opaque structure used to maintain the state for a "completion". | 16 | * This is the opaque structure used to maintain the state for a "completion". |
| @@ -34,7 +34,7 @@ struct completion { | |||
| 34 | ({ init_completion(&work); work; }) | 34 | ({ init_completion(&work); work; }) |
| 35 | 35 | ||
| 36 | /** | 36 | /** |
| 37 | * DECLARE_COMPLETION: - declare and initialize a completion structure | 37 | * DECLARE_COMPLETION - declare and initialize a completion structure |
| 38 | * @work: identifier for the completion structure | 38 | * @work: identifier for the completion structure |
| 39 | * | 39 | * |
| 40 | * This macro declares and initializes a completion structure. Generally used | 40 | * This macro declares and initializes a completion structure. Generally used |
| @@ -50,7 +50,7 @@ struct completion { | |||
| 50 | * are on the kernel stack: | 50 | * are on the kernel stack: |
| 51 | */ | 51 | */ |
| 52 | /** | 52 | /** |
| 53 | * DECLARE_COMPLETION_ONSTACK: - declare and initialize a completion structure | 53 | * DECLARE_COMPLETION_ONSTACK - declare and initialize a completion structure |
| 54 | * @work: identifier for the completion structure | 54 | * @work: identifier for the completion structure |
| 55 | * | 55 | * |
| 56 | * This macro declares and initializes a completion structure on the kernel | 56 | * This macro declares and initializes a completion structure on the kernel |
| @@ -64,7 +64,7 @@ struct completion { | |||
| 64 | #endif | 64 | #endif |
| 65 | 65 | ||
| 66 | /** | 66 | /** |
| 67 | * init_completion: - Initialize a dynamically allocated completion | 67 | * init_completion - Initialize a dynamically allocated completion |
| 68 | * @x: completion structure that is to be initialized | 68 | * @x: completion structure that is to be initialized |
| 69 | * | 69 | * |
| 70 | * This inline function will initialize a dynamically created completion | 70 | * This inline function will initialize a dynamically created completion |
| @@ -92,7 +92,7 @@ extern void complete(struct completion *); | |||
| 92 | extern void complete_all(struct completion *); | 92 | extern void complete_all(struct completion *); |
| 93 | 93 | ||
| 94 | /** | 94 | /** |
| 95 | * INIT_COMPLETION: - reinitialize a completion structure | 95 | * INIT_COMPLETION - reinitialize a completion structure |
| 96 | * @x: completion structure to be reinitialized | 96 | * @x: completion structure to be reinitialized |
| 97 | * | 97 | * |
| 98 | * This macro should be used to reinitialize a completion structure so it can | 98 | * This macro should be used to reinitialize a completion structure so it can |
diff --git a/include/linux/connector.h b/include/linux/connector.h index 3a779ffba60b..7e8ca75d2dad 100644 --- a/include/linux/connector.h +++ b/include/linux/connector.h | |||
| @@ -88,12 +88,6 @@ struct cn_queue_dev { | |||
| 88 | unsigned char name[CN_CBQ_NAMELEN]; | 88 | unsigned char name[CN_CBQ_NAMELEN]; |
| 89 | 89 | ||
| 90 | struct workqueue_struct *cn_queue; | 90 | struct workqueue_struct *cn_queue; |
| 91 | /* Sent to kevent to create cn_queue only when needed */ | ||
| 92 | struct work_struct wq_creation; | ||
| 93 | /* Tell if the wq_creation job is pending/completed */ | ||
| 94 | atomic_t wq_requested; | ||
| 95 | /* Wait for cn_queue to be created */ | ||
| 96 | wait_queue_head_t wq_created; | ||
| 97 | 91 | ||
| 98 | struct list_head queue_list; | 92 | struct list_head queue_list; |
| 99 | spinlock_t queue_lock; | 93 | spinlock_t queue_lock; |
| @@ -141,8 +135,6 @@ int cn_netlink_send(struct cn_msg *, u32, gfp_t); | |||
| 141 | int cn_queue_add_callback(struct cn_queue_dev *dev, char *name, struct cb_id *id, void (*callback)(struct cn_msg *, struct netlink_skb_parms *)); | 135 | int cn_queue_add_callback(struct cn_queue_dev *dev, char *name, struct cb_id *id, void (*callback)(struct cn_msg *, struct netlink_skb_parms *)); |
| 142 | void cn_queue_del_callback(struct cn_queue_dev *dev, struct cb_id *id); | 136 | void cn_queue_del_callback(struct cn_queue_dev *dev, struct cb_id *id); |
| 143 | 137 | ||
| 144 | int queue_cn_work(struct cn_callback_entry *cbq, struct work_struct *work); | ||
| 145 | |||
| 146 | struct cn_queue_dev *cn_queue_alloc_dev(char *name, struct sock *); | 138 | struct cn_queue_dev *cn_queue_alloc_dev(char *name, struct sock *); |
| 147 | void cn_queue_free_dev(struct cn_queue_dev *dev); | 139 | void cn_queue_free_dev(struct cn_queue_dev *dev); |
| 148 | 140 | ||
diff --git a/include/linux/console.h b/include/linux/console.h index dcca5339ceb3..95cf6f08a59d 100644 --- a/include/linux/console.h +++ b/include/linux/console.h | |||
| @@ -55,6 +55,16 @@ struct consw { | |||
| 55 | void (*con_invert_region)(struct vc_data *, u16 *, int); | 55 | void (*con_invert_region)(struct vc_data *, u16 *, int); |
| 56 | u16 *(*con_screen_pos)(struct vc_data *, int); | 56 | u16 *(*con_screen_pos)(struct vc_data *, int); |
| 57 | unsigned long (*con_getxy)(struct vc_data *, unsigned long, int *, int *); | 57 | unsigned long (*con_getxy)(struct vc_data *, unsigned long, int *, int *); |
| 58 | /* | ||
| 59 | * Prepare the console for the debugger. This includes, but is not | ||
| 60 | * limited to, unblanking the console, loading an appropriate | ||
| 61 | * palette, and allowing debugger generated output. | ||
| 62 | */ | ||
| 63 | int (*con_debug_enter)(struct vc_data *); | ||
| 64 | /* | ||
| 65 | * Restore the console to its pre-debug state as closely as possible. | ||
| 66 | */ | ||
| 67 | int (*con_debug_leave)(struct vc_data *); | ||
| 58 | }; | 68 | }; |
| 59 | 69 | ||
| 60 | extern const struct consw *conswitchp; | 70 | extern const struct consw *conswitchp; |
| @@ -69,6 +79,14 @@ int register_con_driver(const struct consw *csw, int first, int last); | |||
| 69 | int unregister_con_driver(const struct consw *csw); | 79 | int unregister_con_driver(const struct consw *csw); |
| 70 | int take_over_console(const struct consw *sw, int first, int last, int deflt); | 80 | int take_over_console(const struct consw *sw, int first, int last, int deflt); |
| 71 | void give_up_console(const struct consw *sw); | 81 | void give_up_console(const struct consw *sw); |
| 82 | #ifdef CONFIG_HW_CONSOLE | ||
| 83 | int con_debug_enter(struct vc_data *vc); | ||
| 84 | int con_debug_leave(void); | ||
| 85 | #else | ||
| 86 | #define con_debug_enter(vc) (0) | ||
| 87 | #define con_debug_leave() (0) | ||
| 88 | #endif | ||
| 89 | |||
| 72 | /* scroll */ | 90 | /* scroll */ |
| 73 | #define SM_UP (1) | 91 | #define SM_UP (1) |
| 74 | #define SM_DOWN (2) | 92 | #define SM_DOWN (2) |
diff --git a/include/linux/console_struct.h b/include/linux/console_struct.h index 38fe59dc89ae..7f0c32908568 100644 --- a/include/linux/console_struct.h +++ b/include/linux/console_struct.h | |||
| @@ -21,6 +21,8 @@ struct vt_struct; | |||
| 21 | #define NPAR 16 | 21 | #define NPAR 16 |
| 22 | 22 | ||
| 23 | struct vc_data { | 23 | struct vc_data { |
| 24 | struct tty_port port; /* Upper level data */ | ||
| 25 | |||
| 24 | unsigned short vc_num; /* Console number */ | 26 | unsigned short vc_num; /* Console number */ |
| 25 | unsigned int vc_cols; /* [#] Console size */ | 27 | unsigned int vc_cols; /* [#] Console size */ |
| 26 | unsigned int vc_rows; | 28 | unsigned int vc_rows; |
| @@ -56,7 +58,6 @@ struct vc_data { | |||
| 56 | /* VT terminal data */ | 58 | /* VT terminal data */ |
| 57 | unsigned int vc_state; /* Escape sequence parser state */ | 59 | unsigned int vc_state; /* Escape sequence parser state */ |
| 58 | unsigned int vc_npar,vc_par[NPAR]; /* Parameters of current escape sequence */ | 60 | unsigned int vc_npar,vc_par[NPAR]; /* Parameters of current escape sequence */ |
| 59 | struct tty_struct *vc_tty; /* TTY we are attached to */ | ||
| 60 | /* data for manual vt switching */ | 61 | /* data for manual vt switching */ |
| 61 | struct vt_mode vt_mode; | 62 | struct vt_mode vt_mode; |
| 62 | struct pid *vt_pid; | 63 | struct pid *vt_pid; |
| @@ -105,6 +106,7 @@ struct vc_data { | |||
| 105 | struct vc_data **vc_display_fg; /* [!] Ptr to var holding fg console for this display */ | 106 | struct vc_data **vc_display_fg; /* [!] Ptr to var holding fg console for this display */ |
| 106 | unsigned long vc_uni_pagedir; | 107 | unsigned long vc_uni_pagedir; |
| 107 | unsigned long *vc_uni_pagedir_loc; /* [!] Location of uni_pagedir variable for this console */ | 108 | unsigned long *vc_uni_pagedir_loc; /* [!] Location of uni_pagedir variable for this console */ |
| 109 | bool vc_panic_force_write; /* when oops/panic this VC can accept forced output/blanking */ | ||
| 108 | /* additional information is in vt_kern.h */ | 110 | /* additional information is in vt_kern.h */ |
| 109 | }; | 111 | }; |
| 110 | 112 | ||
diff --git a/include/linux/coredump.h b/include/linux/coredump.h index 8ba66a9d9022..ba4b85a6d9b8 100644 --- a/include/linux/coredump.h +++ b/include/linux/coredump.h | |||
| @@ -9,37 +9,7 @@ | |||
| 9 | * These are the only things you should do on a core-file: use only these | 9 | * These are the only things you should do on a core-file: use only these |
| 10 | * functions to write out all the necessary info. | 10 | * functions to write out all the necessary info. |
| 11 | */ | 11 | */ |
| 12 | static inline int dump_write(struct file *file, const void *addr, int nr) | 12 | extern int dump_write(struct file *file, const void *addr, int nr); |
| 13 | { | 13 | extern int dump_seek(struct file *file, loff_t off); |
| 14 | return file->f_op->write(file, addr, nr, &file->f_pos) == nr; | ||
| 15 | } | ||
| 16 | |||
| 17 | static inline int dump_seek(struct file *file, loff_t off) | ||
| 18 | { | ||
| 19 | int ret = 1; | ||
| 20 | |||
| 21 | if (file->f_op->llseek && file->f_op->llseek != no_llseek) { | ||
| 22 | if (file->f_op->llseek(file, off, SEEK_CUR) < 0) | ||
| 23 | return 0; | ||
| 24 | } else { | ||
| 25 | char *buf = (char *)get_zeroed_page(GFP_KERNEL); | ||
| 26 | |||
| 27 | if (!buf) | ||
| 28 | return 0; | ||
| 29 | while (off > 0) { | ||
| 30 | unsigned long n = off; | ||
| 31 | |||
| 32 | if (n > PAGE_SIZE) | ||
| 33 | n = PAGE_SIZE; | ||
| 34 | if (!dump_write(file, buf, n)) { | ||
| 35 | ret = 0; | ||
| 36 | break; | ||
| 37 | } | ||
| 38 | off -= n; | ||
| 39 | } | ||
| 40 | free_page((unsigned long)buf); | ||
| 41 | } | ||
| 42 | return ret; | ||
| 43 | } | ||
| 44 | 14 | ||
| 45 | #endif /* _LINUX_COREDUMP_H */ | 15 | #endif /* _LINUX_COREDUMP_H */ |
diff --git a/include/linux/cper.h b/include/linux/cper.h index 4b38f905b705..bf972f81e2a7 100644 --- a/include/linux/cper.h +++ b/include/linux/cper.h | |||
| @@ -39,10 +39,10 @@ | |||
| 39 | * Severity difinition for error_severity in struct cper_record_header | 39 | * Severity difinition for error_severity in struct cper_record_header |
| 40 | * and section_severity in struct cper_section_descriptor | 40 | * and section_severity in struct cper_section_descriptor |
| 41 | */ | 41 | */ |
| 42 | #define CPER_SER_RECOVERABLE 0x0 | 42 | #define CPER_SEV_RECOVERABLE 0x0 |
| 43 | #define CPER_SER_FATAL 0x1 | 43 | #define CPER_SEV_FATAL 0x1 |
| 44 | #define CPER_SER_CORRECTED 0x2 | 44 | #define CPER_SEV_CORRECTED 0x2 |
| 45 | #define CPER_SER_INFORMATIONAL 0x3 | 45 | #define CPER_SEV_INFORMATIONAL 0x3 |
| 46 | 46 | ||
| 47 | /* | 47 | /* |
| 48 | * Validation bits difinition for validation_bits in struct | 48 | * Validation bits difinition for validation_bits in struct |
diff --git a/include/linux/cpu.h b/include/linux/cpu.h index e287863ac053..4823af64e9db 100644 --- a/include/linux/cpu.h +++ b/include/linux/cpu.h | |||
| @@ -48,6 +48,33 @@ extern ssize_t arch_cpu_release(const char *, size_t); | |||
| 48 | #endif | 48 | #endif |
| 49 | struct notifier_block; | 49 | struct notifier_block; |
| 50 | 50 | ||
| 51 | /* | ||
| 52 | * CPU notifier priorities. | ||
| 53 | */ | ||
| 54 | enum { | ||
| 55 | /* | ||
| 56 | * SCHED_ACTIVE marks a cpu which is coming up active during | ||
| 57 | * CPU_ONLINE and CPU_DOWN_FAILED and must be the first | ||
| 58 | * notifier. CPUSET_ACTIVE adjusts cpuset according to | ||
| 59 | * cpu_active mask right after SCHED_ACTIVE. During | ||
| 60 | * CPU_DOWN_PREPARE, SCHED_INACTIVE and CPUSET_INACTIVE are | ||
| 61 | * ordered in the similar way. | ||
| 62 | * | ||
| 63 | * This ordering guarantees consistent cpu_active mask and | ||
| 64 | * migration behavior to all cpu notifiers. | ||
| 65 | */ | ||
| 66 | CPU_PRI_SCHED_ACTIVE = INT_MAX, | ||
| 67 | CPU_PRI_CPUSET_ACTIVE = INT_MAX - 1, | ||
| 68 | CPU_PRI_SCHED_INACTIVE = INT_MIN + 1, | ||
| 69 | CPU_PRI_CPUSET_INACTIVE = INT_MIN, | ||
| 70 | |||
| 71 | /* migration should happen before other stuff but after perf */ | ||
| 72 | CPU_PRI_PERF = 20, | ||
| 73 | CPU_PRI_MIGRATION = 10, | ||
| 74 | /* prepare workqueues for other notifiers */ | ||
| 75 | CPU_PRI_WORKQUEUE = 5, | ||
| 76 | }; | ||
| 77 | |||
| 51 | #ifdef CONFIG_SMP | 78 | #ifdef CONFIG_SMP |
| 52 | /* Need to know about CPUs going up/down? */ | 79 | /* Need to know about CPUs going up/down? */ |
| 53 | #if defined(CONFIG_HOTPLUG_CPU) || !defined(MODULE) | 80 | #if defined(CONFIG_HOTPLUG_CPU) || !defined(MODULE) |
diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h index 9f15150ce8d6..c3e9de8321c6 100644 --- a/include/linux/cpufreq.h +++ b/include/linux/cpufreq.h | |||
| @@ -196,11 +196,6 @@ extern int __cpufreq_driver_getavg(struct cpufreq_policy *policy, | |||
| 196 | int cpufreq_register_governor(struct cpufreq_governor *governor); | 196 | int cpufreq_register_governor(struct cpufreq_governor *governor); |
| 197 | void cpufreq_unregister_governor(struct cpufreq_governor *governor); | 197 | void cpufreq_unregister_governor(struct cpufreq_governor *governor); |
| 198 | 198 | ||
| 199 | int lock_policy_rwsem_read(int cpu); | ||
| 200 | int lock_policy_rwsem_write(int cpu); | ||
| 201 | void unlock_policy_rwsem_read(int cpu); | ||
| 202 | void unlock_policy_rwsem_write(int cpu); | ||
| 203 | |||
| 204 | 199 | ||
| 205 | /********************************************************************* | 200 | /********************************************************************* |
| 206 | * CPUFREQ DRIVER INTERFACE * | 201 | * CPUFREQ DRIVER INTERFACE * |
diff --git a/include/linux/cpuidle.h b/include/linux/cpuidle.h index 55215cce5005..1be416bbbb82 100644 --- a/include/linux/cpuidle.h +++ b/include/linux/cpuidle.h | |||
| @@ -52,6 +52,8 @@ struct cpuidle_state { | |||
| 52 | #define CPUIDLE_FLAG_SHALLOW (0x20) /* low latency, minimal savings */ | 52 | #define CPUIDLE_FLAG_SHALLOW (0x20) /* low latency, minimal savings */ |
| 53 | #define CPUIDLE_FLAG_BALANCED (0x40) /* medium latency, moderate savings */ | 53 | #define CPUIDLE_FLAG_BALANCED (0x40) /* medium latency, moderate savings */ |
| 54 | #define CPUIDLE_FLAG_DEEP (0x80) /* high latency, large savings */ | 54 | #define CPUIDLE_FLAG_DEEP (0x80) /* high latency, large savings */ |
| 55 | #define CPUIDLE_FLAG_IGNORE (0x100) /* ignore during this idle period */ | ||
| 56 | #define CPUIDLE_FLAG_TLB_FLUSHED (0x200) /* tlb will be flushed */ | ||
| 55 | 57 | ||
| 56 | #define CPUIDLE_DRIVER_FLAGS_MASK (0xFFFF0000) | 58 | #define CPUIDLE_DRIVER_FLAGS_MASK (0xFFFF0000) |
| 57 | 59 | ||
| @@ -84,6 +86,7 @@ struct cpuidle_state_kobj { | |||
| 84 | struct cpuidle_device { | 86 | struct cpuidle_device { |
| 85 | unsigned int registered:1; | 87 | unsigned int registered:1; |
| 86 | unsigned int enabled:1; | 88 | unsigned int enabled:1; |
| 89 | unsigned int power_specified:1; | ||
| 87 | unsigned int cpu; | 90 | unsigned int cpu; |
| 88 | 91 | ||
| 89 | int last_residency; | 92 | int last_residency; |
| @@ -97,6 +100,8 @@ struct cpuidle_device { | |||
| 97 | struct completion kobj_unregister; | 100 | struct completion kobj_unregister; |
| 98 | void *governor_data; | 101 | void *governor_data; |
| 99 | struct cpuidle_state *safe_state; | 102 | struct cpuidle_state *safe_state; |
| 103 | |||
| 104 | int (*prepare) (struct cpuidle_device *dev); | ||
| 100 | }; | 105 | }; |
| 101 | 106 | ||
| 102 | DECLARE_PER_CPU(struct cpuidle_device *, cpuidle_devices); | 107 | DECLARE_PER_CPU(struct cpuidle_device *, cpuidle_devices); |
diff --git a/include/linux/cpuset.h b/include/linux/cpuset.h index 457ed765a116..f20eb8f16025 100644 --- a/include/linux/cpuset.h +++ b/include/linux/cpuset.h | |||
| @@ -20,6 +20,7 @@ extern int number_of_cpusets; /* How many cpusets are defined in system? */ | |||
| 20 | 20 | ||
| 21 | extern int cpuset_init(void); | 21 | extern int cpuset_init(void); |
| 22 | extern void cpuset_init_smp(void); | 22 | extern void cpuset_init_smp(void); |
| 23 | extern void cpuset_update_active_cpus(void); | ||
| 23 | extern void cpuset_cpus_allowed(struct task_struct *p, struct cpumask *mask); | 24 | extern void cpuset_cpus_allowed(struct task_struct *p, struct cpumask *mask); |
| 24 | extern int cpuset_cpus_allowed_fallback(struct task_struct *p); | 25 | extern int cpuset_cpus_allowed_fallback(struct task_struct *p); |
| 25 | extern nodemask_t cpuset_mems_allowed(struct task_struct *p); | 26 | extern nodemask_t cpuset_mems_allowed(struct task_struct *p); |
| @@ -132,6 +133,11 @@ static inline void set_mems_allowed(nodemask_t nodemask) | |||
| 132 | static inline int cpuset_init(void) { return 0; } | 133 | static inline int cpuset_init(void) { return 0; } |
| 133 | static inline void cpuset_init_smp(void) {} | 134 | static inline void cpuset_init_smp(void) {} |
| 134 | 135 | ||
| 136 | static inline void cpuset_update_active_cpus(void) | ||
| 137 | { | ||
| 138 | partition_sched_domains(1, NULL, NULL); | ||
| 139 | } | ||
| 140 | |||
| 135 | static inline void cpuset_cpus_allowed(struct task_struct *p, | 141 | static inline void cpuset_cpus_allowed(struct task_struct *p, |
| 136 | struct cpumask *mask) | 142 | struct cpumask *mask) |
| 137 | { | 143 | { |
diff --git a/include/linux/cred.h b/include/linux/cred.h index 4d2c39573f36..4aaeab376446 100644 --- a/include/linux/cred.h +++ b/include/linux/cred.h | |||
| @@ -84,7 +84,7 @@ struct thread_group_cred { | |||
| 84 | atomic_t usage; | 84 | atomic_t usage; |
| 85 | pid_t tgid; /* thread group process ID */ | 85 | pid_t tgid; /* thread group process ID */ |
| 86 | spinlock_t lock; | 86 | spinlock_t lock; |
| 87 | struct key *session_keyring; /* keyring inherited over fork */ | 87 | struct key __rcu *session_keyring; /* keyring inherited over fork */ |
| 88 | struct key *process_keyring; /* keyring private to this process */ | 88 | struct key *process_keyring; /* keyring private to this process */ |
| 89 | struct rcu_head rcu; /* RCU deletion hook */ | 89 | struct rcu_head rcu; /* RCU deletion hook */ |
| 90 | }; | 90 | }; |
diff --git a/include/linux/crush/crush.h b/include/linux/crush/crush.h new file mode 100644 index 000000000000..97e435b191f4 --- /dev/null +++ b/include/linux/crush/crush.h | |||
| @@ -0,0 +1,180 @@ | |||
| 1 | #ifndef CEPH_CRUSH_CRUSH_H | ||
| 2 | #define CEPH_CRUSH_CRUSH_H | ||
| 3 | |||
| 4 | #include <linux/types.h> | ||
| 5 | |||
| 6 | /* | ||
| 7 | * CRUSH is a pseudo-random data distribution algorithm that | ||
| 8 | * efficiently distributes input values (typically, data objects) | ||
| 9 | * across a heterogeneous, structured storage cluster. | ||
| 10 | * | ||
| 11 | * The algorithm was originally described in detail in this paper | ||
| 12 | * (although the algorithm has evolved somewhat since then): | ||
| 13 | * | ||
| 14 | * http://www.ssrc.ucsc.edu/Papers/weil-sc06.pdf | ||
| 15 | * | ||
| 16 | * LGPL2 | ||
| 17 | */ | ||
| 18 | |||
| 19 | |||
| 20 | #define CRUSH_MAGIC 0x00010000ul /* for detecting algorithm revisions */ | ||
| 21 | |||
| 22 | |||
| 23 | #define CRUSH_MAX_DEPTH 10 /* max crush hierarchy depth */ | ||
| 24 | #define CRUSH_MAX_SET 10 /* max size of a mapping result */ | ||
| 25 | |||
| 26 | |||
| 27 | /* | ||
| 28 | * CRUSH uses user-defined "rules" to describe how inputs should be | ||
| 29 | * mapped to devices. A rule consists of sequence of steps to perform | ||
| 30 | * to generate the set of output devices. | ||
| 31 | */ | ||
| 32 | struct crush_rule_step { | ||
| 33 | __u32 op; | ||
| 34 | __s32 arg1; | ||
| 35 | __s32 arg2; | ||
| 36 | }; | ||
| 37 | |||
| 38 | /* step op codes */ | ||
| 39 | enum { | ||
| 40 | CRUSH_RULE_NOOP = 0, | ||
| 41 | CRUSH_RULE_TAKE = 1, /* arg1 = value to start with */ | ||
| 42 | CRUSH_RULE_CHOOSE_FIRSTN = 2, /* arg1 = num items to pick */ | ||
| 43 | /* arg2 = type */ | ||
| 44 | CRUSH_RULE_CHOOSE_INDEP = 3, /* same */ | ||
| 45 | CRUSH_RULE_EMIT = 4, /* no args */ | ||
| 46 | CRUSH_RULE_CHOOSE_LEAF_FIRSTN = 6, | ||
| 47 | CRUSH_RULE_CHOOSE_LEAF_INDEP = 7, | ||
| 48 | }; | ||
| 49 | |||
| 50 | /* | ||
| 51 | * for specifying choose num (arg1) relative to the max parameter | ||
| 52 | * passed to do_rule | ||
| 53 | */ | ||
| 54 | #define CRUSH_CHOOSE_N 0 | ||
| 55 | #define CRUSH_CHOOSE_N_MINUS(x) (-(x)) | ||
| 56 | |||
| 57 | /* | ||
| 58 | * The rule mask is used to describe what the rule is intended for. | ||
| 59 | * Given a ruleset and size of output set, we search through the | ||
| 60 | * rule list for a matching rule_mask. | ||
| 61 | */ | ||
| 62 | struct crush_rule_mask { | ||
| 63 | __u8 ruleset; | ||
| 64 | __u8 type; | ||
| 65 | __u8 min_size; | ||
| 66 | __u8 max_size; | ||
| 67 | }; | ||
| 68 | |||
| 69 | struct crush_rule { | ||
| 70 | __u32 len; | ||
| 71 | struct crush_rule_mask mask; | ||
| 72 | struct crush_rule_step steps[0]; | ||
| 73 | }; | ||
| 74 | |||
| 75 | #define crush_rule_size(len) (sizeof(struct crush_rule) + \ | ||
| 76 | (len)*sizeof(struct crush_rule_step)) | ||
| 77 | |||
| 78 | |||
| 79 | |||
| 80 | /* | ||
| 81 | * A bucket is a named container of other items (either devices or | ||
| 82 | * other buckets). Items within a bucket are chosen using one of a | ||
| 83 | * few different algorithms. The table summarizes how the speed of | ||
| 84 | * each option measures up against mapping stability when items are | ||
| 85 | * added or removed. | ||
| 86 | * | ||
| 87 | * Bucket Alg Speed Additions Removals | ||
| 88 | * ------------------------------------------------ | ||
| 89 | * uniform O(1) poor poor | ||
| 90 | * list O(n) optimal poor | ||
| 91 | * tree O(log n) good good | ||
| 92 | * straw O(n) optimal optimal | ||
| 93 | */ | ||
| 94 | enum { | ||
| 95 | CRUSH_BUCKET_UNIFORM = 1, | ||
| 96 | CRUSH_BUCKET_LIST = 2, | ||
| 97 | CRUSH_BUCKET_TREE = 3, | ||
| 98 | CRUSH_BUCKET_STRAW = 4 | ||
| 99 | }; | ||
| 100 | extern const char *crush_bucket_alg_name(int alg); | ||
| 101 | |||
| 102 | struct crush_bucket { | ||
| 103 | __s32 id; /* this'll be negative */ | ||
| 104 | __u16 type; /* non-zero; type=0 is reserved for devices */ | ||
| 105 | __u8 alg; /* one of CRUSH_BUCKET_* */ | ||
| 106 | __u8 hash; /* which hash function to use, CRUSH_HASH_* */ | ||
| 107 | __u32 weight; /* 16-bit fixed point */ | ||
| 108 | __u32 size; /* num items */ | ||
| 109 | __s32 *items; | ||
| 110 | |||
| 111 | /* | ||
| 112 | * cached random permutation: used for uniform bucket and for | ||
| 113 | * the linear search fallback for the other bucket types. | ||
| 114 | */ | ||
| 115 | __u32 perm_x; /* @x for which *perm is defined */ | ||
| 116 | __u32 perm_n; /* num elements of *perm that are permuted/defined */ | ||
| 117 | __u32 *perm; | ||
| 118 | }; | ||
| 119 | |||
| 120 | struct crush_bucket_uniform { | ||
| 121 | struct crush_bucket h; | ||
| 122 | __u32 item_weight; /* 16-bit fixed point; all items equally weighted */ | ||
| 123 | }; | ||
| 124 | |||
| 125 | struct crush_bucket_list { | ||
| 126 | struct crush_bucket h; | ||
| 127 | __u32 *item_weights; /* 16-bit fixed point */ | ||
| 128 | __u32 *sum_weights; /* 16-bit fixed point. element i is sum | ||
| 129 | of weights 0..i, inclusive */ | ||
| 130 | }; | ||
| 131 | |||
| 132 | struct crush_bucket_tree { | ||
| 133 | struct crush_bucket h; /* note: h.size is _tree_ size, not number of | ||
| 134 | actual items */ | ||
| 135 | __u8 num_nodes; | ||
| 136 | __u32 *node_weights; | ||
| 137 | }; | ||
| 138 | |||
| 139 | struct crush_bucket_straw { | ||
| 140 | struct crush_bucket h; | ||
| 141 | __u32 *item_weights; /* 16-bit fixed point */ | ||
| 142 | __u32 *straws; /* 16-bit fixed point */ | ||
| 143 | }; | ||
| 144 | |||
| 145 | |||
| 146 | |||
| 147 | /* | ||
| 148 | * CRUSH map includes all buckets, rules, etc. | ||
| 149 | */ | ||
| 150 | struct crush_map { | ||
| 151 | struct crush_bucket **buckets; | ||
| 152 | struct crush_rule **rules; | ||
| 153 | |||
| 154 | /* | ||
| 155 | * Parent pointers to identify the parent bucket a device or | ||
| 156 | * bucket in the hierarchy. If an item appears more than | ||
| 157 | * once, this is the _last_ time it appeared (where buckets | ||
| 158 | * are processed in bucket id order, from -1 on down to | ||
| 159 | * -max_buckets. | ||
| 160 | */ | ||
| 161 | __u32 *bucket_parents; | ||
| 162 | __u32 *device_parents; | ||
| 163 | |||
| 164 | __s32 max_buckets; | ||
| 165 | __u32 max_rules; | ||
| 166 | __s32 max_devices; | ||
| 167 | }; | ||
| 168 | |||
| 169 | |||
| 170 | /* crush.c */ | ||
| 171 | extern int crush_get_bucket_item_weight(struct crush_bucket *b, int pos); | ||
| 172 | extern void crush_calc_parents(struct crush_map *map); | ||
| 173 | extern void crush_destroy_bucket_uniform(struct crush_bucket_uniform *b); | ||
| 174 | extern void crush_destroy_bucket_list(struct crush_bucket_list *b); | ||
| 175 | extern void crush_destroy_bucket_tree(struct crush_bucket_tree *b); | ||
| 176 | extern void crush_destroy_bucket_straw(struct crush_bucket_straw *b); | ||
| 177 | extern void crush_destroy_bucket(struct crush_bucket *b); | ||
| 178 | extern void crush_destroy(struct crush_map *map); | ||
| 179 | |||
| 180 | #endif | ||
diff --git a/include/linux/crush/hash.h b/include/linux/crush/hash.h new file mode 100644 index 000000000000..91e884230d5d --- /dev/null +++ b/include/linux/crush/hash.h | |||
| @@ -0,0 +1,17 @@ | |||
| 1 | #ifndef CEPH_CRUSH_HASH_H | ||
| 2 | #define CEPH_CRUSH_HASH_H | ||
| 3 | |||
| 4 | #define CRUSH_HASH_RJENKINS1 0 | ||
| 5 | |||
| 6 | #define CRUSH_HASH_DEFAULT CRUSH_HASH_RJENKINS1 | ||
| 7 | |||
| 8 | extern const char *crush_hash_name(int type); | ||
| 9 | |||
| 10 | extern __u32 crush_hash32(int type, __u32 a); | ||
| 11 | extern __u32 crush_hash32_2(int type, __u32 a, __u32 b); | ||
| 12 | extern __u32 crush_hash32_3(int type, __u32 a, __u32 b, __u32 c); | ||
| 13 | extern __u32 crush_hash32_4(int type, __u32 a, __u32 b, __u32 c, __u32 d); | ||
| 14 | extern __u32 crush_hash32_5(int type, __u32 a, __u32 b, __u32 c, __u32 d, | ||
| 15 | __u32 e); | ||
| 16 | |||
| 17 | #endif | ||
diff --git a/include/linux/crush/mapper.h b/include/linux/crush/mapper.h new file mode 100644 index 000000000000..c46b99c18bb0 --- /dev/null +++ b/include/linux/crush/mapper.h | |||
| @@ -0,0 +1,20 @@ | |||
| 1 | #ifndef CEPH_CRUSH_MAPPER_H | ||
| 2 | #define CEPH_CRUSH_MAPPER_H | ||
| 3 | |||
| 4 | /* | ||
| 5 | * CRUSH functions for find rules and then mapping an input to an | ||
| 6 | * output set. | ||
| 7 | * | ||
| 8 | * LGPL2 | ||
| 9 | */ | ||
| 10 | |||
| 11 | #include "crush.h" | ||
| 12 | |||
| 13 | extern int crush_find_rule(struct crush_map *map, int pool, int type, int size); | ||
| 14 | extern int crush_do_rule(struct crush_map *map, | ||
| 15 | int ruleno, | ||
| 16 | int x, int *result, int result_max, | ||
| 17 | int forcefeed, /* -1 for none */ | ||
| 18 | __u32 *weights); | ||
| 19 | |||
| 20 | #endif | ||
diff --git a/include/linux/davinci_emac.h b/include/linux/davinci_emac.h index 7c930dba477c..5dd428532f79 100644 --- a/include/linux/davinci_emac.h +++ b/include/linux/davinci_emac.h | |||
| @@ -14,16 +14,26 @@ | |||
| 14 | #include <linux/if_ether.h> | 14 | #include <linux/if_ether.h> |
| 15 | #include <linux/memory.h> | 15 | #include <linux/memory.h> |
| 16 | 16 | ||
| 17 | struct mdio_platform_data { | ||
| 18 | unsigned long bus_freq; | ||
| 19 | }; | ||
| 20 | |||
| 17 | struct emac_platform_data { | 21 | struct emac_platform_data { |
| 18 | char mac_addr[ETH_ALEN]; | 22 | char mac_addr[ETH_ALEN]; |
| 19 | u32 ctrl_reg_offset; | 23 | u32 ctrl_reg_offset; |
| 20 | u32 ctrl_mod_reg_offset; | 24 | u32 ctrl_mod_reg_offset; |
| 21 | u32 ctrl_ram_offset; | 25 | u32 ctrl_ram_offset; |
| 22 | u32 hw_ram_addr; | 26 | u32 hw_ram_addr; |
| 23 | u32 mdio_reg_offset; | ||
| 24 | u32 ctrl_ram_size; | 27 | u32 ctrl_ram_size; |
| 25 | u32 phy_mask; | 28 | |
| 26 | u32 mdio_max_freq; | 29 | /* |
| 30 | * phy_id can be one of the following: | ||
| 31 | * - NULL : use the first phy on the bus, | ||
| 32 | * - "" : force to 100/full, no mdio control | ||
| 33 | * - "<bus>:<addr>" : use the specified bus and phy | ||
| 34 | */ | ||
| 35 | const char *phy_id; | ||
| 36 | |||
| 27 | u8 rmii_en; | 37 | u8 rmii_en; |
| 28 | u8 version; | 38 | u8 version; |
| 29 | void (*interrupt_enable) (void); | 39 | void (*interrupt_enable) (void); |
diff --git a/include/linux/dcache.h b/include/linux/dcache.h index eebb617c17d8..6a4aea30aa09 100644 --- a/include/linux/dcache.h +++ b/include/linux/dcache.h | |||
| @@ -315,6 +315,8 @@ extern char *dynamic_dname(struct dentry *, char *, int, const char *, ...); | |||
| 315 | 315 | ||
| 316 | extern char *__d_path(const struct path *path, struct path *root, char *, int); | 316 | extern char *__d_path(const struct path *path, struct path *root, char *, int); |
| 317 | extern char *d_path(const struct path *, char *, int); | 317 | extern char *d_path(const struct path *, char *, int); |
| 318 | extern char *d_path_with_unreachable(const struct path *, char *, int); | ||
| 319 | extern char *__dentry_path(struct dentry *, char *, int); | ||
| 318 | extern char *dentry_path(struct dentry *, char *, int); | 320 | extern char *dentry_path(struct dentry *, char *, int); |
| 319 | 321 | ||
| 320 | /* Allocation counts.. */ | 322 | /* Allocation counts.. */ |
diff --git a/include/linux/dccp.h b/include/linux/dccp.h index 7434a8353e23..7187bd8a75f6 100644 --- a/include/linux/dccp.h +++ b/include/linux/dccp.h | |||
| @@ -165,8 +165,10 @@ enum { | |||
| 165 | DCCPO_TIMESTAMP_ECHO = 42, | 165 | DCCPO_TIMESTAMP_ECHO = 42, |
| 166 | DCCPO_ELAPSED_TIME = 43, | 166 | DCCPO_ELAPSED_TIME = 43, |
| 167 | DCCPO_MAX = 45, | 167 | DCCPO_MAX = 45, |
| 168 | DCCPO_MIN_CCID_SPECIFIC = 128, | 168 | DCCPO_MIN_RX_CCID_SPECIFIC = 128, /* from sender to receiver */ |
| 169 | DCCPO_MAX_CCID_SPECIFIC = 255, | 169 | DCCPO_MAX_RX_CCID_SPECIFIC = 191, |
| 170 | DCCPO_MIN_TX_CCID_SPECIFIC = 192, /* from receiver to sender */ | ||
| 171 | DCCPO_MAX_TX_CCID_SPECIFIC = 255, | ||
| 170 | }; | 172 | }; |
| 171 | /* maximum size of a single TLV-encoded DCCP option (sans type/len bytes) */ | 173 | /* maximum size of a single TLV-encoded DCCP option (sans type/len bytes) */ |
| 172 | #define DCCP_SINGLE_OPT_MAXLEN 253 | 174 | #define DCCP_SINGLE_OPT_MAXLEN 253 |
diff --git a/include/linux/debug_locks.h b/include/linux/debug_locks.h index 29b3ce3f2a1d..2833452ea01c 100644 --- a/include/linux/debug_locks.h +++ b/include/linux/debug_locks.h | |||
| @@ -49,7 +49,6 @@ struct task_struct; | |||
| 49 | 49 | ||
| 50 | #ifdef CONFIG_LOCKDEP | 50 | #ifdef CONFIG_LOCKDEP |
| 51 | extern void debug_show_all_locks(void); | 51 | extern void debug_show_all_locks(void); |
| 52 | extern void __debug_show_held_locks(struct task_struct *task); | ||
| 53 | extern void debug_show_held_locks(struct task_struct *task); | 52 | extern void debug_show_held_locks(struct task_struct *task); |
| 54 | extern void debug_check_no_locks_freed(const void *from, unsigned long len); | 53 | extern void debug_check_no_locks_freed(const void *from, unsigned long len); |
| 55 | extern void debug_check_no_locks_held(struct task_struct *task); | 54 | extern void debug_check_no_locks_held(struct task_struct *task); |
| @@ -58,10 +57,6 @@ static inline void debug_show_all_locks(void) | |||
| 58 | { | 57 | { |
| 59 | } | 58 | } |
| 60 | 59 | ||
| 61 | static inline void __debug_show_held_locks(struct task_struct *task) | ||
| 62 | { | ||
| 63 | } | ||
| 64 | |||
| 65 | static inline void debug_show_held_locks(struct task_struct *task) | 60 | static inline void debug_show_held_locks(struct task_struct *task) |
| 66 | { | 61 | { |
| 67 | } | 62 | } |
diff --git a/include/linux/delay.h b/include/linux/delay.h index fd832c6d419e..a6ecb34cf547 100644 --- a/include/linux/delay.h +++ b/include/linux/delay.h | |||
| @@ -45,6 +45,7 @@ extern unsigned long lpj_fine; | |||
| 45 | void calibrate_delay(void); | 45 | void calibrate_delay(void); |
| 46 | void msleep(unsigned int msecs); | 46 | void msleep(unsigned int msecs); |
| 47 | unsigned long msleep_interruptible(unsigned int msecs); | 47 | unsigned long msleep_interruptible(unsigned int msecs); |
| 48 | void usleep_range(unsigned long min, unsigned long max); | ||
| 48 | 49 | ||
| 49 | static inline void ssleep(unsigned int seconds) | 50 | static inline void ssleep(unsigned int seconds) |
| 50 | { | 51 | { |
diff --git a/include/linux/device-mapper.h b/include/linux/device-mapper.h index 1381cd97b4ed..2970022faa63 100644 --- a/include/linux/device-mapper.h +++ b/include/linux/device-mapper.h | |||
| @@ -22,7 +22,7 @@ typedef enum { STATUSTYPE_INFO, STATUSTYPE_TABLE } status_type_t; | |||
| 22 | union map_info { | 22 | union map_info { |
| 23 | void *ptr; | 23 | void *ptr; |
| 24 | unsigned long long ll; | 24 | unsigned long long ll; |
| 25 | unsigned flush_request; | 25 | unsigned target_request_nr; |
| 26 | }; | 26 | }; |
| 27 | 27 | ||
| 28 | /* | 28 | /* |
| @@ -174,12 +174,18 @@ struct dm_target { | |||
| 174 | * A number of zero-length barrier requests that will be submitted | 174 | * A number of zero-length barrier requests that will be submitted |
| 175 | * to the target for the purpose of flushing cache. | 175 | * to the target for the purpose of flushing cache. |
| 176 | * | 176 | * |
| 177 | * The request number will be placed in union map_info->flush_request. | 177 | * The request number will be placed in union map_info->target_request_nr. |
| 178 | * It is a responsibility of the target driver to remap these requests | 178 | * It is a responsibility of the target driver to remap these requests |
| 179 | * to the real underlying devices. | 179 | * to the real underlying devices. |
| 180 | */ | 180 | */ |
| 181 | unsigned num_flush_requests; | 181 | unsigned num_flush_requests; |
| 182 | 182 | ||
| 183 | /* | ||
| 184 | * The number of discard requests that will be submitted to the | ||
| 185 | * target. map_info->request_nr is used just like num_flush_requests. | ||
| 186 | */ | ||
| 187 | unsigned num_discard_requests; | ||
| 188 | |||
| 183 | /* target specific data */ | 189 | /* target specific data */ |
| 184 | void *private; | 190 | void *private; |
| 185 | 191 | ||
| @@ -392,6 +398,12 @@ void *dm_vcalloc(unsigned long nmemb, unsigned long elem_size); | |||
| 392 | #define dm_array_too_big(fixed, obj, num) \ | 398 | #define dm_array_too_big(fixed, obj, num) \ |
| 393 | ((num) > (UINT_MAX - (fixed)) / (obj)) | 399 | ((num) > (UINT_MAX - (fixed)) / (obj)) |
| 394 | 400 | ||
| 401 | /* | ||
| 402 | * Sector offset taken relative to the start of the target instead of | ||
| 403 | * relative to the start of the device. | ||
| 404 | */ | ||
| 405 | #define dm_target_offset(ti, sector) ((sector) - (ti)->begin) | ||
| 406 | |||
| 395 | static inline sector_t to_sector(unsigned long n) | 407 | static inline sector_t to_sector(unsigned long n) |
| 396 | { | 408 | { |
| 397 | return (n >> SECTOR_SHIFT); | 409 | return (n >> SECTOR_SHIFT); |
diff --git a/include/linux/device.h b/include/linux/device.h index 0713e10571dd..dd4895313468 100644 --- a/include/linux/device.h +++ b/include/linux/device.h | |||
| @@ -84,9 +84,8 @@ struct device *bus_find_device_by_name(struct bus_type *bus, | |||
| 84 | struct device *start, | 84 | struct device *start, |
| 85 | const char *name); | 85 | const char *name); |
| 86 | 86 | ||
| 87 | int __must_check bus_for_each_drv(struct bus_type *bus, | 87 | int bus_for_each_drv(struct bus_type *bus, struct device_driver *start, |
| 88 | struct device_driver *start, void *data, | 88 | void *data, int (*fn)(struct device_driver *, void *)); |
| 89 | int (*fn)(struct device_driver *, void *)); | ||
| 90 | 89 | ||
| 91 | void bus_sort_breadthfirst(struct bus_type *bus, | 90 | void bus_sort_breadthfirst(struct bus_type *bus, |
| 92 | int (*compare)(const struct device *a, | 91 | int (*compare)(const struct device *a, |
| @@ -110,10 +109,12 @@ extern int bus_unregister_notifier(struct bus_type *bus, | |||
| 110 | */ | 109 | */ |
| 111 | #define BUS_NOTIFY_ADD_DEVICE 0x00000001 /* device added */ | 110 | #define BUS_NOTIFY_ADD_DEVICE 0x00000001 /* device added */ |
| 112 | #define BUS_NOTIFY_DEL_DEVICE 0x00000002 /* device removed */ | 111 | #define BUS_NOTIFY_DEL_DEVICE 0x00000002 /* device removed */ |
| 113 | #define BUS_NOTIFY_BOUND_DRIVER 0x00000003 /* driver bound to device */ | 112 | #define BUS_NOTIFY_BIND_DRIVER 0x00000003 /* driver about to be |
| 114 | #define BUS_NOTIFY_UNBIND_DRIVER 0x00000004 /* driver about to be | 113 | bound */ |
| 114 | #define BUS_NOTIFY_BOUND_DRIVER 0x00000004 /* driver bound to device */ | ||
| 115 | #define BUS_NOTIFY_UNBIND_DRIVER 0x00000005 /* driver about to be | ||
| 115 | unbound */ | 116 | unbound */ |
| 116 | #define BUS_NOTIFY_UNBOUND_DRIVER 0x00000005 /* driver is unbound | 117 | #define BUS_NOTIFY_UNBOUND_DRIVER 0x00000006 /* driver is unbound |
| 117 | from the device */ | 118 | from the device */ |
| 118 | 119 | ||
| 119 | extern struct kset *bus_get_kset(struct bus_type *bus); | 120 | extern struct kset *bus_get_kset(struct bus_type *bus); |
| @@ -551,7 +552,7 @@ extern int device_for_each_child(struct device *dev, void *data, | |||
| 551 | int (*fn)(struct device *dev, void *data)); | 552 | int (*fn)(struct device *dev, void *data)); |
| 552 | extern struct device *device_find_child(struct device *dev, void *data, | 553 | extern struct device *device_find_child(struct device *dev, void *data, |
| 553 | int (*match)(struct device *dev, void *data)); | 554 | int (*match)(struct device *dev, void *data)); |
| 554 | extern int device_rename(struct device *dev, char *new_name); | 555 | extern int device_rename(struct device *dev, const char *new_name); |
| 555 | extern int device_move(struct device *dev, struct device *new_parent, | 556 | extern int device_move(struct device *dev, struct device *new_parent, |
| 556 | enum dpm_order dpm_order); | 557 | enum dpm_order dpm_order); |
| 557 | extern const char *device_get_devnode(struct device *dev, | 558 | extern const char *device_get_devnode(struct device *dev, |
| @@ -638,43 +639,103 @@ extern void sysdev_shutdown(void); | |||
| 638 | 639 | ||
| 639 | /* debugging and troubleshooting/diagnostic helpers. */ | 640 | /* debugging and troubleshooting/diagnostic helpers. */ |
| 640 | extern const char *dev_driver_string(const struct device *dev); | 641 | extern const char *dev_driver_string(const struct device *dev); |
| 641 | #define dev_printk(level, dev, format, arg...) \ | 642 | |
| 642 | printk(level "%s %s: " format , dev_driver_string(dev) , \ | 643 | |
| 643 | dev_name(dev) , ## arg) | 644 | #ifdef CONFIG_PRINTK |
| 644 | 645 | ||
| 645 | #define dev_emerg(dev, format, arg...) \ | 646 | extern int dev_printk(const char *level, const struct device *dev, |
| 646 | dev_printk(KERN_EMERG , dev , format , ## arg) | 647 | const char *fmt, ...) |
| 647 | #define dev_alert(dev, format, arg...) \ | 648 | __attribute__ ((format (printf, 3, 4))); |
| 648 | dev_printk(KERN_ALERT , dev , format , ## arg) | 649 | extern int dev_emerg(const struct device *dev, const char *fmt, ...) |
| 649 | #define dev_crit(dev, format, arg...) \ | 650 | __attribute__ ((format (printf, 2, 3))); |
| 650 | dev_printk(KERN_CRIT , dev , format , ## arg) | 651 | extern int dev_alert(const struct device *dev, const char *fmt, ...) |
| 651 | #define dev_err(dev, format, arg...) \ | 652 | __attribute__ ((format (printf, 2, 3))); |
| 652 | dev_printk(KERN_ERR , dev , format , ## arg) | 653 | extern int dev_crit(const struct device *dev, const char *fmt, ...) |
| 653 | #define dev_warn(dev, format, arg...) \ | 654 | __attribute__ ((format (printf, 2, 3))); |
| 654 | dev_printk(KERN_WARNING , dev , format , ## arg) | 655 | extern int dev_err(const struct device *dev, const char *fmt, ...) |
| 655 | #define dev_notice(dev, format, arg...) \ | 656 | __attribute__ ((format (printf, 2, 3))); |
| 656 | dev_printk(KERN_NOTICE , dev , format , ## arg) | 657 | extern int dev_warn(const struct device *dev, const char *fmt, ...) |
| 657 | #define dev_info(dev, format, arg...) \ | 658 | __attribute__ ((format (printf, 2, 3))); |
| 658 | dev_printk(KERN_INFO , dev , format , ## arg) | 659 | extern int dev_notice(const struct device *dev, const char *fmt, ...) |
| 660 | __attribute__ ((format (printf, 2, 3))); | ||
| 661 | extern int _dev_info(const struct device *dev, const char *fmt, ...) | ||
| 662 | __attribute__ ((format (printf, 2, 3))); | ||
| 663 | |||
| 664 | #else | ||
| 665 | |||
| 666 | static inline int dev_printk(const char *level, const struct device *dev, | ||
| 667 | const char *fmt, ...) | ||
| 668 | __attribute__ ((format (printf, 3, 4))); | ||
| 669 | static inline int dev_printk(const char *level, const struct device *dev, | ||
| 670 | const char *fmt, ...) | ||
| 671 | { return 0; } | ||
| 672 | |||
| 673 | static inline int dev_emerg(const struct device *dev, const char *fmt, ...) | ||
| 674 | __attribute__ ((format (printf, 2, 3))); | ||
| 675 | static inline int dev_emerg(const struct device *dev, const char *fmt, ...) | ||
| 676 | { return 0; } | ||
| 677 | static inline int dev_crit(const struct device *dev, const char *fmt, ...) | ||
| 678 | __attribute__ ((format (printf, 2, 3))); | ||
| 679 | static inline int dev_crit(const struct device *dev, const char *fmt, ...) | ||
| 680 | { return 0; } | ||
| 681 | static inline int dev_alert(const struct device *dev, const char *fmt, ...) | ||
| 682 | __attribute__ ((format (printf, 2, 3))); | ||
| 683 | static inline int dev_alert(const struct device *dev, const char *fmt, ...) | ||
| 684 | { return 0; } | ||
| 685 | static inline int dev_err(const struct device *dev, const char *fmt, ...) | ||
| 686 | __attribute__ ((format (printf, 2, 3))); | ||
| 687 | static inline int dev_err(const struct device *dev, const char *fmt, ...) | ||
| 688 | { return 0; } | ||
| 689 | static inline int dev_warn(const struct device *dev, const char *fmt, ...) | ||
| 690 | __attribute__ ((format (printf, 2, 3))); | ||
| 691 | static inline int dev_warn(const struct device *dev, const char *fmt, ...) | ||
| 692 | { return 0; } | ||
| 693 | static inline int dev_notice(const struct device *dev, const char *fmt, ...) | ||
| 694 | __attribute__ ((format (printf, 2, 3))); | ||
| 695 | static inline int dev_notice(const struct device *dev, const char *fmt, ...) | ||
| 696 | { return 0; } | ||
| 697 | static inline int _dev_info(const struct device *dev, const char *fmt, ...) | ||
| 698 | __attribute__ ((format (printf, 2, 3))); | ||
| 699 | static inline int _dev_info(const struct device *dev, const char *fmt, ...) | ||
| 700 | { return 0; } | ||
| 701 | |||
| 702 | #endif | ||
| 703 | |||
| 704 | /* | ||
| 705 | * Stupid hackaround for existing uses of non-printk uses dev_info | ||
| 706 | * | ||
| 707 | * Note that the definition of dev_info below is actually _dev_info | ||
| 708 | * and a macro is used to avoid redefining dev_info | ||
| 709 | */ | ||
| 710 | |||
| 711 | #define dev_info(dev, fmt, arg...) _dev_info(dev, fmt, ##arg) | ||
| 659 | 712 | ||
| 660 | #if defined(DEBUG) | 713 | #if defined(DEBUG) |
| 661 | #define dev_dbg(dev, format, arg...) \ | 714 | #define dev_dbg(dev, format, arg...) \ |
| 662 | dev_printk(KERN_DEBUG , dev , format , ## arg) | 715 | dev_printk(KERN_DEBUG, dev, format, ##arg) |
| 663 | #elif defined(CONFIG_DYNAMIC_DEBUG) | 716 | #elif defined(CONFIG_DYNAMIC_DEBUG) |
| 664 | #define dev_dbg(dev, format, ...) do { \ | 717 | #define dev_dbg(dev, format, ...) \ |
| 718 | do { \ | ||
| 665 | dynamic_dev_dbg(dev, format, ##__VA_ARGS__); \ | 719 | dynamic_dev_dbg(dev, format, ##__VA_ARGS__); \ |
| 666 | } while (0) | 720 | } while (0) |
| 667 | #else | 721 | #else |
| 668 | #define dev_dbg(dev, format, arg...) \ | 722 | #define dev_dbg(dev, format, arg...) \ |
| 669 | ({ if (0) dev_printk(KERN_DEBUG, dev, format, ##arg); 0; }) | 723 | ({ \ |
| 724 | if (0) \ | ||
| 725 | dev_printk(KERN_DEBUG, dev, format, ##arg); \ | ||
| 726 | 0; \ | ||
| 727 | }) | ||
| 670 | #endif | 728 | #endif |
| 671 | 729 | ||
| 672 | #ifdef VERBOSE_DEBUG | 730 | #ifdef VERBOSE_DEBUG |
| 673 | #define dev_vdbg dev_dbg | 731 | #define dev_vdbg dev_dbg |
| 674 | #else | 732 | #else |
| 675 | 733 | #define dev_vdbg(dev, format, arg...) \ | |
| 676 | #define dev_vdbg(dev, format, arg...) \ | 734 | ({ \ |
| 677 | ({ if (0) dev_printk(KERN_DEBUG, dev, format, ##arg); 0; }) | 735 | if (0) \ |
| 736 | dev_printk(KERN_DEBUG, dev, format, ##arg); \ | ||
| 737 | 0; \ | ||
| 738 | }) | ||
| 678 | #endif | 739 | #endif |
| 679 | 740 | ||
| 680 | /* | 741 | /* |
| @@ -690,4 +751,11 @@ extern const char *dev_driver_string(const struct device *dev); | |||
| 690 | MODULE_ALIAS("char-major-" __stringify(major) "-" __stringify(minor)) | 751 | MODULE_ALIAS("char-major-" __stringify(major) "-" __stringify(minor)) |
| 691 | #define MODULE_ALIAS_CHARDEV_MAJOR(major) \ | 752 | #define MODULE_ALIAS_CHARDEV_MAJOR(major) \ |
| 692 | MODULE_ALIAS("char-major-" __stringify(major) "-*") | 753 | MODULE_ALIAS("char-major-" __stringify(major) "-*") |
| 754 | |||
| 755 | #ifdef CONFIG_SYSFS_DEPRECATED | ||
| 756 | extern long sysfs_deprecated; | ||
| 757 | #else | ||
| 758 | #define sysfs_deprecated 0 | ||
| 759 | #endif | ||
| 760 | |||
| 693 | #endif /* _DEVICE_H_ */ | 761 | #endif /* _DEVICE_H_ */ |
diff --git a/include/linux/dlm.h b/include/linux/dlm.h index 0b3518c42356..d4e02f5353a0 100644 --- a/include/linux/dlm.h +++ b/include/linux/dlm.h | |||
| @@ -48,10 +48,10 @@ typedef void dlm_lockspace_t; | |||
| 48 | * | 48 | * |
| 49 | * 0 if lock request was successful | 49 | * 0 if lock request was successful |
| 50 | * -EAGAIN if request would block and is flagged DLM_LKF_NOQUEUE | 50 | * -EAGAIN if request would block and is flagged DLM_LKF_NOQUEUE |
| 51 | * -ENOMEM if there is no memory to process request | ||
| 52 | * -EINVAL if there are invalid parameters | ||
| 53 | * -DLM_EUNLOCK if unlock request was successful | 51 | * -DLM_EUNLOCK if unlock request was successful |
| 54 | * -DLM_ECANCEL if a cancel completed successfully | 52 | * -DLM_ECANCEL if a cancel completed successfully |
| 53 | * -EDEADLK if a deadlock was detected | ||
| 54 | * -ETIMEDOUT if the lock request was canceled due to a timeout | ||
| 55 | */ | 55 | */ |
| 56 | 56 | ||
| 57 | #define DLM_SBF_DEMOTED 0x01 | 57 | #define DLM_SBF_DEMOTED 0x01 |
diff --git a/include/linux/dm-ioctl.h b/include/linux/dm-ioctl.h index 2c445e113790..49eab360d5d4 100644 --- a/include/linux/dm-ioctl.h +++ b/include/linux/dm-ioctl.h | |||
| @@ -11,6 +11,7 @@ | |||
| 11 | #include <linux/types.h> | 11 | #include <linux/types.h> |
| 12 | 12 | ||
| 13 | #define DM_DIR "mapper" /* Slashes not supported */ | 13 | #define DM_DIR "mapper" /* Slashes not supported */ |
| 14 | #define DM_CONTROL_NODE "control" | ||
| 14 | #define DM_MAX_TYPE_NAME 16 | 15 | #define DM_MAX_TYPE_NAME 16 |
| 15 | #define DM_NAME_LEN 128 | 16 | #define DM_NAME_LEN 128 |
| 16 | #define DM_UUID_LEN 129 | 17 | #define DM_UUID_LEN 129 |
| @@ -266,9 +267,9 @@ enum { | |||
| 266 | #define DM_DEV_SET_GEOMETRY _IOWR(DM_IOCTL, DM_DEV_SET_GEOMETRY_CMD, struct dm_ioctl) | 267 | #define DM_DEV_SET_GEOMETRY _IOWR(DM_IOCTL, DM_DEV_SET_GEOMETRY_CMD, struct dm_ioctl) |
| 267 | 268 | ||
| 268 | #define DM_VERSION_MAJOR 4 | 269 | #define DM_VERSION_MAJOR 4 |
| 269 | #define DM_VERSION_MINOR 17 | 270 | #define DM_VERSION_MINOR 18 |
| 270 | #define DM_VERSION_PATCHLEVEL 0 | 271 | #define DM_VERSION_PATCHLEVEL 0 |
| 271 | #define DM_VERSION_EXTRA "-ioctl (2010-03-05)" | 272 | #define DM_VERSION_EXTRA "-ioctl (2010-06-29)" |
| 272 | 273 | ||
| 273 | /* Status bits */ | 274 | /* Status bits */ |
| 274 | #define DM_READONLY_FLAG (1 << 0) /* In/Out */ | 275 | #define DM_READONLY_FLAG (1 << 0) /* In/Out */ |
diff --git a/include/linux/dma-mapping.h b/include/linux/dma-mapping.h index 89b7e1a605b8..ba8319ae5fcc 100644 --- a/include/linux/dma-mapping.h +++ b/include/linux/dma-mapping.h | |||
| @@ -102,6 +102,9 @@ static inline u64 dma_get_mask(struct device *dev) | |||
| 102 | return DMA_BIT_MASK(32); | 102 | return DMA_BIT_MASK(32); |
| 103 | } | 103 | } |
| 104 | 104 | ||
| 105 | #ifdef ARCH_HAS_DMA_SET_COHERENT_MASK | ||
| 106 | int dma_set_coherent_mask(struct device *dev, u64 mask); | ||
| 107 | #else | ||
| 105 | static inline int dma_set_coherent_mask(struct device *dev, u64 mask) | 108 | static inline int dma_set_coherent_mask(struct device *dev, u64 mask) |
| 106 | { | 109 | { |
| 107 | if (!dma_supported(dev, mask)) | 110 | if (!dma_supported(dev, mask)) |
| @@ -109,6 +112,7 @@ static inline int dma_set_coherent_mask(struct device *dev, u64 mask) | |||
| 109 | dev->coherent_dma_mask = mask; | 112 | dev->coherent_dma_mask = mask; |
| 110 | return 0; | 113 | return 0; |
| 111 | } | 114 | } |
| 115 | #endif | ||
| 112 | 116 | ||
| 113 | extern u64 dma_get_required_mask(struct device *dev); | 117 | extern u64 dma_get_required_mask(struct device *dev); |
| 114 | 118 | ||
| @@ -142,6 +146,16 @@ static inline int dma_set_seg_boundary(struct device *dev, unsigned long mask) | |||
| 142 | return -EIO; | 146 | return -EIO; |
| 143 | } | 147 | } |
| 144 | 148 | ||
| 149 | #ifdef CONFIG_HAS_DMA | ||
| 150 | static inline int dma_get_cache_alignment(void) | ||
| 151 | { | ||
| 152 | #ifdef ARCH_DMA_MINALIGN | ||
| 153 | return ARCH_DMA_MINALIGN; | ||
| 154 | #endif | ||
| 155 | return 1; | ||
| 156 | } | ||
| 157 | #endif | ||
| 158 | |||
| 145 | /* flags for the coherent memory api */ | 159 | /* flags for the coherent memory api */ |
| 146 | #define DMA_MEMORY_MAP 0x01 | 160 | #define DMA_MEMORY_MAP 0x01 |
| 147 | #define DMA_MEMORY_IO 0x02 | 161 | #define DMA_MEMORY_IO 0x02 |
diff --git a/include/linux/dmaengine.h b/include/linux/dmaengine.h index 5204f018931b..9d8688b92d8b 100644 --- a/include/linux/dmaengine.h +++ b/include/linux/dmaengine.h | |||
| @@ -64,13 +64,15 @@ enum dma_transaction_type { | |||
| 64 | DMA_PQ_VAL, | 64 | DMA_PQ_VAL, |
| 65 | DMA_MEMSET, | 65 | DMA_MEMSET, |
| 66 | DMA_INTERRUPT, | 66 | DMA_INTERRUPT, |
| 67 | DMA_SG, | ||
| 67 | DMA_PRIVATE, | 68 | DMA_PRIVATE, |
| 68 | DMA_ASYNC_TX, | 69 | DMA_ASYNC_TX, |
| 69 | DMA_SLAVE, | 70 | DMA_SLAVE, |
| 71 | DMA_CYCLIC, | ||
| 70 | }; | 72 | }; |
| 71 | 73 | ||
| 72 | /* last transaction type for creation of the capabilities mask */ | 74 | /* last transaction type for creation of the capabilities mask */ |
| 73 | #define DMA_TX_TYPE_END (DMA_SLAVE + 1) | 75 | #define DMA_TX_TYPE_END (DMA_CYCLIC + 1) |
| 74 | 76 | ||
| 75 | 77 | ||
| 76 | /** | 78 | /** |
| @@ -114,11 +116,20 @@ enum dma_ctrl_flags { | |||
| 114 | * @DMA_TERMINATE_ALL: terminate all ongoing transfers | 116 | * @DMA_TERMINATE_ALL: terminate all ongoing transfers |
| 115 | * @DMA_PAUSE: pause ongoing transfers | 117 | * @DMA_PAUSE: pause ongoing transfers |
| 116 | * @DMA_RESUME: resume paused transfer | 118 | * @DMA_RESUME: resume paused transfer |
| 119 | * @DMA_SLAVE_CONFIG: this command is only implemented by DMA controllers | ||
| 120 | * that need to runtime reconfigure the slave channels (as opposed to passing | ||
| 121 | * configuration data in statically from the platform). An additional | ||
| 122 | * argument of struct dma_slave_config must be passed in with this | ||
| 123 | * command. | ||
| 124 | * @FSLDMA_EXTERNAL_START: this command will put the Freescale DMA controller | ||
| 125 | * into external start mode. | ||
| 117 | */ | 126 | */ |
| 118 | enum dma_ctrl_cmd { | 127 | enum dma_ctrl_cmd { |
| 119 | DMA_TERMINATE_ALL, | 128 | DMA_TERMINATE_ALL, |
| 120 | DMA_PAUSE, | 129 | DMA_PAUSE, |
| 121 | DMA_RESUME, | 130 | DMA_RESUME, |
| 131 | DMA_SLAVE_CONFIG, | ||
| 132 | FSLDMA_EXTERNAL_START, | ||
| 122 | }; | 133 | }; |
| 123 | 134 | ||
| 124 | /** | 135 | /** |
| @@ -199,6 +210,71 @@ struct dma_chan_dev { | |||
| 199 | atomic_t *idr_ref; | 210 | atomic_t *idr_ref; |
| 200 | }; | 211 | }; |
| 201 | 212 | ||
| 213 | /** | ||
| 214 | * enum dma_slave_buswidth - defines bus with of the DMA slave | ||
| 215 | * device, source or target buses | ||
| 216 | */ | ||
| 217 | enum dma_slave_buswidth { | ||
| 218 | DMA_SLAVE_BUSWIDTH_UNDEFINED = 0, | ||
| 219 | DMA_SLAVE_BUSWIDTH_1_BYTE = 1, | ||
| 220 | DMA_SLAVE_BUSWIDTH_2_BYTES = 2, | ||
| 221 | DMA_SLAVE_BUSWIDTH_4_BYTES = 4, | ||
| 222 | DMA_SLAVE_BUSWIDTH_8_BYTES = 8, | ||
| 223 | }; | ||
| 224 | |||
| 225 | /** | ||
| 226 | * struct dma_slave_config - dma slave channel runtime config | ||
| 227 | * @direction: whether the data shall go in or out on this slave | ||
| 228 | * channel, right now. DMA_TO_DEVICE and DMA_FROM_DEVICE are | ||
| 229 | * legal values, DMA_BIDIRECTIONAL is not acceptable since we | ||
| 230 | * need to differentiate source and target addresses. | ||
| 231 | * @src_addr: this is the physical address where DMA slave data | ||
| 232 | * should be read (RX), if the source is memory this argument is | ||
| 233 | * ignored. | ||
| 234 | * @dst_addr: this is the physical address where DMA slave data | ||
| 235 | * should be written (TX), if the source is memory this argument | ||
| 236 | * is ignored. | ||
| 237 | * @src_addr_width: this is the width in bytes of the source (RX) | ||
| 238 | * register where DMA data shall be read. If the source | ||
| 239 | * is memory this may be ignored depending on architecture. | ||
| 240 | * Legal values: 1, 2, 4, 8. | ||
| 241 | * @dst_addr_width: same as src_addr_width but for destination | ||
| 242 | * target (TX) mutatis mutandis. | ||
| 243 | * @src_maxburst: the maximum number of words (note: words, as in | ||
| 244 | * units of the src_addr_width member, not bytes) that can be sent | ||
| 245 | * in one burst to the device. Typically something like half the | ||
| 246 | * FIFO depth on I/O peripherals so you don't overflow it. This | ||
| 247 | * may or may not be applicable on memory sources. | ||
| 248 | * @dst_maxburst: same as src_maxburst but for destination target | ||
| 249 | * mutatis mutandis. | ||
| 250 | * | ||
| 251 | * This struct is passed in as configuration data to a DMA engine | ||
| 252 | * in order to set up a certain channel for DMA transport at runtime. | ||
| 253 | * The DMA device/engine has to provide support for an additional | ||
| 254 | * command in the channel config interface, DMA_SLAVE_CONFIG | ||
| 255 | * and this struct will then be passed in as an argument to the | ||
| 256 | * DMA engine device_control() function. | ||
| 257 | * | ||
| 258 | * The rationale for adding configuration information to this struct | ||
| 259 | * is as follows: if it is likely that most DMA slave controllers in | ||
| 260 | * the world will support the configuration option, then make it | ||
| 261 | * generic. If not: if it is fixed so that it be sent in static from | ||
| 262 | * the platform data, then prefer to do that. Else, if it is neither | ||
| 263 | * fixed at runtime, nor generic enough (such as bus mastership on | ||
| 264 | * some CPU family and whatnot) then create a custom slave config | ||
| 265 | * struct and pass that, then make this config a member of that | ||
| 266 | * struct, if applicable. | ||
| 267 | */ | ||
| 268 | struct dma_slave_config { | ||
| 269 | enum dma_data_direction direction; | ||
| 270 | dma_addr_t src_addr; | ||
| 271 | dma_addr_t dst_addr; | ||
| 272 | enum dma_slave_buswidth src_addr_width; | ||
| 273 | enum dma_slave_buswidth dst_addr_width; | ||
| 274 | u32 src_maxburst; | ||
| 275 | u32 dst_maxburst; | ||
| 276 | }; | ||
| 277 | |||
| 202 | static inline const char *dma_chan_name(struct dma_chan *chan) | 278 | static inline const char *dma_chan_name(struct dma_chan *chan) |
| 203 | { | 279 | { |
| 204 | return dev_name(&chan->dev->device); | 280 | return dev_name(&chan->dev->device); |
| @@ -245,14 +321,14 @@ struct dma_async_tx_descriptor { | |||
| 245 | dma_cookie_t (*tx_submit)(struct dma_async_tx_descriptor *tx); | 321 | dma_cookie_t (*tx_submit)(struct dma_async_tx_descriptor *tx); |
| 246 | dma_async_tx_callback callback; | 322 | dma_async_tx_callback callback; |
| 247 | void *callback_param; | 323 | void *callback_param; |
| 248 | #ifndef CONFIG_ASYNC_TX_DISABLE_CHANNEL_SWITCH | 324 | #ifdef CONFIG_ASYNC_TX_ENABLE_CHANNEL_SWITCH |
| 249 | struct dma_async_tx_descriptor *next; | 325 | struct dma_async_tx_descriptor *next; |
| 250 | struct dma_async_tx_descriptor *parent; | 326 | struct dma_async_tx_descriptor *parent; |
| 251 | spinlock_t lock; | 327 | spinlock_t lock; |
| 252 | #endif | 328 | #endif |
| 253 | }; | 329 | }; |
| 254 | 330 | ||
| 255 | #ifdef CONFIG_ASYNC_TX_DISABLE_CHANNEL_SWITCH | 331 | #ifndef CONFIG_ASYNC_TX_ENABLE_CHANNEL_SWITCH |
| 256 | static inline void txd_lock(struct dma_async_tx_descriptor *txd) | 332 | static inline void txd_lock(struct dma_async_tx_descriptor *txd) |
| 257 | { | 333 | { |
| 258 | } | 334 | } |
| @@ -351,6 +427,9 @@ struct dma_tx_state { | |||
| 351 | * @device_prep_dma_memset: prepares a memset operation | 427 | * @device_prep_dma_memset: prepares a memset operation |
| 352 | * @device_prep_dma_interrupt: prepares an end of chain interrupt operation | 428 | * @device_prep_dma_interrupt: prepares an end of chain interrupt operation |
| 353 | * @device_prep_slave_sg: prepares a slave dma operation | 429 | * @device_prep_slave_sg: prepares a slave dma operation |
| 430 | * @device_prep_dma_cyclic: prepare a cyclic dma operation suitable for audio. | ||
| 431 | * The function takes a buffer of size buf_len. The callback function will | ||
| 432 | * be called after period_len bytes have been transferred. | ||
| 354 | * @device_control: manipulate all pending operations on a channel, returns | 433 | * @device_control: manipulate all pending operations on a channel, returns |
| 355 | * zero or error code | 434 | * zero or error code |
| 356 | * @device_tx_status: poll for transaction completion, the optional | 435 | * @device_tx_status: poll for transaction completion, the optional |
| @@ -402,11 +481,19 @@ struct dma_device { | |||
| 402 | unsigned long flags); | 481 | unsigned long flags); |
| 403 | struct dma_async_tx_descriptor *(*device_prep_dma_interrupt)( | 482 | struct dma_async_tx_descriptor *(*device_prep_dma_interrupt)( |
| 404 | struct dma_chan *chan, unsigned long flags); | 483 | struct dma_chan *chan, unsigned long flags); |
| 484 | struct dma_async_tx_descriptor *(*device_prep_dma_sg)( | ||
| 485 | struct dma_chan *chan, | ||
| 486 | struct scatterlist *dst_sg, unsigned int dst_nents, | ||
| 487 | struct scatterlist *src_sg, unsigned int src_nents, | ||
| 488 | unsigned long flags); | ||
| 405 | 489 | ||
| 406 | struct dma_async_tx_descriptor *(*device_prep_slave_sg)( | 490 | struct dma_async_tx_descriptor *(*device_prep_slave_sg)( |
| 407 | struct dma_chan *chan, struct scatterlist *sgl, | 491 | struct dma_chan *chan, struct scatterlist *sgl, |
| 408 | unsigned int sg_len, enum dma_data_direction direction, | 492 | unsigned int sg_len, enum dma_data_direction direction, |
| 409 | unsigned long flags); | 493 | unsigned long flags); |
| 494 | struct dma_async_tx_descriptor *(*device_prep_dma_cyclic)( | ||
| 495 | struct dma_chan *chan, dma_addr_t buf_addr, size_t buf_len, | ||
| 496 | size_t period_len, enum dma_data_direction direction); | ||
| 410 | int (*device_control)(struct dma_chan *chan, enum dma_ctrl_cmd cmd, | 497 | int (*device_control)(struct dma_chan *chan, enum dma_ctrl_cmd cmd, |
| 411 | unsigned long arg); | 498 | unsigned long arg); |
| 412 | 499 | ||
| @@ -416,6 +503,40 @@ struct dma_device { | |||
| 416 | void (*device_issue_pending)(struct dma_chan *chan); | 503 | void (*device_issue_pending)(struct dma_chan *chan); |
| 417 | }; | 504 | }; |
| 418 | 505 | ||
| 506 | static inline int dmaengine_device_control(struct dma_chan *chan, | ||
| 507 | enum dma_ctrl_cmd cmd, | ||
| 508 | unsigned long arg) | ||
| 509 | { | ||
| 510 | return chan->device->device_control(chan, cmd, arg); | ||
| 511 | } | ||
| 512 | |||
| 513 | static inline int dmaengine_slave_config(struct dma_chan *chan, | ||
| 514 | struct dma_slave_config *config) | ||
| 515 | { | ||
| 516 | return dmaengine_device_control(chan, DMA_SLAVE_CONFIG, | ||
| 517 | (unsigned long)config); | ||
| 518 | } | ||
| 519 | |||
| 520 | static inline int dmaengine_terminate_all(struct dma_chan *chan) | ||
| 521 | { | ||
| 522 | return dmaengine_device_control(chan, DMA_TERMINATE_ALL, 0); | ||
| 523 | } | ||
| 524 | |||
| 525 | static inline int dmaengine_pause(struct dma_chan *chan) | ||
| 526 | { | ||
| 527 | return dmaengine_device_control(chan, DMA_PAUSE, 0); | ||
| 528 | } | ||
| 529 | |||
| 530 | static inline int dmaengine_resume(struct dma_chan *chan) | ||
| 531 | { | ||
| 532 | return dmaengine_device_control(chan, DMA_RESUME, 0); | ||
| 533 | } | ||
| 534 | |||
| 535 | static inline int dmaengine_submit(struct dma_async_tx_descriptor *desc) | ||
| 536 | { | ||
| 537 | return desc->tx_submit(desc); | ||
| 538 | } | ||
| 539 | |||
| 419 | static inline bool dmaengine_check_align(u8 align, size_t off1, size_t off2, size_t len) | 540 | static inline bool dmaengine_check_align(u8 align, size_t off1, size_t off2, size_t len) |
| 420 | { | 541 | { |
| 421 | size_t mask; | 542 | size_t mask; |
| @@ -477,7 +598,7 @@ static inline bool dma_dev_has_pq_continue(struct dma_device *dma) | |||
| 477 | return (dma->max_pq & DMA_HAS_PQ_CONTINUE) == DMA_HAS_PQ_CONTINUE; | 598 | return (dma->max_pq & DMA_HAS_PQ_CONTINUE) == DMA_HAS_PQ_CONTINUE; |
| 478 | } | 599 | } |
| 479 | 600 | ||
| 480 | static unsigned short dma_dev_to_maxpq(struct dma_device *dma) | 601 | static inline unsigned short dma_dev_to_maxpq(struct dma_device *dma) |
| 481 | { | 602 | { |
| 482 | return dma->max_pq & ~DMA_HAS_PQ_CONTINUE; | 603 | return dma->max_pq & ~DMA_HAS_PQ_CONTINUE; |
| 483 | } | 604 | } |
| @@ -535,11 +656,11 @@ static inline void net_dmaengine_put(void) | |||
| 535 | #ifdef CONFIG_ASYNC_TX_DMA | 656 | #ifdef CONFIG_ASYNC_TX_DMA |
| 536 | #define async_dmaengine_get() dmaengine_get() | 657 | #define async_dmaengine_get() dmaengine_get() |
| 537 | #define async_dmaengine_put() dmaengine_put() | 658 | #define async_dmaengine_put() dmaengine_put() |
| 538 | #ifdef CONFIG_ASYNC_TX_DISABLE_CHANNEL_SWITCH | 659 | #ifndef CONFIG_ASYNC_TX_ENABLE_CHANNEL_SWITCH |
| 539 | #define async_dma_find_channel(type) dma_find_channel(DMA_ASYNC_TX) | 660 | #define async_dma_find_channel(type) dma_find_channel(DMA_ASYNC_TX) |
| 540 | #else | 661 | #else |
| 541 | #define async_dma_find_channel(type) dma_find_channel(type) | 662 | #define async_dma_find_channel(type) dma_find_channel(type) |
| 542 | #endif /* CONFIG_ASYNC_TX_DISABLE_CHANNEL_SWITCH */ | 663 | #endif /* CONFIG_ASYNC_TX_ENABLE_CHANNEL_SWITCH */ |
| 543 | #else | 664 | #else |
| 544 | static inline void async_dmaengine_get(void) | 665 | static inline void async_dmaengine_get(void) |
| 545 | { | 666 | { |
diff --git a/include/linux/dmar.h b/include/linux/dmar.h index d7cecc90ed34..a7d9dc21391d 100644 --- a/include/linux/dmar.h +++ b/include/linux/dmar.h | |||
| @@ -57,15 +57,15 @@ extern int dmar_table_init(void); | |||
| 57 | extern int dmar_dev_scope_init(void); | 57 | extern int dmar_dev_scope_init(void); |
| 58 | 58 | ||
| 59 | /* Intel IOMMU detection */ | 59 | /* Intel IOMMU detection */ |
| 60 | extern void detect_intel_iommu(void); | 60 | extern int detect_intel_iommu(void); |
| 61 | extern int enable_drhd_fault_handling(void); | 61 | extern int enable_drhd_fault_handling(void); |
| 62 | 62 | ||
| 63 | extern int parse_ioapics_under_ir(void); | 63 | extern int parse_ioapics_under_ir(void); |
| 64 | extern int alloc_iommu(struct dmar_drhd_unit *); | 64 | extern int alloc_iommu(struct dmar_drhd_unit *); |
| 65 | #else | 65 | #else |
| 66 | static inline void detect_intel_iommu(void) | 66 | static inline int detect_intel_iommu(void) |
| 67 | { | 67 | { |
| 68 | return; | 68 | return -ENODEV; |
| 69 | } | 69 | } |
| 70 | 70 | ||
| 71 | static inline int dmar_table_init(void) | 71 | static inline int dmar_table_init(void) |
| @@ -106,6 +106,7 @@ struct irte { | |||
| 106 | __u64 high; | 106 | __u64 high; |
| 107 | }; | 107 | }; |
| 108 | }; | 108 | }; |
| 109 | |||
| 109 | #ifdef CONFIG_INTR_REMAP | 110 | #ifdef CONFIG_INTR_REMAP |
| 110 | extern int intr_remapping_enabled; | 111 | extern int intr_remapping_enabled; |
| 111 | extern int intr_remapping_supported(void); | 112 | extern int intr_remapping_supported(void); |
| @@ -119,11 +120,8 @@ extern int alloc_irte(struct intel_iommu *iommu, int irq, u16 count); | |||
| 119 | extern int set_irte_irq(int irq, struct intel_iommu *iommu, u16 index, | 120 | extern int set_irte_irq(int irq, struct intel_iommu *iommu, u16 index, |
| 120 | u16 sub_handle); | 121 | u16 sub_handle); |
| 121 | extern int map_irq_to_irte_handle(int irq, u16 *sub_handle); | 122 | extern int map_irq_to_irte_handle(int irq, u16 *sub_handle); |
| 122 | extern int clear_irte_irq(int irq, struct intel_iommu *iommu, u16 index); | ||
| 123 | extern int flush_irte(int irq); | ||
| 124 | extern int free_irte(int irq); | 123 | extern int free_irte(int irq); |
| 125 | 124 | ||
| 126 | extern int irq_remapped(int irq); | ||
| 127 | extern struct intel_iommu *map_dev_to_ir(struct pci_dev *dev); | 125 | extern struct intel_iommu *map_dev_to_ir(struct pci_dev *dev); |
| 128 | extern struct intel_iommu *map_ioapic_to_ir(int apic); | 126 | extern struct intel_iommu *map_ioapic_to_ir(int apic); |
| 129 | extern struct intel_iommu *map_hpet_to_ir(u8 id); | 127 | extern struct intel_iommu *map_hpet_to_ir(u8 id); |
| @@ -177,7 +175,6 @@ static inline int set_msi_sid(struct irte *irte, struct pci_dev *dev) | |||
| 177 | return 0; | 175 | return 0; |
| 178 | } | 176 | } |
| 179 | 177 | ||
| 180 | #define irq_remapped(irq) (0) | ||
| 181 | #define enable_intr_remapping(mode) (-1) | 178 | #define enable_intr_remapping(mode) (-1) |
| 182 | #define disable_intr_remapping() (0) | 179 | #define disable_intr_remapping() (0) |
| 183 | #define reenable_intr_remapping(mode) (0) | 180 | #define reenable_intr_remapping(mode) (0) |
| @@ -187,8 +184,9 @@ static inline int set_msi_sid(struct irte *irte, struct pci_dev *dev) | |||
| 187 | /* Can't use the common MSI interrupt functions | 184 | /* Can't use the common MSI interrupt functions |
| 188 | * since DMAR is not a pci device | 185 | * since DMAR is not a pci device |
| 189 | */ | 186 | */ |
| 190 | extern void dmar_msi_unmask(unsigned int irq); | 187 | struct irq_data; |
| 191 | extern void dmar_msi_mask(unsigned int irq); | 188 | extern void dmar_msi_unmask(struct irq_data *data); |
| 189 | extern void dmar_msi_mask(struct irq_data *data); | ||
| 192 | extern void dmar_msi_read(int irq, struct msi_msg *msg); | 190 | extern void dmar_msi_read(int irq, struct msi_msg *msg); |
| 193 | extern void dmar_msi_write(int irq, struct msi_msg *msg); | 191 | extern void dmar_msi_write(int irq, struct msi_msg *msg); |
| 194 | extern int dmar_set_interrupt(struct intel_iommu *iommu); | 192 | extern int dmar_set_interrupt(struct intel_iommu *iommu); |
diff --git a/include/linux/dmi.h b/include/linux/dmi.h index a8a3e1ac281d..90e087f8d951 100644 --- a/include/linux/dmi.h +++ b/include/linux/dmi.h | |||
| @@ -20,6 +20,7 @@ enum dmi_device_type { | |||
| 20 | DMI_DEV_TYPE_SAS, | 20 | DMI_DEV_TYPE_SAS, |
| 21 | DMI_DEV_TYPE_IPMI = -1, | 21 | DMI_DEV_TYPE_IPMI = -1, |
| 22 | DMI_DEV_TYPE_OEM_STRING = -2, | 22 | DMI_DEV_TYPE_OEM_STRING = -2, |
| 23 | DMI_DEV_TYPE_DEV_ONBOARD = -3, | ||
| 23 | }; | 24 | }; |
| 24 | 25 | ||
| 25 | struct dmi_header { | 26 | struct dmi_header { |
| @@ -37,6 +38,14 @@ struct dmi_device { | |||
| 37 | 38 | ||
| 38 | #ifdef CONFIG_DMI | 39 | #ifdef CONFIG_DMI |
| 39 | 40 | ||
| 41 | struct dmi_dev_onboard { | ||
| 42 | struct dmi_device dev; | ||
| 43 | int instance; | ||
| 44 | int segment; | ||
| 45 | int bus; | ||
| 46 | int devfn; | ||
| 47 | }; | ||
| 48 | |||
| 40 | extern int dmi_check_system(const struct dmi_system_id *list); | 49 | extern int dmi_check_system(const struct dmi_system_id *list); |
| 41 | const struct dmi_system_id *dmi_first_match(const struct dmi_system_id *list); | 50 | const struct dmi_system_id *dmi_first_match(const struct dmi_system_id *list); |
| 42 | extern const char * dmi_get_system_info(int field); | 51 | extern const char * dmi_get_system_info(int field); |
diff --git a/include/linux/dnotify.h b/include/linux/dnotify.h index ecc06286226d..3290555a52ee 100644 --- a/include/linux/dnotify.h +++ b/include/linux/dnotify.h | |||
| @@ -28,6 +28,7 @@ struct dnotify_struct { | |||
| 28 | FS_CREATE | FS_DN_RENAME |\ | 28 | FS_CREATE | FS_DN_RENAME |\ |
| 29 | FS_MOVED_FROM | FS_MOVED_TO) | 29 | FS_MOVED_FROM | FS_MOVED_TO) |
| 30 | 30 | ||
| 31 | extern int dir_notify_enable; | ||
| 31 | extern void dnotify_flush(struct file *, fl_owner_t); | 32 | extern void dnotify_flush(struct file *, fl_owner_t); |
| 32 | extern int fcntl_dirnotify(int, struct file *, unsigned long); | 33 | extern int fcntl_dirnotify(int, struct file *, unsigned long); |
| 33 | 34 | ||
diff --git a/include/linux/dns_resolver.h b/include/linux/dns_resolver.h new file mode 100644 index 000000000000..cc92268af89a --- /dev/null +++ b/include/linux/dns_resolver.h | |||
| @@ -0,0 +1,34 @@ | |||
| 1 | /* | ||
| 2 | * DNS Resolver upcall management for CIFS DFS and AFS | ||
| 3 | * Handles host name to IP address resolution and DNS query for AFSDB RR. | ||
| 4 | * | ||
| 5 | * Copyright (c) International Business Machines Corp., 2008 | ||
| 6 | * Author(s): Steve French (sfrench@us.ibm.com) | ||
| 7 | * Wang Lei (wang840925@gmail.com) | ||
| 8 | * | ||
| 9 | * This library is free software; you can redistribute it and/or modify | ||
| 10 | * it under the terms of the GNU Lesser General Public License as published | ||
| 11 | * by the Free Software Foundation; either version 2.1 of the License, or | ||
| 12 | * (at your option) any later version. | ||
| 13 | * | ||
| 14 | * This library is distributed in the hope that it will be useful, | ||
| 15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See | ||
| 17 | * the GNU Lesser General Public License for more details. | ||
| 18 | * | ||
| 19 | * You should have received a copy of the GNU Lesser General Public License | ||
| 20 | * along with this library; if not, write to the Free Software | ||
| 21 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 22 | */ | ||
| 23 | |||
| 24 | #ifndef _LINUX_DNS_RESOLVER_H | ||
| 25 | #define _LINUX_DNS_RESOLVER_H | ||
| 26 | |||
| 27 | #ifdef __KERNEL__ | ||
| 28 | |||
| 29 | extern int dns_query(const char *type, const char *name, size_t namelen, | ||
| 30 | const char *options, char **_result, time_t *_expiry); | ||
| 31 | |||
| 32 | #endif /* KERNEL */ | ||
| 33 | |||
| 34 | #endif /* _LINUX_DNS_RESOLVER_H */ | ||
diff --git a/include/linux/dqblk_xfs.h b/include/linux/dqblk_xfs.h index 4389ae72024e..86552807aed9 100644 --- a/include/linux/dqblk_xfs.h +++ b/include/linux/dqblk_xfs.h | |||
| @@ -49,7 +49,7 @@ | |||
| 49 | #define FS_DQUOT_VERSION 1 /* fs_disk_quota.d_version */ | 49 | #define FS_DQUOT_VERSION 1 /* fs_disk_quota.d_version */ |
| 50 | typedef struct fs_disk_quota { | 50 | typedef struct fs_disk_quota { |
| 51 | __s8 d_version; /* version of this structure */ | 51 | __s8 d_version; /* version of this structure */ |
| 52 | __s8 d_flags; /* XFS_{USER,PROJ,GROUP}_QUOTA */ | 52 | __s8 d_flags; /* FS_{USER,PROJ,GROUP}_QUOTA */ |
| 53 | __u16 d_fieldmask; /* field specifier */ | 53 | __u16 d_fieldmask; /* field specifier */ |
| 54 | __u32 d_id; /* user, project, or group ID */ | 54 | __u32 d_id; /* user, project, or group ID */ |
| 55 | __u64 d_blk_hardlimit;/* absolute limit on disk blks */ | 55 | __u64 d_blk_hardlimit;/* absolute limit on disk blks */ |
| @@ -119,18 +119,18 @@ typedef struct fs_disk_quota { | |||
| 119 | #define FS_DQ_ACCT_MASK (FS_DQ_BCOUNT | FS_DQ_ICOUNT | FS_DQ_RTBCOUNT) | 119 | #define FS_DQ_ACCT_MASK (FS_DQ_BCOUNT | FS_DQ_ICOUNT | FS_DQ_RTBCOUNT) |
| 120 | 120 | ||
| 121 | /* | 121 | /* |
| 122 | * Various flags related to quotactl(2). Only relevant to XFS filesystems. | 122 | * Various flags related to quotactl(2). |
| 123 | */ | 123 | */ |
| 124 | #define XFS_QUOTA_UDQ_ACCT (1<<0) /* user quota accounting */ | 124 | #define FS_QUOTA_UDQ_ACCT (1<<0) /* user quota accounting */ |
| 125 | #define XFS_QUOTA_UDQ_ENFD (1<<1) /* user quota limits enforcement */ | 125 | #define FS_QUOTA_UDQ_ENFD (1<<1) /* user quota limits enforcement */ |
| 126 | #define XFS_QUOTA_GDQ_ACCT (1<<2) /* group quota accounting */ | 126 | #define FS_QUOTA_GDQ_ACCT (1<<2) /* group quota accounting */ |
| 127 | #define XFS_QUOTA_GDQ_ENFD (1<<3) /* group quota limits enforcement */ | 127 | #define FS_QUOTA_GDQ_ENFD (1<<3) /* group quota limits enforcement */ |
| 128 | #define XFS_QUOTA_PDQ_ACCT (1<<4) /* project quota accounting */ | 128 | #define FS_QUOTA_PDQ_ACCT (1<<4) /* project quota accounting */ |
| 129 | #define XFS_QUOTA_PDQ_ENFD (1<<5) /* project quota limits enforcement */ | 129 | #define FS_QUOTA_PDQ_ENFD (1<<5) /* project quota limits enforcement */ |
| 130 | 130 | ||
| 131 | #define XFS_USER_QUOTA (1<<0) /* user quota type */ | 131 | #define FS_USER_QUOTA (1<<0) /* user quota type */ |
| 132 | #define XFS_PROJ_QUOTA (1<<1) /* project quota type */ | 132 | #define FS_PROJ_QUOTA (1<<1) /* project quota type */ |
| 133 | #define XFS_GROUP_QUOTA (1<<2) /* group quota type */ | 133 | #define FS_GROUP_QUOTA (1<<2) /* group quota type */ |
| 134 | 134 | ||
| 135 | /* | 135 | /* |
| 136 | * fs_quota_stat is the struct returned in Q_XGETQSTAT for a given file system. | 136 | * fs_quota_stat is the struct returned in Q_XGETQSTAT for a given file system. |
| @@ -151,7 +151,7 @@ typedef struct fs_qfilestat { | |||
| 151 | 151 | ||
| 152 | typedef struct fs_quota_stat { | 152 | typedef struct fs_quota_stat { |
| 153 | __s8 qs_version; /* version number for future changes */ | 153 | __s8 qs_version; /* version number for future changes */ |
| 154 | __u16 qs_flags; /* XFS_QUOTA_{U,P,G}DQ_{ACCT,ENFD} */ | 154 | __u16 qs_flags; /* FS_QUOTA_{U,P,G}DQ_{ACCT,ENFD} */ |
| 155 | __s8 qs_pad; /* unused */ | 155 | __s8 qs_pad; /* unused */ |
| 156 | fs_qfilestat_t qs_uquota; /* user quota storage information */ | 156 | fs_qfilestat_t qs_uquota; /* user quota storage information */ |
| 157 | fs_qfilestat_t qs_gquota; /* group quota storage information */ | 157 | fs_qfilestat_t qs_gquota; /* group quota storage information */ |
diff --git a/include/linux/drbd.h b/include/linux/drbd.h index b8d2516668aa..9b2a0158f399 100644 --- a/include/linux/drbd.h +++ b/include/linux/drbd.h | |||
| @@ -53,10 +53,10 @@ | |||
| 53 | 53 | ||
| 54 | 54 | ||
| 55 | extern const char *drbd_buildtag(void); | 55 | extern const char *drbd_buildtag(void); |
| 56 | #define REL_VERSION "8.3.8" | 56 | #define REL_VERSION "8.3.9rc2" |
| 57 | #define API_VERSION 88 | 57 | #define API_VERSION 88 |
| 58 | #define PRO_VERSION_MIN 86 | 58 | #define PRO_VERSION_MIN 86 |
| 59 | #define PRO_VERSION_MAX 94 | 59 | #define PRO_VERSION_MAX 95 |
| 60 | 60 | ||
| 61 | 61 | ||
| 62 | enum drbd_io_error_p { | 62 | enum drbd_io_error_p { |
| @@ -91,6 +91,11 @@ enum drbd_after_sb_p { | |||
| 91 | ASB_VIOLENTLY | 91 | ASB_VIOLENTLY |
| 92 | }; | 92 | }; |
| 93 | 93 | ||
| 94 | enum drbd_on_no_data { | ||
| 95 | OND_IO_ERROR, | ||
| 96 | OND_SUSPEND_IO | ||
| 97 | }; | ||
| 98 | |||
| 94 | /* KEEP the order, do not delete or insert. Only append. */ | 99 | /* KEEP the order, do not delete or insert. Only append. */ |
| 95 | enum drbd_ret_codes { | 100 | enum drbd_ret_codes { |
| 96 | ERR_CODE_BASE = 100, | 101 | ERR_CODE_BASE = 100, |
| @@ -140,6 +145,7 @@ enum drbd_ret_codes { | |||
| 140 | ERR_CONNECTED = 151, /* DRBD 8.3 only */ | 145 | ERR_CONNECTED = 151, /* DRBD 8.3 only */ |
| 141 | ERR_PERM = 152, | 146 | ERR_PERM = 152, |
| 142 | ERR_NEED_APV_93 = 153, | 147 | ERR_NEED_APV_93 = 153, |
| 148 | ERR_STONITH_AND_PROT_A = 154, | ||
| 143 | 149 | ||
| 144 | /* insert new ones above this line */ | 150 | /* insert new ones above this line */ |
| 145 | AFTER_LAST_ERR_CODE | 151 | AFTER_LAST_ERR_CODE |
| @@ -226,13 +232,17 @@ union drbd_state { | |||
| 226 | unsigned conn:5 ; /* 17/32 cstates */ | 232 | unsigned conn:5 ; /* 17/32 cstates */ |
| 227 | unsigned disk:4 ; /* 8/16 from D_DISKLESS to D_UP_TO_DATE */ | 233 | unsigned disk:4 ; /* 8/16 from D_DISKLESS to D_UP_TO_DATE */ |
| 228 | unsigned pdsk:4 ; /* 8/16 from D_DISKLESS to D_UP_TO_DATE */ | 234 | unsigned pdsk:4 ; /* 8/16 from D_DISKLESS to D_UP_TO_DATE */ |
| 229 | unsigned susp:1 ; /* 2/2 IO suspended no/yes */ | 235 | unsigned susp:1 ; /* 2/2 IO suspended no/yes (by user) */ |
| 230 | unsigned aftr_isp:1 ; /* isp .. imposed sync pause */ | 236 | unsigned aftr_isp:1 ; /* isp .. imposed sync pause */ |
| 231 | unsigned peer_isp:1 ; | 237 | unsigned peer_isp:1 ; |
| 232 | unsigned user_isp:1 ; | 238 | unsigned user_isp:1 ; |
| 233 | unsigned _pad:11; /* 0 unused */ | 239 | unsigned susp_nod:1 ; /* IO suspended because no data */ |
| 240 | unsigned susp_fen:1 ; /* IO suspended because fence peer handler runs*/ | ||
| 241 | unsigned _pad:9; /* 0 unused */ | ||
| 234 | #elif defined(__BIG_ENDIAN_BITFIELD) | 242 | #elif defined(__BIG_ENDIAN_BITFIELD) |
| 235 | unsigned _pad:11; /* 0 unused */ | 243 | unsigned _pad:9; |
| 244 | unsigned susp_fen:1 ; | ||
| 245 | unsigned susp_nod:1 ; | ||
| 236 | unsigned user_isp:1 ; | 246 | unsigned user_isp:1 ; |
| 237 | unsigned peer_isp:1 ; | 247 | unsigned peer_isp:1 ; |
| 238 | unsigned aftr_isp:1 ; /* isp .. imposed sync pause */ | 248 | unsigned aftr_isp:1 ; /* isp .. imposed sync pause */ |
| @@ -312,6 +322,8 @@ enum drbd_timeout_flag { | |||
| 312 | 322 | ||
| 313 | #define DRBD_MAGIC 0x83740267 | 323 | #define DRBD_MAGIC 0x83740267 |
| 314 | #define BE_DRBD_MAGIC __constant_cpu_to_be32(DRBD_MAGIC) | 324 | #define BE_DRBD_MAGIC __constant_cpu_to_be32(DRBD_MAGIC) |
| 325 | #define DRBD_MAGIC_BIG 0x835a | ||
| 326 | #define BE_DRBD_MAGIC_BIG __constant_cpu_to_be16(DRBD_MAGIC_BIG) | ||
| 315 | 327 | ||
| 316 | /* these are of type "int" */ | 328 | /* these are of type "int" */ |
| 317 | #define DRBD_MD_INDEX_INTERNAL -1 | 329 | #define DRBD_MD_INDEX_INTERNAL -1 |
diff --git a/include/linux/drbd_limits.h b/include/linux/drbd_limits.h index 440b42e38e89..4ac33f34b77e 100644 --- a/include/linux/drbd_limits.h +++ b/include/linux/drbd_limits.h | |||
| @@ -128,26 +128,31 @@ | |||
| 128 | #define DRBD_AFTER_SB_1P_DEF ASB_DISCONNECT | 128 | #define DRBD_AFTER_SB_1P_DEF ASB_DISCONNECT |
| 129 | #define DRBD_AFTER_SB_2P_DEF ASB_DISCONNECT | 129 | #define DRBD_AFTER_SB_2P_DEF ASB_DISCONNECT |
| 130 | #define DRBD_RR_CONFLICT_DEF ASB_DISCONNECT | 130 | #define DRBD_RR_CONFLICT_DEF ASB_DISCONNECT |
| 131 | #define DRBD_ON_NO_DATA_DEF OND_IO_ERROR | ||
| 131 | 132 | ||
| 132 | #define DRBD_MAX_BIO_BVECS_MIN 0 | 133 | #define DRBD_MAX_BIO_BVECS_MIN 0 |
| 133 | #define DRBD_MAX_BIO_BVECS_MAX 128 | 134 | #define DRBD_MAX_BIO_BVECS_MAX 128 |
| 134 | #define DRBD_MAX_BIO_BVECS_DEF 0 | 135 | #define DRBD_MAX_BIO_BVECS_DEF 0 |
| 135 | 136 | ||
| 136 | #define DRBD_DP_VOLUME_MIN 4 | 137 | #define DRBD_C_PLAN_AHEAD_MIN 0 |
| 137 | #define DRBD_DP_VOLUME_MAX 1048576 | 138 | #define DRBD_C_PLAN_AHEAD_MAX 300 |
| 138 | #define DRBD_DP_VOLUME_DEF 16384 | 139 | #define DRBD_C_PLAN_AHEAD_DEF 0 /* RS rate controller disabled by default */ |
| 139 | 140 | ||
| 140 | #define DRBD_DP_INTERVAL_MIN 1 | 141 | #define DRBD_C_DELAY_TARGET_MIN 1 |
| 141 | #define DRBD_DP_INTERVAL_MAX 600 | 142 | #define DRBD_C_DELAY_TARGET_MAX 100 |
| 142 | #define DRBD_DP_INTERVAL_DEF 5 | 143 | #define DRBD_C_DELAY_TARGET_DEF 10 |
| 143 | 144 | ||
| 144 | #define DRBD_RS_THROTTLE_TH_MIN 1 | 145 | #define DRBD_C_FILL_TARGET_MIN 0 |
| 145 | #define DRBD_RS_THROTTLE_TH_MAX 600 | 146 | #define DRBD_C_FILL_TARGET_MAX (1<<20) /* 500MByte in sec */ |
| 146 | #define DRBD_RS_THROTTLE_TH_DEF 20 | 147 | #define DRBD_C_FILL_TARGET_DEF 0 /* By default disabled -> controlled by delay_target */ |
| 147 | 148 | ||
| 148 | #define DRBD_RS_HOLD_OFF_TH_MIN 1 | 149 | #define DRBD_C_MAX_RATE_MIN 250 /* kByte/sec */ |
| 149 | #define DRBD_RS_HOLD_OFF_TH_MAX 6000 | 150 | #define DRBD_C_MAX_RATE_MAX (4 << 20) |
| 150 | #define DRBD_RS_HOLD_OFF_TH_DEF 100 | 151 | #define DRBD_C_MAX_RATE_DEF 102400 |
| 152 | |||
| 153 | #define DRBD_C_MIN_RATE_MIN 0 /* kByte/sec */ | ||
| 154 | #define DRBD_C_MIN_RATE_MAX (4 << 20) | ||
| 155 | #define DRBD_C_MIN_RATE_DEF 4096 | ||
| 151 | 156 | ||
| 152 | #undef RANGE | 157 | #undef RANGE |
| 153 | #endif | 158 | #endif |
diff --git a/include/linux/drbd_nl.h b/include/linux/drbd_nl.h index ce77a746fc9d..ade91107c9a5 100644 --- a/include/linux/drbd_nl.h +++ b/include/linux/drbd_nl.h | |||
| @@ -78,14 +78,21 @@ NL_PACKET(syncer_conf, 8, | |||
| 78 | NL_INTEGER( 30, T_MAY_IGNORE, rate) | 78 | NL_INTEGER( 30, T_MAY_IGNORE, rate) |
| 79 | NL_INTEGER( 31, T_MAY_IGNORE, after) | 79 | NL_INTEGER( 31, T_MAY_IGNORE, after) |
| 80 | NL_INTEGER( 32, T_MAY_IGNORE, al_extents) | 80 | NL_INTEGER( 32, T_MAY_IGNORE, al_extents) |
| 81 | NL_INTEGER( 71, T_MAY_IGNORE, dp_volume) | 81 | /* NL_INTEGER( 71, T_MAY_IGNORE, dp_volume) |
| 82 | NL_INTEGER( 72, T_MAY_IGNORE, dp_interval) | 82 | * NL_INTEGER( 72, T_MAY_IGNORE, dp_interval) |
| 83 | NL_INTEGER( 73, T_MAY_IGNORE, throttle_th) | 83 | * NL_INTEGER( 73, T_MAY_IGNORE, throttle_th) |
| 84 | NL_INTEGER( 74, T_MAY_IGNORE, hold_off_th) | 84 | * NL_INTEGER( 74, T_MAY_IGNORE, hold_off_th) |
| 85 | * feature will be reimplemented differently with 8.3.9 */ | ||
| 85 | NL_STRING( 52, T_MAY_IGNORE, verify_alg, SHARED_SECRET_MAX) | 86 | NL_STRING( 52, T_MAY_IGNORE, verify_alg, SHARED_SECRET_MAX) |
| 86 | NL_STRING( 51, T_MAY_IGNORE, cpu_mask, 32) | 87 | NL_STRING( 51, T_MAY_IGNORE, cpu_mask, 32) |
| 87 | NL_STRING( 64, T_MAY_IGNORE, csums_alg, SHARED_SECRET_MAX) | 88 | NL_STRING( 64, T_MAY_IGNORE, csums_alg, SHARED_SECRET_MAX) |
| 88 | NL_BIT( 65, T_MAY_IGNORE, use_rle) | 89 | NL_BIT( 65, T_MAY_IGNORE, use_rle) |
| 90 | NL_INTEGER( 75, T_MAY_IGNORE, on_no_data) | ||
| 91 | NL_INTEGER( 76, T_MAY_IGNORE, c_plan_ahead) | ||
| 92 | NL_INTEGER( 77, T_MAY_IGNORE, c_delay_target) | ||
| 93 | NL_INTEGER( 78, T_MAY_IGNORE, c_fill_target) | ||
| 94 | NL_INTEGER( 79, T_MAY_IGNORE, c_max_rate) | ||
| 95 | NL_INTEGER( 80, T_MAY_IGNORE, c_min_rate) | ||
| 89 | ) | 96 | ) |
| 90 | 97 | ||
| 91 | NL_PACKET(invalidate, 9, ) | 98 | NL_PACKET(invalidate, 9, ) |
diff --git a/include/linux/dvb/Kbuild b/include/linux/dvb/Kbuild index d97b3a51e227..f4dba8637f98 100644 --- a/include/linux/dvb/Kbuild +++ b/include/linux/dvb/Kbuild | |||
| @@ -1,9 +1,8 @@ | |||
| 1 | header-y += audio.h | ||
| 1 | header-y += ca.h | 2 | header-y += ca.h |
| 3 | header-y += dmx.h | ||
| 2 | header-y += frontend.h | 4 | header-y += frontend.h |
| 3 | header-y += net.h | 5 | header-y += net.h |
| 4 | header-y += osd.h | 6 | header-y += osd.h |
| 5 | header-y += version.h | 7 | header-y += version.h |
| 6 | 8 | header-y += video.h | |
| 7 | unifdef-y += audio.h | ||
| 8 | unifdef-y += dmx.h | ||
| 9 | unifdef-y += video.h | ||
diff --git a/include/linux/dvb/frontend.h b/include/linux/dvb/frontend.h index b6cb5425cde3..493a2bf85f62 100644 --- a/include/linux/dvb/frontend.h +++ b/include/linux/dvb/frontend.h | |||
| @@ -62,6 +62,7 @@ typedef enum fe_caps { | |||
| 62 | FE_CAN_8VSB = 0x200000, | 62 | FE_CAN_8VSB = 0x200000, |
| 63 | FE_CAN_16VSB = 0x400000, | 63 | FE_CAN_16VSB = 0x400000, |
| 64 | FE_HAS_EXTENDED_CAPS = 0x800000, /* We need more bitspace for newer APIs, indicate this. */ | 64 | FE_HAS_EXTENDED_CAPS = 0x800000, /* We need more bitspace for newer APIs, indicate this. */ |
| 65 | FE_CAN_TURBO_FEC = 0x8000000, /* frontend supports "turbo fec modulation" */ | ||
| 65 | FE_CAN_2G_MODULATION = 0x10000000, /* frontend supports "2nd generation modulation" (DVB-S2) */ | 66 | FE_CAN_2G_MODULATION = 0x10000000, /* frontend supports "2nd generation modulation" (DVB-S2) */ |
| 66 | FE_NEEDS_BENDING = 0x20000000, /* not supported anymore, don't use (frontend requires frequency bending) */ | 67 | FE_NEEDS_BENDING = 0x20000000, /* not supported anymore, don't use (frontend requires frequency bending) */ |
| 67 | FE_CAN_RECOVER = 0x40000000, /* frontend can recover from a cable unplug automatically */ | 68 | FE_CAN_RECOVER = 0x40000000, /* frontend can recover from a cable unplug automatically */ |
diff --git a/include/linux/dvb/version.h b/include/linux/dvb/version.h index 540b0583d9fb..5a7546c12688 100644 --- a/include/linux/dvb/version.h +++ b/include/linux/dvb/version.h | |||
| @@ -24,6 +24,6 @@ | |||
| 24 | #define _DVBVERSION_H_ | 24 | #define _DVBVERSION_H_ |
| 25 | 25 | ||
| 26 | #define DVB_API_VERSION 5 | 26 | #define DVB_API_VERSION 5 |
| 27 | #define DVB_API_VERSION_MINOR 1 | 27 | #define DVB_API_VERSION_MINOR 2 |
| 28 | 28 | ||
| 29 | #endif /*_DVBVERSION_H_*/ | 29 | #endif /*_DVBVERSION_H_*/ |
diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h index 52c0da4bdd18..a90b3892074a 100644 --- a/include/linux/dynamic_debug.h +++ b/include/linux/dynamic_debug.h | |||
| @@ -1,6 +1,8 @@ | |||
| 1 | #ifndef _DYNAMIC_DEBUG_H | 1 | #ifndef _DYNAMIC_DEBUG_H |
| 2 | #define _DYNAMIC_DEBUG_H | 2 | #define _DYNAMIC_DEBUG_H |
| 3 | 3 | ||
| 4 | #include <linux/jump_label.h> | ||
| 5 | |||
| 4 | /* dynamic_printk_enabled, and dynamic_printk_enabled2 are bitmasks in which | 6 | /* dynamic_printk_enabled, and dynamic_printk_enabled2 are bitmasks in which |
| 5 | * bit n is set to 1 if any modname hashes into the bucket n, 0 otherwise. They | 7 | * bit n is set to 1 if any modname hashes into the bucket n, 0 otherwise. They |
| 6 | * use independent hash functions, to reduce the chance of false positives. | 8 | * use independent hash functions, to reduce the chance of false positives. |
| @@ -22,8 +24,6 @@ struct _ddebug { | |||
| 22 | const char *function; | 24 | const char *function; |
| 23 | const char *filename; | 25 | const char *filename; |
| 24 | const char *format; | 26 | const char *format; |
| 25 | char primary_hash; | ||
| 26 | char secondary_hash; | ||
| 27 | unsigned int lineno:24; | 27 | unsigned int lineno:24; |
| 28 | /* | 28 | /* |
| 29 | * The flags field controls the behaviour at the callsite. | 29 | * The flags field controls the behaviour at the callsite. |
| @@ -33,6 +33,7 @@ struct _ddebug { | |||
| 33 | #define _DPRINTK_FLAGS_PRINT (1<<0) /* printk() a message using the format */ | 33 | #define _DPRINTK_FLAGS_PRINT (1<<0) /* printk() a message using the format */ |
| 34 | #define _DPRINTK_FLAGS_DEFAULT 0 | 34 | #define _DPRINTK_FLAGS_DEFAULT 0 |
| 35 | unsigned int flags:8; | 35 | unsigned int flags:8; |
| 36 | char enabled; | ||
| 36 | } __attribute__((aligned(8))); | 37 | } __attribute__((aligned(8))); |
| 37 | 38 | ||
| 38 | 39 | ||
| @@ -42,33 +43,35 @@ int ddebug_add_module(struct _ddebug *tab, unsigned int n, | |||
| 42 | #if defined(CONFIG_DYNAMIC_DEBUG) | 43 | #if defined(CONFIG_DYNAMIC_DEBUG) |
| 43 | extern int ddebug_remove_module(const char *mod_name); | 44 | extern int ddebug_remove_module(const char *mod_name); |
| 44 | 45 | ||
| 45 | #define __dynamic_dbg_enabled(dd) ({ \ | ||
| 46 | int __ret = 0; \ | ||
| 47 | if (unlikely((dynamic_debug_enabled & (1LL << DEBUG_HASH)) && \ | ||
| 48 | (dynamic_debug_enabled2 & (1LL << DEBUG_HASH2)))) \ | ||
| 49 | if (unlikely(dd.flags)) \ | ||
| 50 | __ret = 1; \ | ||
| 51 | __ret; }) | ||
| 52 | |||
| 53 | #define dynamic_pr_debug(fmt, ...) do { \ | 46 | #define dynamic_pr_debug(fmt, ...) do { \ |
| 47 | __label__ do_printk; \ | ||
| 48 | __label__ out; \ | ||
| 54 | static struct _ddebug descriptor \ | 49 | static struct _ddebug descriptor \ |
| 55 | __used \ | 50 | __used \ |
| 56 | __attribute__((section("__verbose"), aligned(8))) = \ | 51 | __attribute__((section("__verbose"), aligned(8))) = \ |
| 57 | { KBUILD_MODNAME, __func__, __FILE__, fmt, DEBUG_HASH, \ | 52 | { KBUILD_MODNAME, __func__, __FILE__, fmt, __LINE__, \ |
| 58 | DEBUG_HASH2, __LINE__, _DPRINTK_FLAGS_DEFAULT }; \ | 53 | _DPRINTK_FLAGS_DEFAULT }; \ |
| 59 | if (__dynamic_dbg_enabled(descriptor)) \ | 54 | JUMP_LABEL(&descriptor.enabled, do_printk); \ |
| 60 | printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__); \ | 55 | goto out; \ |
| 56 | do_printk: \ | ||
| 57 | printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__); \ | ||
| 58 | out: ; \ | ||
| 61 | } while (0) | 59 | } while (0) |
| 62 | 60 | ||
| 63 | 61 | ||
| 64 | #define dynamic_dev_dbg(dev, fmt, ...) do { \ | 62 | #define dynamic_dev_dbg(dev, fmt, ...) do { \ |
| 63 | __label__ do_printk; \ | ||
| 64 | __label__ out; \ | ||
| 65 | static struct _ddebug descriptor \ | 65 | static struct _ddebug descriptor \ |
| 66 | __used \ | 66 | __used \ |
| 67 | __attribute__((section("__verbose"), aligned(8))) = \ | 67 | __attribute__((section("__verbose"), aligned(8))) = \ |
| 68 | { KBUILD_MODNAME, __func__, __FILE__, fmt, DEBUG_HASH, \ | 68 | { KBUILD_MODNAME, __func__, __FILE__, fmt, __LINE__, \ |
| 69 | DEBUG_HASH2, __LINE__, _DPRINTK_FLAGS_DEFAULT }; \ | 69 | _DPRINTK_FLAGS_DEFAULT }; \ |
| 70 | if (__dynamic_dbg_enabled(descriptor)) \ | 70 | JUMP_LABEL(&descriptor.enabled, do_printk); \ |
| 71 | dev_printk(KERN_DEBUG, dev, fmt, ##__VA_ARGS__); \ | 71 | goto out; \ |
| 72 | do_printk: \ | ||
| 73 | dev_printk(KERN_DEBUG, dev, fmt, ##__VA_ARGS__); \ | ||
| 74 | out: ; \ | ||
| 72 | } while (0) | 75 | } while (0) |
| 73 | 76 | ||
| 74 | #else | 77 | #else |
| @@ -80,7 +83,7 @@ static inline int ddebug_remove_module(const char *mod) | |||
| 80 | 83 | ||
| 81 | #define dynamic_pr_debug(fmt, ...) \ | 84 | #define dynamic_pr_debug(fmt, ...) \ |
| 82 | do { if (0) printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__); } while (0) | 85 | do { if (0) printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__); } while (0) |
| 83 | #define dynamic_dev_dbg(dev, format, ...) \ | 86 | #define dynamic_dev_dbg(dev, fmt, ...) \ |
| 84 | do { if (0) dev_printk(KERN_DEBUG, dev, fmt, ##__VA_ARGS__); } while (0) | 87 | do { if (0) dev_printk(KERN_DEBUG, dev, fmt, ##__VA_ARGS__); } while (0) |
| 85 | #endif | 88 | #endif |
| 86 | 89 | ||
diff --git a/include/linux/early_res.h b/include/linux/early_res.h deleted file mode 100644 index 29c09f57a13c..000000000000 --- a/include/linux/early_res.h +++ /dev/null | |||
| @@ -1,23 +0,0 @@ | |||
| 1 | #ifndef _LINUX_EARLY_RES_H | ||
| 2 | #define _LINUX_EARLY_RES_H | ||
| 3 | #ifdef __KERNEL__ | ||
| 4 | |||
| 5 | extern void reserve_early(u64 start, u64 end, char *name); | ||
| 6 | extern void reserve_early_overlap_ok(u64 start, u64 end, char *name); | ||
| 7 | extern void free_early(u64 start, u64 end); | ||
| 8 | void free_early_partial(u64 start, u64 end); | ||
| 9 | extern void early_res_to_bootmem(u64 start, u64 end); | ||
| 10 | |||
| 11 | void reserve_early_without_check(u64 start, u64 end, char *name); | ||
| 12 | u64 find_early_area(u64 ei_start, u64 ei_last, u64 start, u64 end, | ||
| 13 | u64 size, u64 align); | ||
| 14 | u64 find_early_area_size(u64 ei_start, u64 ei_last, u64 start, | ||
| 15 | u64 *sizep, u64 align); | ||
| 16 | u64 find_fw_memmap_area(u64 start, u64 end, u64 size, u64 align); | ||
| 17 | u64 get_max_mapped(void); | ||
| 18 | #include <linux/range.h> | ||
| 19 | int get_free_all_memory_range(struct range **rangep, int nodeid); | ||
| 20 | |||
| 21 | #endif /* __KERNEL__ */ | ||
| 22 | |||
| 23 | #endif /* _LINUX_EARLY_RES_H */ | ||
diff --git a/include/linux/edac.h b/include/linux/edac.h index 7cf92e8a4196..36c66443bdfd 100644 --- a/include/linux/edac.h +++ b/include/linux/edac.h | |||
| @@ -13,6 +13,7 @@ | |||
| 13 | #define _LINUX_EDAC_H_ | 13 | #define _LINUX_EDAC_H_ |
| 14 | 14 | ||
| 15 | #include <asm/atomic.h> | 15 | #include <asm/atomic.h> |
| 16 | #include <linux/sysdev.h> | ||
| 16 | 17 | ||
| 17 | #define EDAC_OPSTATE_INVAL -1 | 18 | #define EDAC_OPSTATE_INVAL -1 |
| 18 | #define EDAC_OPSTATE_POLL 0 | 19 | #define EDAC_OPSTATE_POLL 0 |
| @@ -22,9 +23,12 @@ | |||
| 22 | extern int edac_op_state; | 23 | extern int edac_op_state; |
| 23 | extern int edac_err_assert; | 24 | extern int edac_err_assert; |
| 24 | extern atomic_t edac_handlers; | 25 | extern atomic_t edac_handlers; |
| 26 | extern struct sysdev_class edac_class; | ||
| 25 | 27 | ||
| 26 | extern int edac_handler_set(void); | 28 | extern int edac_handler_set(void); |
| 27 | extern void edac_atomic_assert_error(void); | 29 | extern void edac_atomic_assert_error(void); |
| 30 | extern struct sysdev_class *edac_get_sysfs_class(void); | ||
| 31 | extern void edac_put_sysfs_class(void); | ||
| 28 | 32 | ||
| 29 | static inline void opstate_init(void) | 33 | static inline void opstate_init(void) |
| 30 | { | 34 | { |
diff --git a/include/linux/eeprom_93cx6.h b/include/linux/eeprom_93cx6.h index a55c873e8b66..c4627cbdb8e0 100644 --- a/include/linux/eeprom_93cx6.h +++ b/include/linux/eeprom_93cx6.h | |||
| @@ -30,6 +30,7 @@ | |||
| 30 | #define PCI_EEPROM_WIDTH_93C46 6 | 30 | #define PCI_EEPROM_WIDTH_93C46 6 |
| 31 | #define PCI_EEPROM_WIDTH_93C56 8 | 31 | #define PCI_EEPROM_WIDTH_93C56 8 |
| 32 | #define PCI_EEPROM_WIDTH_93C66 8 | 32 | #define PCI_EEPROM_WIDTH_93C66 8 |
| 33 | #define PCI_EEPROM_WIDTH_93C86 8 | ||
| 33 | #define PCI_EEPROM_WIDTH_OPCODE 3 | 34 | #define PCI_EEPROM_WIDTH_OPCODE 3 |
| 34 | #define PCI_EEPROM_WRITE_OPCODE 0x05 | 35 | #define PCI_EEPROM_WRITE_OPCODE 0x05 |
| 35 | #define PCI_EEPROM_READ_OPCODE 0x06 | 36 | #define PCI_EEPROM_READ_OPCODE 0x06 |
diff --git a/include/linux/elevator.h b/include/linux/elevator.h index 2c958f4fce1e..4fd978e7eb83 100644 --- a/include/linux/elevator.h +++ b/include/linux/elevator.h | |||
| @@ -93,6 +93,7 @@ struct elevator_queue | |||
| 93 | struct elevator_type *elevator_type; | 93 | struct elevator_type *elevator_type; |
| 94 | struct mutex sysfs_lock; | 94 | struct mutex sysfs_lock; |
| 95 | struct hlist_head *hash; | 95 | struct hlist_head *hash; |
| 96 | unsigned int registered:1; | ||
| 96 | }; | 97 | }; |
| 97 | 98 | ||
| 98 | /* | 99 | /* |
| @@ -136,6 +137,7 @@ extern ssize_t elv_iosched_store(struct request_queue *, const char *, size_t); | |||
| 136 | 137 | ||
| 137 | extern int elevator_init(struct request_queue *, char *); | 138 | extern int elevator_init(struct request_queue *, char *); |
| 138 | extern void elevator_exit(struct elevator_queue *); | 139 | extern void elevator_exit(struct elevator_queue *); |
| 140 | extern int elevator_change(struct request_queue *, const char *); | ||
| 139 | extern int elv_rq_merge_ok(struct request *, struct bio *); | 141 | extern int elv_rq_merge_ok(struct request *, struct bio *); |
| 140 | 142 | ||
| 141 | /* | 143 | /* |
diff --git a/include/linux/etherdevice.h b/include/linux/etherdevice.h index 3d7a6687d247..f16a01081e15 100644 --- a/include/linux/etherdevice.h +++ b/include/linux/etherdevice.h | |||
| @@ -71,7 +71,7 @@ static inline int is_zero_ether_addr(const u8 *addr) | |||
| 71 | */ | 71 | */ |
| 72 | static inline int is_multicast_ether_addr(const u8 *addr) | 72 | static inline int is_multicast_ether_addr(const u8 *addr) |
| 73 | { | 73 | { |
| 74 | return (0x01 & addr[0]); | 74 | return 0x01 & addr[0]; |
| 75 | } | 75 | } |
| 76 | 76 | ||
| 77 | /** | 77 | /** |
| @@ -82,7 +82,7 @@ static inline int is_multicast_ether_addr(const u8 *addr) | |||
| 82 | */ | 82 | */ |
| 83 | static inline int is_local_ether_addr(const u8 *addr) | 83 | static inline int is_local_ether_addr(const u8 *addr) |
| 84 | { | 84 | { |
| 85 | return (0x02 & addr[0]); | 85 | return 0x02 & addr[0]; |
| 86 | } | 86 | } |
| 87 | 87 | ||
| 88 | /** | 88 | /** |
| @@ -127,6 +127,20 @@ static inline void random_ether_addr(u8 *addr) | |||
| 127 | } | 127 | } |
| 128 | 128 | ||
| 129 | /** | 129 | /** |
| 130 | * dev_hw_addr_random - Create random MAC and set device flag | ||
| 131 | * @dev: pointer to net_device structure | ||
| 132 | * @hwaddr: Pointer to a six-byte array containing the Ethernet address | ||
| 133 | * | ||
| 134 | * Generate random MAC to be used by a device and set addr_assign_type | ||
| 135 | * so the state can be read by sysfs and be used by udev. | ||
| 136 | */ | ||
| 137 | static inline void dev_hw_addr_random(struct net_device *dev, u8 *hwaddr) | ||
| 138 | { | ||
| 139 | dev->addr_assign_type |= NET_ADDR_RANDOM; | ||
| 140 | random_ether_addr(hwaddr); | ||
| 141 | } | ||
| 142 | |||
| 143 | /** | ||
| 130 | * compare_ether_addr - Compare two Ethernet addresses | 144 | * compare_ether_addr - Compare two Ethernet addresses |
| 131 | * @addr1: Pointer to a six-byte array containing the Ethernet address | 145 | * @addr1: Pointer to a six-byte array containing the Ethernet address |
| 132 | * @addr2: Pointer other six-byte array containing the Ethernet address | 146 | * @addr2: Pointer other six-byte array containing the Ethernet address |
| @@ -223,13 +237,29 @@ static inline bool is_etherdev_addr(const struct net_device *dev, | |||
| 223 | * entry points. | 237 | * entry points. |
| 224 | */ | 238 | */ |
| 225 | 239 | ||
| 226 | static inline int compare_ether_header(const void *a, const void *b) | 240 | static inline unsigned long compare_ether_header(const void *a, const void *b) |
| 227 | { | 241 | { |
| 242 | #if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64 | ||
| 243 | unsigned long fold; | ||
| 244 | |||
| 245 | /* | ||
| 246 | * We want to compare 14 bytes: | ||
| 247 | * [a0 ... a13] ^ [b0 ... b13] | ||
| 248 | * Use two long XOR, ORed together, with an overlap of two bytes. | ||
| 249 | * [a0 a1 a2 a3 a4 a5 a6 a7 ] ^ [b0 b1 b2 b3 b4 b5 b6 b7 ] | | ||
| 250 | * [a6 a7 a8 a9 a10 a11 a12 a13] ^ [b6 b7 b8 b9 b10 b11 b12 b13] | ||
| 251 | * This means the [a6 a7] ^ [b6 b7] part is done two times. | ||
| 252 | */ | ||
| 253 | fold = *(unsigned long *)a ^ *(unsigned long *)b; | ||
| 254 | fold |= *(unsigned long *)(a + 6) ^ *(unsigned long *)(b + 6); | ||
| 255 | return fold; | ||
| 256 | #else | ||
| 228 | u32 *a32 = (u32 *)((u8 *)a + 2); | 257 | u32 *a32 = (u32 *)((u8 *)a + 2); |
| 229 | u32 *b32 = (u32 *)((u8 *)b + 2); | 258 | u32 *b32 = (u32 *)((u8 *)b + 2); |
| 230 | 259 | ||
| 231 | return (*(u16 *)a ^ *(u16 *)b) | (a32[0] ^ b32[0]) | | 260 | return (*(u16 *)a ^ *(u16 *)b) | (a32[0] ^ b32[0]) | |
| 232 | (a32[1] ^ b32[1]) | (a32[2] ^ b32[2]); | 261 | (a32[1] ^ b32[1]) | (a32[2] ^ b32[2]); |
| 262 | #endif | ||
| 233 | } | 263 | } |
| 234 | 264 | ||
| 235 | #endif /* _LINUX_ETHERDEVICE_H */ | 265 | #endif /* _LINUX_ETHERDEVICE_H */ |
diff --git a/include/linux/ethtool.h b/include/linux/ethtool.h index b4207ca3ad52..6628a507fd3b 100644 --- a/include/linux/ethtool.h +++ b/include/linux/ethtool.h | |||
| @@ -14,6 +14,7 @@ | |||
| 14 | #define _LINUX_ETHTOOL_H | 14 | #define _LINUX_ETHTOOL_H |
| 15 | 15 | ||
| 16 | #include <linux/types.h> | 16 | #include <linux/types.h> |
| 17 | #include <linux/if_ether.h> | ||
| 17 | 18 | ||
| 18 | /* This should work for both 32 and 64 bit userland. */ | 19 | /* This should work for both 32 and 64 bit userland. */ |
| 19 | struct ethtool_cmd { | 20 | struct ethtool_cmd { |
| @@ -308,15 +309,28 @@ struct ethtool_perm_addr { | |||
| 308 | * flag differs from the read-only value. | 309 | * flag differs from the read-only value. |
| 309 | */ | 310 | */ |
| 310 | enum ethtool_flags { | 311 | enum ethtool_flags { |
| 312 | ETH_FLAG_TXVLAN = (1 << 7), /* TX VLAN offload enabled */ | ||
| 313 | ETH_FLAG_RXVLAN = (1 << 8), /* RX VLAN offload enabled */ | ||
| 311 | ETH_FLAG_LRO = (1 << 15), /* LRO is enabled */ | 314 | ETH_FLAG_LRO = (1 << 15), /* LRO is enabled */ |
| 312 | ETH_FLAG_NTUPLE = (1 << 27), /* N-tuple filters enabled */ | 315 | ETH_FLAG_NTUPLE = (1 << 27), /* N-tuple filters enabled */ |
| 313 | ETH_FLAG_RXHASH = (1 << 28), | 316 | ETH_FLAG_RXHASH = (1 << 28), |
| 314 | }; | 317 | }; |
| 315 | 318 | ||
| 316 | /* The following structures are for supporting RX network flow | 319 | /* The following structures are for supporting RX network flow |
| 317 | * classification configuration. Note, all multibyte fields, e.g., | 320 | * classification and RX n-tuple configuration. Note, all multibyte |
| 318 | * ip4src, ip4dst, psrc, pdst, spi, etc. are expected to be in network | 321 | * fields, e.g., ip4src, ip4dst, psrc, pdst, spi, etc. are expected to |
| 319 | * byte order. | 322 | * be in network byte order. |
| 323 | */ | ||
| 324 | |||
| 325 | /** | ||
| 326 | * struct ethtool_tcpip4_spec - flow specification for TCP/IPv4 etc. | ||
| 327 | * @ip4src: Source host | ||
| 328 | * @ip4dst: Destination host | ||
| 329 | * @psrc: Source port | ||
| 330 | * @pdst: Destination port | ||
| 331 | * @tos: Type-of-service | ||
| 332 | * | ||
| 333 | * This can be used to specify a TCP/IPv4, UDP/IPv4 or SCTP/IPv4 flow. | ||
| 320 | */ | 334 | */ |
| 321 | struct ethtool_tcpip4_spec { | 335 | struct ethtool_tcpip4_spec { |
| 322 | __be32 ip4src; | 336 | __be32 ip4src; |
| @@ -326,6 +340,15 @@ struct ethtool_tcpip4_spec { | |||
| 326 | __u8 tos; | 340 | __u8 tos; |
| 327 | }; | 341 | }; |
| 328 | 342 | ||
| 343 | /** | ||
| 344 | * struct ethtool_ah_espip4_spec - flow specification for IPsec/IPv4 | ||
| 345 | * @ip4src: Source host | ||
| 346 | * @ip4dst: Destination host | ||
| 347 | * @spi: Security parameters index | ||
| 348 | * @tos: Type-of-service | ||
| 349 | * | ||
| 350 | * This can be used to specify an IPsec transport or tunnel over IPv4. | ||
| 351 | */ | ||
| 329 | struct ethtool_ah_espip4_spec { | 352 | struct ethtool_ah_espip4_spec { |
| 330 | __be32 ip4src; | 353 | __be32 ip4src; |
| 331 | __be32 ip4dst; | 354 | __be32 ip4dst; |
| @@ -333,21 +356,17 @@ struct ethtool_ah_espip4_spec { | |||
| 333 | __u8 tos; | 356 | __u8 tos; |
| 334 | }; | 357 | }; |
| 335 | 358 | ||
| 336 | struct ethtool_rawip4_spec { | ||
| 337 | __be32 ip4src; | ||
| 338 | __be32 ip4dst; | ||
| 339 | __u8 hdata[64]; | ||
| 340 | }; | ||
| 341 | |||
| 342 | struct ethtool_ether_spec { | ||
| 343 | __be16 ether_type; | ||
| 344 | __u8 frame_size; | ||
| 345 | __u8 eframe[16]; | ||
| 346 | }; | ||
| 347 | |||
| 348 | #define ETH_RX_NFC_IP4 1 | 359 | #define ETH_RX_NFC_IP4 1 |
| 349 | #define ETH_RX_NFC_IP6 2 | ||
| 350 | 360 | ||
| 361 | /** | ||
| 362 | * struct ethtool_usrip4_spec - general flow specification for IPv4 | ||
| 363 | * @ip4src: Source host | ||
| 364 | * @ip4dst: Destination host | ||
| 365 | * @l4_4_bytes: First 4 bytes of transport (layer 4) header | ||
| 366 | * @tos: Type-of-service | ||
| 367 | * @ip_ver: Value must be %ETH_RX_NFC_IP4; mask must be 0 | ||
| 368 | * @proto: Transport protocol number; mask must be 0 | ||
| 369 | */ | ||
| 351 | struct ethtool_usrip4_spec { | 370 | struct ethtool_usrip4_spec { |
| 352 | __be32 ip4src; | 371 | __be32 ip4src; |
| 353 | __be32 ip4dst; | 372 | __be32 ip4dst; |
| @@ -357,6 +376,15 @@ struct ethtool_usrip4_spec { | |||
| 357 | __u8 proto; | 376 | __u8 proto; |
| 358 | }; | 377 | }; |
| 359 | 378 | ||
| 379 | /** | ||
| 380 | * struct ethtool_rx_flow_spec - specification for RX flow filter | ||
| 381 | * @flow_type: Type of match to perform, e.g. %TCP_V4_FLOW | ||
| 382 | * @h_u: Flow fields to match (dependent on @flow_type) | ||
| 383 | * @m_u: Masks for flow field bits to be ignored | ||
| 384 | * @ring_cookie: RX ring/queue index to deliver to, or %RX_CLS_FLOW_DISC | ||
| 385 | * if packets should be discarded | ||
| 386 | * @location: Index of filter in hardware table | ||
| 387 | */ | ||
| 360 | struct ethtool_rx_flow_spec { | 388 | struct ethtool_rx_flow_spec { |
| 361 | __u32 flow_type; | 389 | __u32 flow_type; |
| 362 | union { | 390 | union { |
| @@ -365,27 +393,91 @@ struct ethtool_rx_flow_spec { | |||
| 365 | struct ethtool_tcpip4_spec sctp_ip4_spec; | 393 | struct ethtool_tcpip4_spec sctp_ip4_spec; |
| 366 | struct ethtool_ah_espip4_spec ah_ip4_spec; | 394 | struct ethtool_ah_espip4_spec ah_ip4_spec; |
| 367 | struct ethtool_ah_espip4_spec esp_ip4_spec; | 395 | struct ethtool_ah_espip4_spec esp_ip4_spec; |
| 368 | struct ethtool_rawip4_spec raw_ip4_spec; | ||
| 369 | struct ethtool_ether_spec ether_spec; | ||
| 370 | struct ethtool_usrip4_spec usr_ip4_spec; | 396 | struct ethtool_usrip4_spec usr_ip4_spec; |
| 371 | __u8 hdata[64]; | 397 | struct ethhdr ether_spec; |
| 372 | } h_u, m_u; /* entry, mask */ | 398 | __u8 hdata[72]; |
| 399 | } h_u, m_u; | ||
| 373 | __u64 ring_cookie; | 400 | __u64 ring_cookie; |
| 374 | __u32 location; | 401 | __u32 location; |
| 375 | }; | 402 | }; |
| 376 | 403 | ||
| 404 | /** | ||
| 405 | * struct ethtool_rxnfc - command to get or set RX flow classification rules | ||
| 406 | * @cmd: Specific command number - %ETHTOOL_GRXFH, %ETHTOOL_SRXFH, | ||
| 407 | * %ETHTOOL_GRXRINGS, %ETHTOOL_GRXCLSRLCNT, %ETHTOOL_GRXCLSRULE, | ||
| 408 | * %ETHTOOL_GRXCLSRLALL, %ETHTOOL_SRXCLSRLDEL or %ETHTOOL_SRXCLSRLINS | ||
| 409 | * @flow_type: Type of flow to be affected, e.g. %TCP_V4_FLOW | ||
| 410 | * @data: Command-dependent value | ||
| 411 | * @fs: Flow filter specification | ||
| 412 | * @rule_cnt: Number of rules to be affected | ||
| 413 | * @rule_locs: Array of valid rule indices | ||
| 414 | * | ||
| 415 | * For %ETHTOOL_GRXFH and %ETHTOOL_SRXFH, @data is a bitmask indicating | ||
| 416 | * the fields included in the flow hash, e.g. %RXH_IP_SRC. The following | ||
| 417 | * structure fields must not be used. | ||
| 418 | * | ||
| 419 | * For %ETHTOOL_GRXRINGS, @data is set to the number of RX rings/queues | ||
| 420 | * on return. | ||
| 421 | * | ||
| 422 | * For %ETHTOOL_GRXCLSRLCNT, @rule_cnt is set to the number of defined | ||
| 423 | * rules on return. | ||
| 424 | * | ||
| 425 | * For %ETHTOOL_GRXCLSRULE, @fs.@location specifies the index of an | ||
| 426 | * existing filter rule on entry and @fs contains the rule on return. | ||
| 427 | * | ||
| 428 | * For %ETHTOOL_GRXCLSRLALL, @rule_cnt specifies the array size of the | ||
| 429 | * user buffer for @rule_locs on entry. On return, @data is the size | ||
| 430 | * of the filter table and @rule_locs contains the indices of the | ||
| 431 | * defined rules. | ||
| 432 | * | ||
| 433 | * For %ETHTOOL_SRXCLSRLINS, @fs specifies the filter rule to add or | ||
| 434 | * update. @fs.@location specifies the index to use and must not be | ||
| 435 | * ignored. | ||
| 436 | * | ||
| 437 | * For %ETHTOOL_SRXCLSRLDEL, @fs.@location specifies the index of an | ||
| 438 | * existing filter rule on entry. | ||
| 439 | * | ||
| 440 | * Implementation of indexed classification rules generally requires a | ||
| 441 | * TCAM. | ||
| 442 | */ | ||
| 377 | struct ethtool_rxnfc { | 443 | struct ethtool_rxnfc { |
| 378 | __u32 cmd; | 444 | __u32 cmd; |
| 379 | __u32 flow_type; | 445 | __u32 flow_type; |
| 380 | /* The rx flow hash value or the rule DB size */ | ||
| 381 | __u64 data; | 446 | __u64 data; |
| 382 | /* The following fields are not valid and must not be used for | ||
| 383 | * the ETHTOOL_{G,X}RXFH commands. */ | ||
| 384 | struct ethtool_rx_flow_spec fs; | 447 | struct ethtool_rx_flow_spec fs; |
| 385 | __u32 rule_cnt; | 448 | __u32 rule_cnt; |
| 386 | __u32 rule_locs[0]; | 449 | __u32 rule_locs[0]; |
| 387 | }; | 450 | }; |
| 388 | 451 | ||
| 452 | /** | ||
| 453 | * struct ethtool_rxfh_indir - command to get or set RX flow hash indirection | ||
| 454 | * @cmd: Specific command number - %ETHTOOL_GRXFHINDIR or %ETHTOOL_SRXFHINDIR | ||
| 455 | * @size: On entry, the array size of the user buffer. On return from | ||
| 456 | * %ETHTOOL_GRXFHINDIR, the array size of the hardware indirection table. | ||
| 457 | * @ring_index: RX ring/queue index for each hash value | ||
| 458 | */ | ||
| 459 | struct ethtool_rxfh_indir { | ||
| 460 | __u32 cmd; | ||
| 461 | __u32 size; | ||
| 462 | __u32 ring_index[0]; | ||
| 463 | }; | ||
| 464 | |||
| 465 | /** | ||
| 466 | * struct ethtool_rx_ntuple_flow_spec - specification for RX flow filter | ||
| 467 | * @flow_type: Type of match to perform, e.g. %TCP_V4_FLOW | ||
| 468 | * @h_u: Flow field values to match (dependent on @flow_type) | ||
| 469 | * @m_u: Masks for flow field value bits to be ignored | ||
| 470 | * @vlan_tag: VLAN tag to match | ||
| 471 | * @vlan_tag_mask: Mask for VLAN tag bits to be ignored | ||
| 472 | * @data: Driver-dependent data to match | ||
| 473 | * @data_mask: Mask for driver-dependent data bits to be ignored | ||
| 474 | * @action: RX ring/queue index to deliver to (non-negative) or other action | ||
| 475 | * (negative, e.g. %ETHTOOL_RXNTUPLE_ACTION_DROP) | ||
| 476 | * | ||
| 477 | * For flow types %TCP_V4_FLOW, %UDP_V4_FLOW and %SCTP_V4_FLOW, where | ||
| 478 | * a field value and mask are both zero this is treated as if all mask | ||
| 479 | * bits are set i.e. the field is ignored. | ||
| 480 | */ | ||
| 389 | struct ethtool_rx_ntuple_flow_spec { | 481 | struct ethtool_rx_ntuple_flow_spec { |
| 390 | __u32 flow_type; | 482 | __u32 flow_type; |
| 391 | union { | 483 | union { |
| @@ -394,22 +486,26 @@ struct ethtool_rx_ntuple_flow_spec { | |||
| 394 | struct ethtool_tcpip4_spec sctp_ip4_spec; | 486 | struct ethtool_tcpip4_spec sctp_ip4_spec; |
| 395 | struct ethtool_ah_espip4_spec ah_ip4_spec; | 487 | struct ethtool_ah_espip4_spec ah_ip4_spec; |
| 396 | struct ethtool_ah_espip4_spec esp_ip4_spec; | 488 | struct ethtool_ah_espip4_spec esp_ip4_spec; |
| 397 | struct ethtool_rawip4_spec raw_ip4_spec; | ||
| 398 | struct ethtool_ether_spec ether_spec; | ||
| 399 | struct ethtool_usrip4_spec usr_ip4_spec; | 489 | struct ethtool_usrip4_spec usr_ip4_spec; |
| 400 | __u8 hdata[64]; | 490 | struct ethhdr ether_spec; |
| 401 | } h_u, m_u; /* entry, mask */ | 491 | __u8 hdata[72]; |
| 492 | } h_u, m_u; | ||
| 402 | 493 | ||
| 403 | __u16 vlan_tag; | 494 | __u16 vlan_tag; |
| 404 | __u16 vlan_tag_mask; | 495 | __u16 vlan_tag_mask; |
| 405 | __u64 data; /* user-defined flow spec data */ | 496 | __u64 data; |
| 406 | __u64 data_mask; /* user-defined flow spec mask */ | 497 | __u64 data_mask; |
| 407 | 498 | ||
| 408 | /* signed to distinguish between queue and actions (DROP) */ | ||
| 409 | __s32 action; | 499 | __s32 action; |
| 410 | #define ETHTOOL_RXNTUPLE_ACTION_DROP -1 | 500 | #define ETHTOOL_RXNTUPLE_ACTION_DROP (-1) /* drop packet */ |
| 501 | #define ETHTOOL_RXNTUPLE_ACTION_CLEAR (-2) /* clear filter */ | ||
| 411 | }; | 502 | }; |
| 412 | 503 | ||
| 504 | /** | ||
| 505 | * struct ethtool_rx_ntuple - command to set or clear RX flow filter | ||
| 506 | * @cmd: Command number - %ETHTOOL_SRXNTUPLE | ||
| 507 | * @fs: Flow filter specification | ||
| 508 | */ | ||
| 413 | struct ethtool_rx_ntuple { | 509 | struct ethtool_rx_ntuple { |
| 414 | __u32 cmd; | 510 | __u32 cmd; |
| 415 | struct ethtool_rx_ntuple_flow_spec fs; | 511 | struct ethtool_rx_ntuple_flow_spec fs; |
| @@ -459,7 +555,7 @@ int ethtool_op_set_tso(struct net_device *dev, u32 data); | |||
| 459 | u32 ethtool_op_get_ufo(struct net_device *dev); | 555 | u32 ethtool_op_get_ufo(struct net_device *dev); |
| 460 | int ethtool_op_set_ufo(struct net_device *dev, u32 data); | 556 | int ethtool_op_set_ufo(struct net_device *dev, u32 data); |
| 461 | u32 ethtool_op_get_flags(struct net_device *dev); | 557 | u32 ethtool_op_get_flags(struct net_device *dev); |
| 462 | int ethtool_op_set_flags(struct net_device *dev, u32 data); | 558 | int ethtool_op_set_flags(struct net_device *dev, u32 data, u32 supported); |
| 463 | void ethtool_ntuple_flush(struct net_device *dev); | 559 | void ethtool_ntuple_flush(struct net_device *dev); |
| 464 | 560 | ||
| 465 | /** | 561 | /** |
| @@ -578,6 +674,10 @@ struct ethtool_ops { | |||
| 578 | int (*set_rx_ntuple)(struct net_device *, | 674 | int (*set_rx_ntuple)(struct net_device *, |
| 579 | struct ethtool_rx_ntuple *); | 675 | struct ethtool_rx_ntuple *); |
| 580 | int (*get_rx_ntuple)(struct net_device *, u32 stringset, void *); | 676 | int (*get_rx_ntuple)(struct net_device *, u32 stringset, void *); |
| 677 | int (*get_rxfh_indir)(struct net_device *, | ||
| 678 | struct ethtool_rxfh_indir *); | ||
| 679 | int (*set_rxfh_indir)(struct net_device *, | ||
| 680 | const struct ethtool_rxfh_indir *); | ||
| 581 | }; | 681 | }; |
| 582 | #endif /* __KERNEL__ */ | 682 | #endif /* __KERNEL__ */ |
| 583 | 683 | ||
| @@ -588,29 +688,29 @@ struct ethtool_ops { | |||
| 588 | #define ETHTOOL_GREGS 0x00000004 /* Get NIC registers. */ | 688 | #define ETHTOOL_GREGS 0x00000004 /* Get NIC registers. */ |
| 589 | #define ETHTOOL_GWOL 0x00000005 /* Get wake-on-lan options. */ | 689 | #define ETHTOOL_GWOL 0x00000005 /* Get wake-on-lan options. */ |
| 590 | #define ETHTOOL_SWOL 0x00000006 /* Set wake-on-lan options. */ | 690 | #define ETHTOOL_SWOL 0x00000006 /* Set wake-on-lan options. */ |
| 591 | #define ETHTOOL_GMSGLVL 0x00000007 /* Get driver message level */ | 691 | #define ETHTOOL_GMSGLVL 0x00000007 /* Get driver message level */ |
| 592 | #define ETHTOOL_SMSGLVL 0x00000008 /* Set driver msg level. */ | 692 | #define ETHTOOL_SMSGLVL 0x00000008 /* Set driver msg level. */ |
| 593 | #define ETHTOOL_NWAY_RST 0x00000009 /* Restart autonegotiation. */ | 693 | #define ETHTOOL_NWAY_RST 0x00000009 /* Restart autonegotiation. */ |
| 594 | #define ETHTOOL_GLINK 0x0000000a /* Get link status (ethtool_value) */ | 694 | #define ETHTOOL_GLINK 0x0000000a /* Get link status (ethtool_value) */ |
| 595 | #define ETHTOOL_GEEPROM 0x0000000b /* Get EEPROM data */ | 695 | #define ETHTOOL_GEEPROM 0x0000000b /* Get EEPROM data */ |
| 596 | #define ETHTOOL_SEEPROM 0x0000000c /* Set EEPROM data. */ | 696 | #define ETHTOOL_SEEPROM 0x0000000c /* Set EEPROM data. */ |
| 597 | #define ETHTOOL_GCOALESCE 0x0000000e /* Get coalesce config */ | 697 | #define ETHTOOL_GCOALESCE 0x0000000e /* Get coalesce config */ |
| 598 | #define ETHTOOL_SCOALESCE 0x0000000f /* Set coalesce config. */ | 698 | #define ETHTOOL_SCOALESCE 0x0000000f /* Set coalesce config. */ |
| 599 | #define ETHTOOL_GRINGPARAM 0x00000010 /* Get ring parameters */ | 699 | #define ETHTOOL_GRINGPARAM 0x00000010 /* Get ring parameters */ |
| 600 | #define ETHTOOL_SRINGPARAM 0x00000011 /* Set ring parameters. */ | 700 | #define ETHTOOL_SRINGPARAM 0x00000011 /* Set ring parameters. */ |
| 601 | #define ETHTOOL_GPAUSEPARAM 0x00000012 /* Get pause parameters */ | 701 | #define ETHTOOL_GPAUSEPARAM 0x00000012 /* Get pause parameters */ |
| 602 | #define ETHTOOL_SPAUSEPARAM 0x00000013 /* Set pause parameters. */ | 702 | #define ETHTOOL_SPAUSEPARAM 0x00000013 /* Set pause parameters. */ |
| 603 | #define ETHTOOL_GRXCSUM 0x00000014 /* Get RX hw csum enable (ethtool_value) */ | 703 | #define ETHTOOL_GRXCSUM 0x00000014 /* Get RX hw csum enable (ethtool_value) */ |
| 604 | #define ETHTOOL_SRXCSUM 0x00000015 /* Set RX hw csum enable (ethtool_value) */ | 704 | #define ETHTOOL_SRXCSUM 0x00000015 /* Set RX hw csum enable (ethtool_value) */ |
| 605 | #define ETHTOOL_GTXCSUM 0x00000016 /* Get TX hw csum enable (ethtool_value) */ | 705 | #define ETHTOOL_GTXCSUM 0x00000016 /* Get TX hw csum enable (ethtool_value) */ |
| 606 | #define ETHTOOL_STXCSUM 0x00000017 /* Set TX hw csum enable (ethtool_value) */ | 706 | #define ETHTOOL_STXCSUM 0x00000017 /* Set TX hw csum enable (ethtool_value) */ |
| 607 | #define ETHTOOL_GSG 0x00000018 /* Get scatter-gather enable | 707 | #define ETHTOOL_GSG 0x00000018 /* Get scatter-gather enable |
| 608 | * (ethtool_value) */ | 708 | * (ethtool_value) */ |
| 609 | #define ETHTOOL_SSG 0x00000019 /* Set scatter-gather enable | 709 | #define ETHTOOL_SSG 0x00000019 /* Set scatter-gather enable |
| 610 | * (ethtool_value). */ | 710 | * (ethtool_value). */ |
| 611 | #define ETHTOOL_TEST 0x0000001a /* execute NIC self-test. */ | 711 | #define ETHTOOL_TEST 0x0000001a /* execute NIC self-test. */ |
| 612 | #define ETHTOOL_GSTRINGS 0x0000001b /* get specified string set */ | 712 | #define ETHTOOL_GSTRINGS 0x0000001b /* get specified string set */ |
| 613 | #define ETHTOOL_PHYS_ID 0x0000001c /* identify the NIC */ | 713 | #define ETHTOOL_PHYS_ID 0x0000001c /* identify the NIC */ |
| 614 | #define ETHTOOL_GSTATS 0x0000001d /* get NIC-specific statistics */ | 714 | #define ETHTOOL_GSTATS 0x0000001d /* get NIC-specific statistics */ |
| 615 | #define ETHTOOL_GTSO 0x0000001e /* Get TSO enable (ethtool_value) */ | 715 | #define ETHTOOL_GTSO 0x0000001e /* Get TSO enable (ethtool_value) */ |
| 616 | #define ETHTOOL_STSO 0x0000001f /* Set TSO enable (ethtool_value) */ | 716 | #define ETHTOOL_STSO 0x0000001f /* Set TSO enable (ethtool_value) */ |
| @@ -621,8 +721,8 @@ struct ethtool_ops { | |||
| 621 | #define ETHTOOL_SGSO 0x00000024 /* Set GSO enable (ethtool_value) */ | 721 | #define ETHTOOL_SGSO 0x00000024 /* Set GSO enable (ethtool_value) */ |
| 622 | #define ETHTOOL_GFLAGS 0x00000025 /* Get flags bitmap(ethtool_value) */ | 722 | #define ETHTOOL_GFLAGS 0x00000025 /* Get flags bitmap(ethtool_value) */ |
| 623 | #define ETHTOOL_SFLAGS 0x00000026 /* Set flags bitmap(ethtool_value) */ | 723 | #define ETHTOOL_SFLAGS 0x00000026 /* Set flags bitmap(ethtool_value) */ |
| 624 | #define ETHTOOL_GPFLAGS 0x00000027 /* Get driver-private flags bitmap */ | 724 | #define ETHTOOL_GPFLAGS 0x00000027 /* Get driver-private flags bitmap */ |
| 625 | #define ETHTOOL_SPFLAGS 0x00000028 /* Set driver-private flags bitmap */ | 725 | #define ETHTOOL_SPFLAGS 0x00000028 /* Set driver-private flags bitmap */ |
| 626 | 726 | ||
| 627 | #define ETHTOOL_GRXFH 0x00000029 /* Get RX flow hash configuration */ | 727 | #define ETHTOOL_GRXFH 0x00000029 /* Get RX flow hash configuration */ |
| 628 | #define ETHTOOL_SRXFH 0x0000002a /* Set RX flow hash configuration */ | 728 | #define ETHTOOL_SRXFH 0x0000002a /* Set RX flow hash configuration */ |
| @@ -639,6 +739,8 @@ struct ethtool_ops { | |||
| 639 | #define ETHTOOL_SRXNTUPLE 0x00000035 /* Add an n-tuple filter to device */ | 739 | #define ETHTOOL_SRXNTUPLE 0x00000035 /* Add an n-tuple filter to device */ |
| 640 | #define ETHTOOL_GRXNTUPLE 0x00000036 /* Get n-tuple filters from device */ | 740 | #define ETHTOOL_GRXNTUPLE 0x00000036 /* Get n-tuple filters from device */ |
| 641 | #define ETHTOOL_GSSET_INFO 0x00000037 /* Get string set info */ | 741 | #define ETHTOOL_GSSET_INFO 0x00000037 /* Get string set info */ |
| 742 | #define ETHTOOL_GRXFHINDIR 0x00000038 /* Get RX flow hash indir'n table */ | ||
| 743 | #define ETHTOOL_SRXFHINDIR 0x00000039 /* Set RX flow hash indir'n table */ | ||
| 642 | 744 | ||
| 643 | /* compatibility with older code */ | 745 | /* compatibility with older code */ |
| 644 | #define SPARC_ETH_GSET ETHTOOL_GSET | 746 | #define SPARC_ETH_GSET ETHTOOL_GSET |
| @@ -647,18 +749,18 @@ struct ethtool_ops { | |||
| 647 | /* Indicates what features are supported by the interface. */ | 749 | /* Indicates what features are supported by the interface. */ |
| 648 | #define SUPPORTED_10baseT_Half (1 << 0) | 750 | #define SUPPORTED_10baseT_Half (1 << 0) |
| 649 | #define SUPPORTED_10baseT_Full (1 << 1) | 751 | #define SUPPORTED_10baseT_Full (1 << 1) |
| 650 | #define SUPPORTED_100baseT_Half (1 << 2) | 752 | #define SUPPORTED_100baseT_Half (1 << 2) |
| 651 | #define SUPPORTED_100baseT_Full (1 << 3) | 753 | #define SUPPORTED_100baseT_Full (1 << 3) |
| 652 | #define SUPPORTED_1000baseT_Half (1 << 4) | 754 | #define SUPPORTED_1000baseT_Half (1 << 4) |
| 653 | #define SUPPORTED_1000baseT_Full (1 << 5) | 755 | #define SUPPORTED_1000baseT_Full (1 << 5) |
| 654 | #define SUPPORTED_Autoneg (1 << 6) | 756 | #define SUPPORTED_Autoneg (1 << 6) |
| 655 | #define SUPPORTED_TP (1 << 7) | 757 | #define SUPPORTED_TP (1 << 7) |
| 656 | #define SUPPORTED_AUI (1 << 8) | 758 | #define SUPPORTED_AUI (1 << 8) |
| 657 | #define SUPPORTED_MII (1 << 9) | 759 | #define SUPPORTED_MII (1 << 9) |
| 658 | #define SUPPORTED_FIBRE (1 << 10) | 760 | #define SUPPORTED_FIBRE (1 << 10) |
| 659 | #define SUPPORTED_BNC (1 << 11) | 761 | #define SUPPORTED_BNC (1 << 11) |
| 660 | #define SUPPORTED_10000baseT_Full (1 << 12) | 762 | #define SUPPORTED_10000baseT_Full (1 << 12) |
| 661 | #define SUPPORTED_Pause (1 << 13) | 763 | #define SUPPORTED_Pause (1 << 13) |
| 662 | #define SUPPORTED_Asym_Pause (1 << 14) | 764 | #define SUPPORTED_Asym_Pause (1 << 14) |
| 663 | #define SUPPORTED_2500baseX_Full (1 << 15) | 765 | #define SUPPORTED_2500baseX_Full (1 << 15) |
| 664 | #define SUPPORTED_Backplane (1 << 16) | 766 | #define SUPPORTED_Backplane (1 << 16) |
| @@ -668,8 +770,8 @@ struct ethtool_ops { | |||
| 668 | #define SUPPORTED_10000baseR_FEC (1 << 20) | 770 | #define SUPPORTED_10000baseR_FEC (1 << 20) |
| 669 | 771 | ||
| 670 | /* Indicates what features are advertised by the interface. */ | 772 | /* Indicates what features are advertised by the interface. */ |
| 671 | #define ADVERTISED_10baseT_Half (1 << 0) | 773 | #define ADVERTISED_10baseT_Half (1 << 0) |
| 672 | #define ADVERTISED_10baseT_Full (1 << 1) | 774 | #define ADVERTISED_10baseT_Full (1 << 1) |
| 673 | #define ADVERTISED_100baseT_Half (1 << 2) | 775 | #define ADVERTISED_100baseT_Half (1 << 2) |
| 674 | #define ADVERTISED_100baseT_Full (1 << 3) | 776 | #define ADVERTISED_100baseT_Full (1 << 3) |
| 675 | #define ADVERTISED_1000baseT_Half (1 << 4) | 777 | #define ADVERTISED_1000baseT_Half (1 << 4) |
| @@ -708,12 +810,12 @@ struct ethtool_ops { | |||
| 708 | #define DUPLEX_FULL 0x01 | 810 | #define DUPLEX_FULL 0x01 |
| 709 | 811 | ||
| 710 | /* Which connector port. */ | 812 | /* Which connector port. */ |
| 711 | #define PORT_TP 0x00 | 813 | #define PORT_TP 0x00 |
| 712 | #define PORT_AUI 0x01 | 814 | #define PORT_AUI 0x01 |
| 713 | #define PORT_MII 0x02 | 815 | #define PORT_MII 0x02 |
| 714 | #define PORT_FIBRE 0x03 | 816 | #define PORT_FIBRE 0x03 |
| 715 | #define PORT_BNC 0x04 | 817 | #define PORT_BNC 0x04 |
| 716 | #define PORT_DA 0x05 | 818 | #define PORT_DA 0x05 |
| 717 | #define PORT_NONE 0xef | 819 | #define PORT_NONE 0xef |
| 718 | #define PORT_OTHER 0xff | 820 | #define PORT_OTHER 0xff |
| 719 | 821 | ||
| @@ -727,7 +829,7 @@ struct ethtool_ops { | |||
| 727 | /* Enable or disable autonegotiation. If this is set to enable, | 829 | /* Enable or disable autonegotiation. If this is set to enable, |
| 728 | * the forced link modes above are completely ignored. | 830 | * the forced link modes above are completely ignored. |
| 729 | */ | 831 | */ |
| 730 | #define AUTONEG_DISABLE 0x00 | 832 | #define AUTONEG_DISABLE 0x00 |
| 731 | #define AUTONEG_ENABLE 0x01 | 833 | #define AUTONEG_ENABLE 0x01 |
| 732 | 834 | ||
| 733 | /* Mode MDI or MDI-X */ | 835 | /* Mode MDI or MDI-X */ |
| @@ -744,22 +846,23 @@ struct ethtool_ops { | |||
| 744 | #define WAKE_MAGIC (1 << 5) | 846 | #define WAKE_MAGIC (1 << 5) |
| 745 | #define WAKE_MAGICSECURE (1 << 6) /* only meaningful if WAKE_MAGIC */ | 847 | #define WAKE_MAGICSECURE (1 << 6) /* only meaningful if WAKE_MAGIC */ |
| 746 | 848 | ||
| 747 | /* L3-L4 network traffic flow types */ | 849 | /* L2-L4 network traffic flow types */ |
| 748 | #define TCP_V4_FLOW 0x01 | 850 | #define TCP_V4_FLOW 0x01 /* hash or spec (tcp_ip4_spec) */ |
| 749 | #define UDP_V4_FLOW 0x02 | 851 | #define UDP_V4_FLOW 0x02 /* hash or spec (udp_ip4_spec) */ |
| 750 | #define SCTP_V4_FLOW 0x03 | 852 | #define SCTP_V4_FLOW 0x03 /* hash or spec (sctp_ip4_spec) */ |
| 751 | #define AH_ESP_V4_FLOW 0x04 | 853 | #define AH_ESP_V4_FLOW 0x04 /* hash only */ |
| 752 | #define TCP_V6_FLOW 0x05 | 854 | #define TCP_V6_FLOW 0x05 /* hash only */ |
| 753 | #define UDP_V6_FLOW 0x06 | 855 | #define UDP_V6_FLOW 0x06 /* hash only */ |
| 754 | #define SCTP_V6_FLOW 0x07 | 856 | #define SCTP_V6_FLOW 0x07 /* hash only */ |
| 755 | #define AH_ESP_V6_FLOW 0x08 | 857 | #define AH_ESP_V6_FLOW 0x08 /* hash only */ |
| 756 | #define AH_V4_FLOW 0x09 | 858 | #define AH_V4_FLOW 0x09 /* hash or spec (ah_ip4_spec) */ |
| 757 | #define ESP_V4_FLOW 0x0a | 859 | #define ESP_V4_FLOW 0x0a /* hash or spec (esp_ip4_spec) */ |
| 758 | #define AH_V6_FLOW 0x0b | 860 | #define AH_V6_FLOW 0x0b /* hash only */ |
| 759 | #define ESP_V6_FLOW 0x0c | 861 | #define ESP_V6_FLOW 0x0c /* hash only */ |
| 760 | #define IP_USER_FLOW 0x0d | 862 | #define IP_USER_FLOW 0x0d /* spec only (usr_ip4_spec) */ |
| 761 | #define IPV4_FLOW 0x10 | 863 | #define IPV4_FLOW 0x10 /* hash only */ |
| 762 | #define IPV6_FLOW 0x11 | 864 | #define IPV6_FLOW 0x11 /* hash only */ |
| 865 | #define ETHER_FLOW 0x12 /* spec only (ether_spec) */ | ||
| 763 | 866 | ||
| 764 | /* L3-L4 network traffic flow hash options */ | 867 | /* L3-L4 network traffic flow hash options */ |
| 765 | #define RXH_L2DA (1 << 1) | 868 | #define RXH_L2DA (1 << 1) |
diff --git a/include/linux/exportfs.h b/include/linux/exportfs.h index a9cd507f8cd2..28028988c862 100644 --- a/include/linux/exportfs.h +++ b/include/linux/exportfs.h | |||
| @@ -67,6 +67,19 @@ enum fid_type { | |||
| 67 | * 32 bit parent block number, 32 bit parent generation number | 67 | * 32 bit parent block number, 32 bit parent generation number |
| 68 | */ | 68 | */ |
| 69 | FILEID_UDF_WITH_PARENT = 0x52, | 69 | FILEID_UDF_WITH_PARENT = 0x52, |
| 70 | |||
| 71 | /* | ||
| 72 | * 64 bit checkpoint number, 64 bit inode number, | ||
| 73 | * 32 bit generation number. | ||
| 74 | */ | ||
| 75 | FILEID_NILFS_WITHOUT_PARENT = 0x61, | ||
| 76 | |||
| 77 | /* | ||
| 78 | * 64 bit checkpoint number, 64 bit inode number, | ||
| 79 | * 32 bit generation number, 32 bit parent generation. | ||
| 80 | * 64 bit parent inode number. | ||
| 81 | */ | ||
| 82 | FILEID_NILFS_WITH_PARENT = 0x62, | ||
| 70 | }; | 83 | }; |
| 71 | 84 | ||
| 72 | struct fid { | 85 | struct fid { |
diff --git a/include/linux/ext3_fs.h b/include/linux/ext3_fs.h index 7fc62d4550b2..6ce1bca01724 100644 --- a/include/linux/ext3_fs.h +++ b/include/linux/ext3_fs.h | |||
| @@ -400,7 +400,6 @@ struct ext3_inode { | |||
| 400 | #define EXT3_MOUNT_POSIX_ACL 0x08000 /* POSIX Access Control Lists */ | 400 | #define EXT3_MOUNT_POSIX_ACL 0x08000 /* POSIX Access Control Lists */ |
| 401 | #define EXT3_MOUNT_RESERVATION 0x10000 /* Preallocation */ | 401 | #define EXT3_MOUNT_RESERVATION 0x10000 /* Preallocation */ |
| 402 | #define EXT3_MOUNT_BARRIER 0x20000 /* Use block barriers */ | 402 | #define EXT3_MOUNT_BARRIER 0x20000 /* Use block barriers */ |
| 403 | #define EXT3_MOUNT_NOBH 0x40000 /* No bufferheads */ | ||
| 404 | #define EXT3_MOUNT_QUOTA 0x80000 /* Some quota option set */ | 403 | #define EXT3_MOUNT_QUOTA 0x80000 /* Some quota option set */ |
| 405 | #define EXT3_MOUNT_USRQUOTA 0x100000 /* "old" user quota */ | 404 | #define EXT3_MOUNT_USRQUOTA 0x100000 /* "old" user quota */ |
| 406 | #define EXT3_MOUNT_GRPQUOTA 0x200000 /* "old" group quota */ | 405 | #define EXT3_MOUNT_GRPQUOTA 0x200000 /* "old" group quota */ |
| @@ -896,7 +895,7 @@ int ext3_get_blocks_handle(handle_t *handle, struct inode *inode, | |||
| 896 | extern struct inode *ext3_iget(struct super_block *, unsigned long); | 895 | extern struct inode *ext3_iget(struct super_block *, unsigned long); |
| 897 | extern int ext3_write_inode (struct inode *, struct writeback_control *); | 896 | extern int ext3_write_inode (struct inode *, struct writeback_control *); |
| 898 | extern int ext3_setattr (struct dentry *, struct iattr *); | 897 | extern int ext3_setattr (struct dentry *, struct iattr *); |
| 899 | extern void ext3_delete_inode (struct inode *); | 898 | extern void ext3_evict_inode (struct inode *); |
| 900 | extern int ext3_sync_inode (handle_t *, struct inode *); | 899 | extern int ext3_sync_inode (handle_t *, struct inode *); |
| 901 | extern void ext3_discard_reservation (struct inode *); | 900 | extern void ext3_discard_reservation (struct inode *); |
| 902 | extern void ext3_dirty_inode(struct inode *); | 901 | extern void ext3_dirty_inode(struct inode *); |
diff --git a/include/linux/fanotify.h b/include/linux/fanotify.h new file mode 100644 index 000000000000..63531a6b4d2a --- /dev/null +++ b/include/linux/fanotify.h | |||
| @@ -0,0 +1,98 @@ | |||
| 1 | #ifndef _LINUX_FANOTIFY_H | ||
| 2 | #define _LINUX_FANOTIFY_H | ||
| 3 | |||
| 4 | #include <linux/types.h> | ||
| 5 | |||
| 6 | /* the following events that user-space can register for */ | ||
| 7 | #define FAN_ACCESS 0x00000001 /* File was accessed */ | ||
| 8 | #define FAN_MODIFY 0x00000002 /* File was modified */ | ||
| 9 | #define FAN_CLOSE_WRITE 0x00000008 /* Unwrittable file closed */ | ||
| 10 | #define FAN_CLOSE_NOWRITE 0x00000010 /* Writtable file closed */ | ||
| 11 | #define FAN_OPEN 0x00000020 /* File was opened */ | ||
| 12 | |||
| 13 | #define FAN_EVENT_ON_CHILD 0x08000000 /* interested in child events */ | ||
| 14 | |||
| 15 | /* FIXME currently Q's have no limit.... */ | ||
| 16 | #define FAN_Q_OVERFLOW 0x00004000 /* Event queued overflowed */ | ||
| 17 | |||
| 18 | #define FAN_OPEN_PERM 0x00010000 /* File open in perm check */ | ||
| 19 | #define FAN_ACCESS_PERM 0x00020000 /* File accessed in perm check */ | ||
| 20 | |||
| 21 | /* helper events */ | ||
| 22 | #define FAN_CLOSE (FAN_CLOSE_WRITE | FAN_CLOSE_NOWRITE) /* close */ | ||
| 23 | |||
| 24 | /* flags used for fanotify_init() */ | ||
| 25 | #define FAN_CLOEXEC 0x00000001 | ||
| 26 | #define FAN_NONBLOCK 0x00000002 | ||
| 27 | |||
| 28 | #define FAN_ALL_INIT_FLAGS (FAN_CLOEXEC | FAN_NONBLOCK) | ||
| 29 | |||
| 30 | /* flags used for fanotify_modify_mark() */ | ||
| 31 | #define FAN_MARK_ADD 0x00000001 | ||
| 32 | #define FAN_MARK_REMOVE 0x00000002 | ||
| 33 | #define FAN_MARK_DONT_FOLLOW 0x00000004 | ||
| 34 | #define FAN_MARK_ONLYDIR 0x00000008 | ||
| 35 | #define FAN_MARK_MOUNT 0x00000010 | ||
| 36 | #define FAN_MARK_IGNORED_MASK 0x00000020 | ||
| 37 | #define FAN_MARK_IGNORED_SURV_MODIFY 0x00000040 | ||
| 38 | #define FAN_MARK_FLUSH 0x00000080 | ||
| 39 | |||
| 40 | #define FAN_ALL_MARK_FLAGS (FAN_MARK_ADD |\ | ||
| 41 | FAN_MARK_REMOVE |\ | ||
| 42 | FAN_MARK_DONT_FOLLOW |\ | ||
| 43 | FAN_MARK_ONLYDIR |\ | ||
| 44 | FAN_MARK_MOUNT |\ | ||
| 45 | FAN_MARK_IGNORED_MASK |\ | ||
| 46 | FAN_MARK_IGNORED_SURV_MODIFY) | ||
| 47 | |||
| 48 | /* | ||
| 49 | * All of the events - we build the list by hand so that we can add flags in | ||
| 50 | * the future and not break backward compatibility. Apps will get only the | ||
| 51 | * events that they originally wanted. Be sure to add new events here! | ||
| 52 | */ | ||
| 53 | #define FAN_ALL_EVENTS (FAN_ACCESS |\ | ||
| 54 | FAN_MODIFY |\ | ||
| 55 | FAN_CLOSE |\ | ||
| 56 | FAN_OPEN) | ||
| 57 | |||
| 58 | /* | ||
| 59 | * All events which require a permission response from userspace | ||
| 60 | */ | ||
| 61 | #define FAN_ALL_PERM_EVENTS (FAN_OPEN_PERM |\ | ||
| 62 | FAN_ACCESS_PERM) | ||
| 63 | |||
| 64 | #define FAN_ALL_OUTGOING_EVENTS (FAN_ALL_EVENTS |\ | ||
| 65 | FAN_ALL_PERM_EVENTS |\ | ||
| 66 | FAN_Q_OVERFLOW) | ||
| 67 | |||
| 68 | #define FANOTIFY_METADATA_VERSION 2 | ||
| 69 | |||
| 70 | struct fanotify_event_metadata { | ||
| 71 | __u32 event_len; | ||
| 72 | __u32 vers; | ||
| 73 | __u64 mask; | ||
| 74 | __s32 fd; | ||
| 75 | __s32 pid; | ||
| 76 | } __attribute__ ((packed)); | ||
| 77 | |||
| 78 | struct fanotify_response { | ||
| 79 | __s32 fd; | ||
| 80 | __u32 response; | ||
| 81 | } __attribute__ ((packed)); | ||
| 82 | |||
| 83 | /* Legit userspace responses to a _PERM event */ | ||
| 84 | #define FAN_ALLOW 0x01 | ||
| 85 | #define FAN_DENY 0x02 | ||
| 86 | |||
| 87 | /* Helper functions to deal with fanotify_event_metadata buffers */ | ||
| 88 | #define FAN_EVENT_METADATA_LEN (sizeof(struct fanotify_event_metadata)) | ||
| 89 | |||
| 90 | #define FAN_EVENT_NEXT(meta, len) ((len) -= (meta)->event_len, \ | ||
| 91 | (struct fanotify_event_metadata*)(((char *)(meta)) + \ | ||
| 92 | (meta)->event_len)) | ||
| 93 | |||
| 94 | #define FAN_EVENT_OK(meta, len) ((long)(len) >= (long)FAN_EVENT_METADATA_LEN && \ | ||
| 95 | (long)(meta)->event_len >= (long)FAN_EVENT_METADATA_LEN && \ | ||
| 96 | (long)(meta)->event_len <= (long)(len)) | ||
| 97 | |||
| 98 | #endif /* _LINUX_FANOTIFY_H */ | ||
diff --git a/include/linux/fb.h b/include/linux/fb.h index e7445df44d6c..7fca3dc4e475 100644 --- a/include/linux/fb.h +++ b/include/linux/fb.h | |||
| @@ -3,6 +3,9 @@ | |||
| 3 | 3 | ||
| 4 | #include <linux/types.h> | 4 | #include <linux/types.h> |
| 5 | #include <linux/i2c.h> | 5 | #include <linux/i2c.h> |
| 6 | #ifdef __KERNEL__ | ||
| 7 | #include <linux/kgdb.h> | ||
| 8 | #endif /* __KERNEL__ */ | ||
| 6 | 9 | ||
| 7 | /* Definitions of frame buffers */ | 10 | /* Definitions of frame buffers */ |
| 8 | 11 | ||
| @@ -607,6 +610,12 @@ struct fb_deferred_io { | |||
| 607 | * LOCKING NOTE: those functions must _ALL_ be called with the console | 610 | * LOCKING NOTE: those functions must _ALL_ be called with the console |
| 608 | * semaphore held, this is the only suitable locking mechanism we have | 611 | * semaphore held, this is the only suitable locking mechanism we have |
| 609 | * in 2.6. Some may be called at interrupt time at this point though. | 612 | * in 2.6. Some may be called at interrupt time at this point though. |
| 613 | * | ||
| 614 | * The exception to this is the debug related hooks. Putting the fb | ||
| 615 | * into a debug state (e.g. flipping to the kernel console) and restoring | ||
| 616 | * it must be done in a lock-free manner, so low level drivers should | ||
| 617 | * keep track of the initial console (if applicable) and may need to | ||
| 618 | * perform direct, unlocked hardware writes in these hooks. | ||
| 610 | */ | 619 | */ |
| 611 | 620 | ||
| 612 | struct fb_ops { | 621 | struct fb_ops { |
| @@ -676,6 +685,10 @@ struct fb_ops { | |||
| 676 | 685 | ||
| 677 | /* teardown any resources to do with this framebuffer */ | 686 | /* teardown any resources to do with this framebuffer */ |
| 678 | void (*fb_destroy)(struct fb_info *info); | 687 | void (*fb_destroy)(struct fb_info *info); |
| 688 | |||
| 689 | /* called at KDB enter and leave time to prepare the console */ | ||
| 690 | int (*fb_debug_enter)(struct fb_info *info); | ||
| 691 | int (*fb_debug_leave)(struct fb_info *info); | ||
| 679 | }; | 692 | }; |
| 680 | 693 | ||
| 681 | #ifdef CONFIG_FB_TILEBLITTING | 694 | #ifdef CONFIG_FB_TILEBLITTING |
| @@ -812,6 +825,10 @@ struct fb_tile_ops { | |||
| 812 | */ | 825 | */ |
| 813 | #define FBINFO_BE_MATH 0x100000 | 826 | #define FBINFO_BE_MATH 0x100000 |
| 814 | 827 | ||
| 828 | /* report to the VT layer that this fb driver can accept forced console | ||
| 829 | output like oopses */ | ||
| 830 | #define FBINFO_CAN_FORCE_OUTPUT 0x200000 | ||
| 831 | |||
| 815 | struct fb_info { | 832 | struct fb_info { |
| 816 | int node; | 833 | int node; |
| 817 | int flags; | 834 | int flags; |
| @@ -914,6 +931,8 @@ static inline struct apertures_struct *alloc_apertures(unsigned int max_num) { | |||
| 914 | #define fb_writel sbus_writel | 931 | #define fb_writel sbus_writel |
| 915 | #define fb_writeq sbus_writeq | 932 | #define fb_writeq sbus_writeq |
| 916 | #define fb_memset sbus_memset_io | 933 | #define fb_memset sbus_memset_io |
| 934 | #define fb_memcpy_fromfb sbus_memcpy_fromio | ||
| 935 | #define fb_memcpy_tofb sbus_memcpy_toio | ||
| 917 | 936 | ||
| 918 | #elif defined(__i386__) || defined(__alpha__) || defined(__x86_64__) || defined(__hppa__) || defined(__sh__) || defined(__powerpc__) || defined(__avr32__) || defined(__bfin__) | 937 | #elif defined(__i386__) || defined(__alpha__) || defined(__x86_64__) || defined(__hppa__) || defined(__sh__) || defined(__powerpc__) || defined(__avr32__) || defined(__bfin__) |
| 919 | 938 | ||
| @@ -926,6 +945,8 @@ static inline struct apertures_struct *alloc_apertures(unsigned int max_num) { | |||
| 926 | #define fb_writel __raw_writel | 945 | #define fb_writel __raw_writel |
| 927 | #define fb_writeq __raw_writeq | 946 | #define fb_writeq __raw_writeq |
| 928 | #define fb_memset memset_io | 947 | #define fb_memset memset_io |
| 948 | #define fb_memcpy_fromfb memcpy_fromio | ||
| 949 | #define fb_memcpy_tofb memcpy_toio | ||
| 929 | 950 | ||
| 930 | #else | 951 | #else |
| 931 | 952 | ||
| @@ -938,6 +959,8 @@ static inline struct apertures_struct *alloc_apertures(unsigned int max_num) { | |||
| 938 | #define fb_writel(b,addr) (*(volatile u32 *) (addr) = (b)) | 959 | #define fb_writel(b,addr) (*(volatile u32 *) (addr) = (b)) |
| 939 | #define fb_writeq(b,addr) (*(volatile u64 *) (addr) = (b)) | 960 | #define fb_writeq(b,addr) (*(volatile u64 *) (addr) = (b)) |
| 940 | #define fb_memset memset | 961 | #define fb_memset memset |
| 962 | #define fb_memcpy_fromfb memcpy | ||
| 963 | #define fb_memcpy_tofb memcpy | ||
| 941 | 964 | ||
| 942 | #endif | 965 | #endif |
| 943 | 966 | ||
diff --git a/include/linux/fdreg.h b/include/linux/fdreg.h index c2eeb63b72db..61ce64169004 100644 --- a/include/linux/fdreg.h +++ b/include/linux/fdreg.h | |||
| @@ -89,7 +89,7 @@ | |||
| 89 | /* the following commands are new in the 82078. They are not used in the | 89 | /* the following commands are new in the 82078. They are not used in the |
| 90 | * floppy driver, except the first three. These commands may be useful for apps | 90 | * floppy driver, except the first three. These commands may be useful for apps |
| 91 | * which use the FDRAWCMD interface. For doc, get the 82078 spec sheets at | 91 | * which use the FDRAWCMD interface. For doc, get the 82078 spec sheets at |
| 92 | * http://www-techdoc.intel.com/docs/periph/fd_contr/datasheets/ */ | 92 | * http://www.intel.com/design/archives/periphrl/docs/29046803.htm */ |
| 93 | 93 | ||
| 94 | #define FD_PARTID 0x18 /* part id ("extended" version cmd) */ | 94 | #define FD_PARTID 0x18 /* part id ("extended" version cmd) */ |
| 95 | #define FD_SAVE 0x2e /* save fdc regs for later restore */ | 95 | #define FD_SAVE 0x2e /* save fdc regs for later restore */ |
diff --git a/include/linux/fdtable.h b/include/linux/fdtable.h index d147461bc271..133c0ba25e30 100644 --- a/include/linux/fdtable.h +++ b/include/linux/fdtable.h | |||
| @@ -11,6 +11,7 @@ | |||
| 11 | #include <linux/rcupdate.h> | 11 | #include <linux/rcupdate.h> |
| 12 | #include <linux/types.h> | 12 | #include <linux/types.h> |
| 13 | #include <linux/init.h> | 13 | #include <linux/init.h> |
| 14 | #include <linux/fs.h> | ||
| 14 | 15 | ||
| 15 | #include <asm/atomic.h> | 16 | #include <asm/atomic.h> |
| 16 | 17 | ||
| @@ -30,7 +31,7 @@ struct embedded_fd_set { | |||
| 30 | 31 | ||
| 31 | struct fdtable { | 32 | struct fdtable { |
| 32 | unsigned int max_fds; | 33 | unsigned int max_fds; |
| 33 | struct file ** fd; /* current fd array */ | 34 | struct file __rcu **fd; /* current fd array */ |
| 34 | fd_set *close_on_exec; | 35 | fd_set *close_on_exec; |
| 35 | fd_set *open_fds; | 36 | fd_set *open_fds; |
| 36 | struct rcu_head rcu; | 37 | struct rcu_head rcu; |
| @@ -45,7 +46,7 @@ struct files_struct { | |||
| 45 | * read mostly part | 46 | * read mostly part |
| 46 | */ | 47 | */ |
| 47 | atomic_t count; | 48 | atomic_t count; |
| 48 | struct fdtable *fdt; | 49 | struct fdtable __rcu *fdt; |
| 49 | struct fdtable fdtab; | 50 | struct fdtable fdtab; |
| 50 | /* | 51 | /* |
| 51 | * written part on a separate cache line in SMP | 52 | * written part on a separate cache line in SMP |
| @@ -54,7 +55,7 @@ struct files_struct { | |||
| 54 | int next_fd; | 55 | int next_fd; |
| 55 | struct embedded_fd_set close_on_exec_init; | 56 | struct embedded_fd_set close_on_exec_init; |
| 56 | struct embedded_fd_set open_fds_init; | 57 | struct embedded_fd_set open_fds_init; |
| 57 | struct file * fd_array[NR_OPEN_DEFAULT]; | 58 | struct file __rcu * fd_array[NR_OPEN_DEFAULT]; |
| 58 | }; | 59 | }; |
| 59 | 60 | ||
| 60 | #define rcu_dereference_check_fdtable(files, fdtfd) \ | 61 | #define rcu_dereference_check_fdtable(files, fdtfd) \ |
diff --git a/include/linux/filter.h b/include/linux/filter.h index 151f5d703b7e..69b43dbea6c6 100644 --- a/include/linux/filter.h +++ b/include/linux/filter.h | |||
| @@ -91,6 +91,54 @@ struct sock_fprog { /* Required for SO_ATTACH_FILTER. */ | |||
| 91 | #define BPF_TAX 0x00 | 91 | #define BPF_TAX 0x00 |
| 92 | #define BPF_TXA 0x80 | 92 | #define BPF_TXA 0x80 |
| 93 | 93 | ||
| 94 | enum { | ||
| 95 | BPF_S_RET_K = 0, | ||
| 96 | BPF_S_RET_A, | ||
| 97 | BPF_S_ALU_ADD_K, | ||
| 98 | BPF_S_ALU_ADD_X, | ||
| 99 | BPF_S_ALU_SUB_K, | ||
| 100 | BPF_S_ALU_SUB_X, | ||
| 101 | BPF_S_ALU_MUL_K, | ||
| 102 | BPF_S_ALU_MUL_X, | ||
| 103 | BPF_S_ALU_DIV_X, | ||
| 104 | BPF_S_ALU_AND_K, | ||
| 105 | BPF_S_ALU_AND_X, | ||
| 106 | BPF_S_ALU_OR_K, | ||
| 107 | BPF_S_ALU_OR_X, | ||
| 108 | BPF_S_ALU_LSH_K, | ||
| 109 | BPF_S_ALU_LSH_X, | ||
| 110 | BPF_S_ALU_RSH_K, | ||
| 111 | BPF_S_ALU_RSH_X, | ||
| 112 | BPF_S_ALU_NEG, | ||
| 113 | BPF_S_LD_W_ABS, | ||
| 114 | BPF_S_LD_H_ABS, | ||
| 115 | BPF_S_LD_B_ABS, | ||
| 116 | BPF_S_LD_W_LEN, | ||
| 117 | BPF_S_LD_W_IND, | ||
| 118 | BPF_S_LD_H_IND, | ||
| 119 | BPF_S_LD_B_IND, | ||
| 120 | BPF_S_LD_IMM, | ||
| 121 | BPF_S_LDX_W_LEN, | ||
| 122 | BPF_S_LDX_B_MSH, | ||
| 123 | BPF_S_LDX_IMM, | ||
| 124 | BPF_S_MISC_TAX, | ||
| 125 | BPF_S_MISC_TXA, | ||
| 126 | BPF_S_ALU_DIV_K, | ||
| 127 | BPF_S_LD_MEM, | ||
| 128 | BPF_S_LDX_MEM, | ||
| 129 | BPF_S_ST, | ||
| 130 | BPF_S_STX, | ||
| 131 | BPF_S_JMP_JA, | ||
| 132 | BPF_S_JMP_JEQ_K, | ||
| 133 | BPF_S_JMP_JEQ_X, | ||
| 134 | BPF_S_JMP_JGE_K, | ||
| 135 | BPF_S_JMP_JGE_X, | ||
| 136 | BPF_S_JMP_JGT_K, | ||
| 137 | BPF_S_JMP_JGT_X, | ||
| 138 | BPF_S_JMP_JSET_K, | ||
| 139 | BPF_S_JMP_JSET_X, | ||
| 140 | }; | ||
| 141 | |||
| 94 | #ifndef BPF_MAXINSNS | 142 | #ifndef BPF_MAXINSNS |
| 95 | #define BPF_MAXINSNS 4096 | 143 | #define BPF_MAXINSNS 4096 |
| 96 | #endif | 144 | #endif |
diff --git a/include/linux/firewire-cdev.h b/include/linux/firewire-cdev.h index 68f883b30a53..68c642d8843d 100644 --- a/include/linux/firewire-cdev.h +++ b/include/linux/firewire-cdev.h | |||
| @@ -30,12 +30,18 @@ | |||
| 30 | #include <linux/types.h> | 30 | #include <linux/types.h> |
| 31 | #include <linux/firewire-constants.h> | 31 | #include <linux/firewire-constants.h> |
| 32 | 32 | ||
| 33 | #define FW_CDEV_EVENT_BUS_RESET 0x00 | 33 | #define FW_CDEV_EVENT_BUS_RESET 0x00 |
| 34 | #define FW_CDEV_EVENT_RESPONSE 0x01 | 34 | #define FW_CDEV_EVENT_RESPONSE 0x01 |
| 35 | #define FW_CDEV_EVENT_REQUEST 0x02 | 35 | #define FW_CDEV_EVENT_REQUEST 0x02 |
| 36 | #define FW_CDEV_EVENT_ISO_INTERRUPT 0x03 | 36 | #define FW_CDEV_EVENT_ISO_INTERRUPT 0x03 |
| 37 | #define FW_CDEV_EVENT_ISO_RESOURCE_ALLOCATED 0x04 | 37 | #define FW_CDEV_EVENT_ISO_RESOURCE_ALLOCATED 0x04 |
| 38 | #define FW_CDEV_EVENT_ISO_RESOURCE_DEALLOCATED 0x05 | 38 | #define FW_CDEV_EVENT_ISO_RESOURCE_DEALLOCATED 0x05 |
| 39 | |||
| 40 | /* available since kernel version 2.6.36 */ | ||
| 41 | #define FW_CDEV_EVENT_REQUEST2 0x06 | ||
| 42 | #define FW_CDEV_EVENT_PHY_PACKET_SENT 0x07 | ||
| 43 | #define FW_CDEV_EVENT_PHY_PACKET_RECEIVED 0x08 | ||
| 44 | #define FW_CDEV_EVENT_ISO_INTERRUPT_MULTICHANNEL 0x09 | ||
| 39 | 45 | ||
| 40 | /** | 46 | /** |
| 41 | * struct fw_cdev_event_common - Common part of all fw_cdev_event_ types | 47 | * struct fw_cdev_event_common - Common part of all fw_cdev_event_ types |
| @@ -68,6 +74,10 @@ struct fw_cdev_event_common { | |||
| 68 | * This event is sent when the bus the device belongs to goes through a bus | 74 | * This event is sent when the bus the device belongs to goes through a bus |
| 69 | * reset. It provides information about the new bus configuration, such as | 75 | * reset. It provides information about the new bus configuration, such as |
| 70 | * new node ID for this device, new root ID, and others. | 76 | * new node ID for this device, new root ID, and others. |
| 77 | * | ||
| 78 | * If @bm_node_id is 0xffff right after bus reset it can be reread by an | ||
| 79 | * %FW_CDEV_IOC_GET_INFO ioctl after bus manager selection was finished. | ||
| 80 | * Kernels with ABI version < 4 do not set @bm_node_id. | ||
| 71 | */ | 81 | */ |
| 72 | struct fw_cdev_event_bus_reset { | 82 | struct fw_cdev_event_bus_reset { |
| 73 | __u64 closure; | 83 | __u64 closure; |
| @@ -82,8 +92,9 @@ struct fw_cdev_event_bus_reset { | |||
| 82 | 92 | ||
| 83 | /** | 93 | /** |
| 84 | * struct fw_cdev_event_response - Sent when a response packet was received | 94 | * struct fw_cdev_event_response - Sent when a response packet was received |
| 85 | * @closure: See &fw_cdev_event_common; | 95 | * @closure: See &fw_cdev_event_common; set by %FW_CDEV_IOC_SEND_REQUEST |
| 86 | * set by %FW_CDEV_IOC_SEND_REQUEST ioctl | 96 | * or %FW_CDEV_IOC_SEND_BROADCAST_REQUEST |
| 97 | * or %FW_CDEV_IOC_SEND_STREAM_PACKET ioctl | ||
| 87 | * @type: See &fw_cdev_event_common; always %FW_CDEV_EVENT_RESPONSE | 98 | * @type: See &fw_cdev_event_common; always %FW_CDEV_EVENT_RESPONSE |
| 88 | * @rcode: Response code returned by the remote node | 99 | * @rcode: Response code returned by the remote node |
| 89 | * @length: Data length, i.e. the response's payload size in bytes | 100 | * @length: Data length, i.e. the response's payload size in bytes |
| @@ -93,6 +104,11 @@ struct fw_cdev_event_bus_reset { | |||
| 93 | * sent by %FW_CDEV_IOC_SEND_REQUEST ioctl. The payload data for responses | 104 | * sent by %FW_CDEV_IOC_SEND_REQUEST ioctl. The payload data for responses |
| 94 | * carrying data (read and lock responses) follows immediately and can be | 105 | * carrying data (read and lock responses) follows immediately and can be |
| 95 | * accessed through the @data field. | 106 | * accessed through the @data field. |
| 107 | * | ||
| 108 | * The event is also generated after conclusions of transactions that do not | ||
| 109 | * involve response packets. This includes unified write transactions, | ||
| 110 | * broadcast write transactions, and transmission of asynchronous stream | ||
| 111 | * packets. @rcode indicates success or failure of such transmissions. | ||
| 96 | */ | 112 | */ |
| 97 | struct fw_cdev_event_response { | 113 | struct fw_cdev_event_response { |
| 98 | __u64 closure; | 114 | __u64 closure; |
| @@ -103,11 +119,46 @@ struct fw_cdev_event_response { | |||
| 103 | }; | 119 | }; |
| 104 | 120 | ||
| 105 | /** | 121 | /** |
| 106 | * struct fw_cdev_event_request - Sent on incoming request to an address region | 122 | * struct fw_cdev_event_request - Old version of &fw_cdev_event_request2 |
| 107 | * @closure: See &fw_cdev_event_common; set by %FW_CDEV_IOC_ALLOCATE ioctl | 123 | * @closure: See &fw_cdev_event_common; set by %FW_CDEV_IOC_ALLOCATE ioctl |
| 108 | * @type: See &fw_cdev_event_common; always %FW_CDEV_EVENT_REQUEST | 124 | * @type: See &fw_cdev_event_common; always %FW_CDEV_EVENT_REQUEST |
| 125 | * @tcode: See &fw_cdev_event_request2 | ||
| 126 | * @offset: See &fw_cdev_event_request2 | ||
| 127 | * @handle: See &fw_cdev_event_request2 | ||
| 128 | * @length: See &fw_cdev_event_request2 | ||
| 129 | * @data: See &fw_cdev_event_request2 | ||
| 130 | * | ||
| 131 | * This event is sent instead of &fw_cdev_event_request2 if the kernel or | ||
| 132 | * the client implements ABI version <= 3. | ||
| 133 | * | ||
| 134 | * Unlike &fw_cdev_event_request2, the sender identity cannot be established, | ||
| 135 | * broadcast write requests cannot be distinguished from unicast writes, and | ||
| 136 | * @tcode of lock requests is %TCODE_LOCK_REQUEST. | ||
| 137 | * | ||
| 138 | * Requests to the FCP_REQUEST or FCP_RESPONSE register are responded to as | ||
| 139 | * with &fw_cdev_event_request2, except in kernel 2.6.32 and older which send | ||
| 140 | * the response packet of the client's %FW_CDEV_IOC_SEND_RESPONSE ioctl. | ||
| 141 | */ | ||
| 142 | struct fw_cdev_event_request { | ||
| 143 | __u64 closure; | ||
| 144 | __u32 type; | ||
| 145 | __u32 tcode; | ||
| 146 | __u64 offset; | ||
| 147 | __u32 handle; | ||
| 148 | __u32 length; | ||
| 149 | __u32 data[0]; | ||
| 150 | }; | ||
| 151 | |||
| 152 | /** | ||
| 153 | * struct fw_cdev_event_request2 - Sent on incoming request to an address region | ||
| 154 | * @closure: See &fw_cdev_event_common; set by %FW_CDEV_IOC_ALLOCATE ioctl | ||
| 155 | * @type: See &fw_cdev_event_common; always %FW_CDEV_EVENT_REQUEST2 | ||
| 109 | * @tcode: Transaction code of the incoming request | 156 | * @tcode: Transaction code of the incoming request |
| 110 | * @offset: The offset into the 48-bit per-node address space | 157 | * @offset: The offset into the 48-bit per-node address space |
| 158 | * @source_node_id: Sender node ID | ||
| 159 | * @destination_node_id: Destination node ID | ||
| 160 | * @card: The index of the card from which the request came | ||
| 161 | * @generation: Bus generation in which the request is valid | ||
| 111 | * @handle: Reference to the kernel-side pending request | 162 | * @handle: Reference to the kernel-side pending request |
| 112 | * @length: Data length, i.e. the request's payload size in bytes | 163 | * @length: Data length, i.e. the request's payload size in bytes |
| 113 | * @data: Incoming data, if any | 164 | * @data: Incoming data, if any |
| @@ -120,12 +171,42 @@ struct fw_cdev_event_response { | |||
| 120 | * | 171 | * |
| 121 | * The payload data for requests carrying data (write and lock requests) | 172 | * The payload data for requests carrying data (write and lock requests) |
| 122 | * follows immediately and can be accessed through the @data field. | 173 | * follows immediately and can be accessed through the @data field. |
| 174 | * | ||
| 175 | * Unlike &fw_cdev_event_request, @tcode of lock requests is one of the | ||
| 176 | * firewire-core specific %TCODE_LOCK_MASK_SWAP...%TCODE_LOCK_VENDOR_DEPENDENT, | ||
| 177 | * i.e. encodes the extended transaction code. | ||
| 178 | * | ||
| 179 | * @card may differ from &fw_cdev_get_info.card because requests are received | ||
| 180 | * from all cards of the Linux host. @source_node_id, @destination_node_id, and | ||
| 181 | * @generation pertain to that card. Destination node ID and bus generation may | ||
| 182 | * therefore differ from the corresponding fields of the last | ||
| 183 | * &fw_cdev_event_bus_reset. | ||
| 184 | * | ||
| 185 | * @destination_node_id may also differ from the current node ID because of a | ||
| 186 | * non-local bus ID part or in case of a broadcast write request. Note, a | ||
| 187 | * client must call an %FW_CDEV_IOC_SEND_RESPONSE ioctl even in case of a | ||
| 188 | * broadcast write request; the kernel will then release the kernel-side pending | ||
| 189 | * request but will not actually send a response packet. | ||
| 190 | * | ||
| 191 | * In case of a write request to FCP_REQUEST or FCP_RESPONSE, the kernel already | ||
| 192 | * sent a write response immediately after the request was received; in this | ||
| 193 | * case the client must still call an %FW_CDEV_IOC_SEND_RESPONSE ioctl to | ||
| 194 | * release the kernel-side pending request, though another response won't be | ||
| 195 | * sent. | ||
| 196 | * | ||
| 197 | * If the client subsequently needs to initiate requests to the sender node of | ||
| 198 | * an &fw_cdev_event_request2, it needs to use a device file with matching | ||
| 199 | * card index, node ID, and generation for outbound requests. | ||
| 123 | */ | 200 | */ |
| 124 | struct fw_cdev_event_request { | 201 | struct fw_cdev_event_request2 { |
| 125 | __u64 closure; | 202 | __u64 closure; |
| 126 | __u32 type; | 203 | __u32 type; |
| 127 | __u32 tcode; | 204 | __u32 tcode; |
| 128 | __u64 offset; | 205 | __u64 offset; |
| 206 | __u32 source_node_id; | ||
| 207 | __u32 destination_node_id; | ||
| 208 | __u32 card; | ||
| 209 | __u32 generation; | ||
| 129 | __u32 handle; | 210 | __u32 handle; |
| 130 | __u32 length; | 211 | __u32 length; |
| 131 | __u32 data[0]; | 212 | __u32 data[0]; |
| @@ -141,26 +222,43 @@ struct fw_cdev_event_request { | |||
| 141 | * @header: Stripped headers, if any | 222 | * @header: Stripped headers, if any |
| 142 | * | 223 | * |
| 143 | * This event is sent when the controller has completed an &fw_cdev_iso_packet | 224 | * This event is sent when the controller has completed an &fw_cdev_iso_packet |
| 144 | * with the %FW_CDEV_ISO_INTERRUPT bit set. In the receive case, the headers | 225 | * with the %FW_CDEV_ISO_INTERRUPT bit set. |
| 145 | * stripped of all packets up until and including the interrupt packet are | ||
| 146 | * returned in the @header field. The amount of header data per packet is as | ||
| 147 | * specified at iso context creation by &fw_cdev_create_iso_context.header_size. | ||
| 148 | * | 226 | * |
| 149 | * In version 1 of this ABI, header data consisted of the 1394 isochronous | 227 | * Isochronous transmit events (context type %FW_CDEV_ISO_CONTEXT_TRANSMIT): |
| 150 | * packet header, followed by quadlets from the packet payload if | ||
| 151 | * &fw_cdev_create_iso_context.header_size > 4. | ||
| 152 | * | 228 | * |
| 153 | * In version 2 of this ABI, header data consist of the 1394 isochronous | 229 | * In version 3 and some implementations of version 2 of the ABI, &header_length |
| 154 | * packet header, followed by a timestamp quadlet if | 230 | * is a multiple of 4 and &header contains timestamps of all packets up until |
| 155 | * &fw_cdev_create_iso_context.header_size > 4, followed by quadlets from the | 231 | * the interrupt packet. The format of the timestamps is as described below for |
| 156 | * packet payload if &fw_cdev_create_iso_context.header_size > 8. | 232 | * isochronous reception. In version 1 of the ABI, &header_length was 0. |
| 157 | * | 233 | * |
| 158 | * Behaviour of ver. 1 of this ABI is no longer available since ABI ver. 2. | 234 | * Isochronous receive events (context type %FW_CDEV_ISO_CONTEXT_RECEIVE): |
| 235 | * | ||
| 236 | * The headers stripped of all packets up until and including the interrupt | ||
| 237 | * packet are returned in the @header field. The amount of header data per | ||
| 238 | * packet is as specified at iso context creation by | ||
| 239 | * &fw_cdev_create_iso_context.header_size. | ||
| 240 | * | ||
| 241 | * Hence, _interrupt.header_length / _context.header_size is the number of | ||
| 242 | * packets received in this interrupt event. The client can now iterate | ||
| 243 | * through the mmap()'ed DMA buffer according to this number of packets and | ||
| 244 | * to the buffer sizes as the client specified in &fw_cdev_queue_iso. | ||
| 245 | * | ||
| 246 | * Since version 2 of this ABI, the portion for each packet in _interrupt.header | ||
| 247 | * consists of the 1394 isochronous packet header, followed by a timestamp | ||
| 248 | * quadlet if &fw_cdev_create_iso_context.header_size > 4, followed by quadlets | ||
| 249 | * from the packet payload if &fw_cdev_create_iso_context.header_size > 8. | ||
| 159 | * | 250 | * |
| 160 | * Format of 1394 iso packet header: 16 bits len, 2 bits tag, 6 bits channel, | 251 | * Format of 1394 iso packet header: 16 bits data_length, 2 bits tag, 6 bits |
| 161 | * 4 bits tcode, 4 bits sy, in big endian byte order. Format of timestamp: | 252 | * channel, 4 bits tcode, 4 bits sy, in big endian byte order. |
| 162 | * 16 bits invalid, 3 bits cycleSeconds, 13 bits cycleCount, in big endian byte | 253 | * data_length is the actual received size of the packet without the four |
| 163 | * order. | 254 | * 1394 iso packet header bytes. |
| 255 | * | ||
| 256 | * Format of timestamp: 16 bits invalid, 3 bits cycleSeconds, 13 bits | ||
| 257 | * cycleCount, in big endian byte order. | ||
| 258 | * | ||
| 259 | * In version 1 of the ABI, no timestamp quadlet was inserted; instead, payload | ||
| 260 | * data followed directly after the 1394 is header if header_size > 4. | ||
| 261 | * Behaviour of ver. 1 of this ABI is no longer available since ABI ver. 2. | ||
| 164 | */ | 262 | */ |
| 165 | struct fw_cdev_event_iso_interrupt { | 263 | struct fw_cdev_event_iso_interrupt { |
| 166 | __u64 closure; | 264 | __u64 closure; |
| @@ -171,6 +269,43 @@ struct fw_cdev_event_iso_interrupt { | |||
| 171 | }; | 269 | }; |
| 172 | 270 | ||
| 173 | /** | 271 | /** |
| 272 | * struct fw_cdev_event_iso_interrupt_mc - An iso buffer chunk was completed | ||
| 273 | * @closure: See &fw_cdev_event_common; | ||
| 274 | * set by %FW_CDEV_CREATE_ISO_CONTEXT ioctl | ||
| 275 | * @type: %FW_CDEV_EVENT_ISO_INTERRUPT_MULTICHANNEL | ||
| 276 | * @completed: Offset into the receive buffer; data before this offest is valid | ||
| 277 | * | ||
| 278 | * This event is sent in multichannel contexts (context type | ||
| 279 | * %FW_CDEV_ISO_CONTEXT_RECEIVE_MULTICHANNEL) for &fw_cdev_iso_packet buffer | ||
| 280 | * chunks that have the %FW_CDEV_ISO_INTERRUPT bit set. Whether this happens | ||
| 281 | * when a packet is completed and/or when a buffer chunk is completed depends | ||
| 282 | * on the hardware implementation. | ||
| 283 | * | ||
| 284 | * The buffer is continuously filled with the following data, per packet: | ||
| 285 | * - the 1394 iso packet header as described at &fw_cdev_event_iso_interrupt, | ||
| 286 | * but in little endian byte order, | ||
| 287 | * - packet payload (as many bytes as specified in the data_length field of | ||
| 288 | * the 1394 iso packet header) in big endian byte order, | ||
| 289 | * - 0...3 padding bytes as needed to align the following trailer quadlet, | ||
| 290 | * - trailer quadlet, containing the reception timestamp as described at | ||
| 291 | * &fw_cdev_event_iso_interrupt, but in little endian byte order. | ||
| 292 | * | ||
| 293 | * Hence the per-packet size is data_length (rounded up to a multiple of 4) + 8. | ||
| 294 | * When processing the data, stop before a packet that would cross the | ||
| 295 | * @completed offset. | ||
| 296 | * | ||
| 297 | * A packet near the end of a buffer chunk will typically spill over into the | ||
| 298 | * next queued buffer chunk. It is the responsibility of the client to check | ||
| 299 | * for this condition, assemble a broken-up packet from its parts, and not to | ||
| 300 | * re-queue any buffer chunks in which as yet unread packet parts reside. | ||
| 301 | */ | ||
| 302 | struct fw_cdev_event_iso_interrupt_mc { | ||
| 303 | __u64 closure; | ||
| 304 | __u32 type; | ||
| 305 | __u32 completed; | ||
| 306 | }; | ||
| 307 | |||
| 308 | /** | ||
| 174 | * struct fw_cdev_event_iso_resource - Iso resources were allocated or freed | 309 | * struct fw_cdev_event_iso_resource - Iso resources were allocated or freed |
| 175 | * @closure: See &fw_cdev_event_common; | 310 | * @closure: See &fw_cdev_event_common; |
| 176 | * set by %FW_CDEV_IOC_(DE)ALLOCATE_ISO_RESOURCE(_ONCE) ioctl | 311 | * set by %FW_CDEV_IOC_(DE)ALLOCATE_ISO_RESOURCE(_ONCE) ioctl |
| @@ -200,15 +335,45 @@ struct fw_cdev_event_iso_resource { | |||
| 200 | }; | 335 | }; |
| 201 | 336 | ||
| 202 | /** | 337 | /** |
| 338 | * struct fw_cdev_event_phy_packet - A PHY packet was transmitted or received | ||
| 339 | * @closure: See &fw_cdev_event_common; set by %FW_CDEV_IOC_SEND_PHY_PACKET | ||
| 340 | * or %FW_CDEV_IOC_RECEIVE_PHY_PACKETS ioctl | ||
| 341 | * @type: %FW_CDEV_EVENT_PHY_PACKET_SENT or %..._RECEIVED | ||
| 342 | * @rcode: %RCODE_..., indicates success or failure of transmission | ||
| 343 | * @length: Data length in bytes | ||
| 344 | * @data: Incoming data | ||
| 345 | * | ||
| 346 | * If @type is %FW_CDEV_EVENT_PHY_PACKET_SENT, @length is 0 and @data empty, | ||
| 347 | * except in case of a ping packet: Then, @length is 4, and @data[0] is the | ||
| 348 | * ping time in 49.152MHz clocks if @rcode is %RCODE_COMPLETE. | ||
| 349 | * | ||
| 350 | * If @type is %FW_CDEV_EVENT_PHY_PACKET_RECEIVED, @length is 8 and @data | ||
| 351 | * consists of the two PHY packet quadlets, in host byte order. | ||
| 352 | */ | ||
| 353 | struct fw_cdev_event_phy_packet { | ||
| 354 | __u64 closure; | ||
| 355 | __u32 type; | ||
| 356 | __u32 rcode; | ||
| 357 | __u32 length; | ||
| 358 | __u32 data[0]; | ||
| 359 | }; | ||
| 360 | |||
| 361 | /** | ||
| 203 | * union fw_cdev_event - Convenience union of fw_cdev_event_ types | 362 | * union fw_cdev_event - Convenience union of fw_cdev_event_ types |
| 204 | * @common: Valid for all types | 363 | * @common: Valid for all types |
| 205 | * @bus_reset: Valid if @common.type == %FW_CDEV_EVENT_BUS_RESET | 364 | * @bus_reset: Valid if @common.type == %FW_CDEV_EVENT_BUS_RESET |
| 206 | * @response: Valid if @common.type == %FW_CDEV_EVENT_RESPONSE | 365 | * @response: Valid if @common.type == %FW_CDEV_EVENT_RESPONSE |
| 207 | * @request: Valid if @common.type == %FW_CDEV_EVENT_REQUEST | 366 | * @request: Valid if @common.type == %FW_CDEV_EVENT_REQUEST |
| 208 | * @iso_interrupt: Valid if @common.type == %FW_CDEV_EVENT_ISO_INTERRUPT | 367 | * @request2: Valid if @common.type == %FW_CDEV_EVENT_REQUEST2 |
| 209 | * @iso_resource: Valid if @common.type == | 368 | * @iso_interrupt: Valid if @common.type == %FW_CDEV_EVENT_ISO_INTERRUPT |
| 369 | * @iso_interrupt_mc: Valid if @common.type == | ||
| 370 | * %FW_CDEV_EVENT_ISO_INTERRUPT_MULTICHANNEL | ||
| 371 | * @iso_resource: Valid if @common.type == | ||
| 210 | * %FW_CDEV_EVENT_ISO_RESOURCE_ALLOCATED or | 372 | * %FW_CDEV_EVENT_ISO_RESOURCE_ALLOCATED or |
| 211 | * %FW_CDEV_EVENT_ISO_RESOURCE_DEALLOCATED | 373 | * %FW_CDEV_EVENT_ISO_RESOURCE_DEALLOCATED |
| 374 | * @phy_packet: Valid if @common.type == | ||
| 375 | * %FW_CDEV_EVENT_PHY_PACKET_SENT or | ||
| 376 | * %FW_CDEV_EVENT_PHY_PACKET_RECEIVED | ||
| 212 | * | 377 | * |
| 213 | * Convenience union for userspace use. Events could be read(2) into an | 378 | * Convenience union for userspace use. Events could be read(2) into an |
| 214 | * appropriately aligned char buffer and then cast to this union for further | 379 | * appropriately aligned char buffer and then cast to this union for further |
| @@ -223,8 +388,11 @@ union fw_cdev_event { | |||
| 223 | struct fw_cdev_event_bus_reset bus_reset; | 388 | struct fw_cdev_event_bus_reset bus_reset; |
| 224 | struct fw_cdev_event_response response; | 389 | struct fw_cdev_event_response response; |
| 225 | struct fw_cdev_event_request request; | 390 | struct fw_cdev_event_request request; |
| 391 | struct fw_cdev_event_request2 request2; /* added in 2.6.36 */ | ||
| 226 | struct fw_cdev_event_iso_interrupt iso_interrupt; | 392 | struct fw_cdev_event_iso_interrupt iso_interrupt; |
| 227 | struct fw_cdev_event_iso_resource iso_resource; | 393 | struct fw_cdev_event_iso_interrupt_mc iso_interrupt_mc; /* added in 2.6.36 */ |
| 394 | struct fw_cdev_event_iso_resource iso_resource; /* added in 2.6.30 */ | ||
| 395 | struct fw_cdev_event_phy_packet phy_packet; /* added in 2.6.36 */ | ||
| 228 | }; | 396 | }; |
| 229 | 397 | ||
| 230 | /* available since kernel version 2.6.22 */ | 398 | /* available since kernel version 2.6.22 */ |
| @@ -256,23 +424,46 @@ union fw_cdev_event { | |||
| 256 | /* available since kernel version 2.6.34 */ | 424 | /* available since kernel version 2.6.34 */ |
| 257 | #define FW_CDEV_IOC_GET_CYCLE_TIMER2 _IOWR('#', 0x14, struct fw_cdev_get_cycle_timer2) | 425 | #define FW_CDEV_IOC_GET_CYCLE_TIMER2 _IOWR('#', 0x14, struct fw_cdev_get_cycle_timer2) |
| 258 | 426 | ||
| 427 | /* available since kernel version 2.6.36 */ | ||
| 428 | #define FW_CDEV_IOC_SEND_PHY_PACKET _IOWR('#', 0x15, struct fw_cdev_send_phy_packet) | ||
| 429 | #define FW_CDEV_IOC_RECEIVE_PHY_PACKETS _IOW('#', 0x16, struct fw_cdev_receive_phy_packets) | ||
| 430 | #define FW_CDEV_IOC_SET_ISO_CHANNELS _IOW('#', 0x17, struct fw_cdev_set_iso_channels) | ||
| 431 | |||
| 259 | /* | 432 | /* |
| 260 | * FW_CDEV_VERSION History | 433 | * ABI version history |
| 261 | * 1 (2.6.22) - initial version | 434 | * 1 (2.6.22) - initial version |
| 435 | * (2.6.24) - added %FW_CDEV_IOC_GET_CYCLE_TIMER | ||
| 262 | * 2 (2.6.30) - changed &fw_cdev_event_iso_interrupt.header if | 436 | * 2 (2.6.30) - changed &fw_cdev_event_iso_interrupt.header if |
| 263 | * &fw_cdev_create_iso_context.header_size is 8 or more | 437 | * &fw_cdev_create_iso_context.header_size is 8 or more |
| 438 | * - added %FW_CDEV_IOC_*_ISO_RESOURCE*, | ||
| 439 | * %FW_CDEV_IOC_GET_SPEED, %FW_CDEV_IOC_SEND_BROADCAST_REQUEST, | ||
| 440 | * %FW_CDEV_IOC_SEND_STREAM_PACKET | ||
| 264 | * (2.6.32) - added time stamp to xmit &fw_cdev_event_iso_interrupt | 441 | * (2.6.32) - added time stamp to xmit &fw_cdev_event_iso_interrupt |
| 265 | * (2.6.33) - IR has always packet-per-buffer semantics now, not one of | 442 | * (2.6.33) - IR has always packet-per-buffer semantics now, not one of |
| 266 | * dual-buffer or packet-per-buffer depending on hardware | 443 | * dual-buffer or packet-per-buffer depending on hardware |
| 444 | * - shared use and auto-response for FCP registers | ||
| 267 | * 3 (2.6.34) - made &fw_cdev_get_cycle_timer reliable | 445 | * 3 (2.6.34) - made &fw_cdev_get_cycle_timer reliable |
| 446 | * - added %FW_CDEV_IOC_GET_CYCLE_TIMER2 | ||
| 447 | * 4 (2.6.36) - added %FW_CDEV_EVENT_REQUEST2, %FW_CDEV_EVENT_PHY_PACKET_*, | ||
| 448 | * and &fw_cdev_allocate.region_end | ||
| 449 | * - implemented &fw_cdev_event_bus_reset.bm_node_id | ||
| 450 | * - added %FW_CDEV_IOC_SEND_PHY_PACKET, _RECEIVE_PHY_PACKETS | ||
| 451 | * - added %FW_CDEV_EVENT_ISO_INTERRUPT_MULTICHANNEL, | ||
| 452 | * %FW_CDEV_ISO_CONTEXT_RECEIVE_MULTICHANNEL, and | ||
| 453 | * %FW_CDEV_IOC_SET_ISO_CHANNELS | ||
| 268 | */ | 454 | */ |
| 269 | #define FW_CDEV_VERSION 3 | 455 | #define FW_CDEV_VERSION 3 /* Meaningless; don't use this macro. */ |
| 270 | 456 | ||
| 271 | /** | 457 | /** |
| 272 | * struct fw_cdev_get_info - General purpose information ioctl | 458 | * struct fw_cdev_get_info - General purpose information ioctl |
| 273 | * @version: The version field is just a running serial number. | 459 | * @version: The version field is just a running serial number. Both an |
| 274 | * We never break backwards compatibility, but may add more | 460 | * input parameter (ABI version implemented by the client) and |
| 275 | * structs and ioctls in later revisions. | 461 | * output parameter (ABI version implemented by the kernel). |
| 462 | * A client must not fill in an %FW_CDEV_VERSION defined from an | ||
| 463 | * included kernel header file but the actual version for which | ||
| 464 | * the client was implemented. This is necessary for forward | ||
| 465 | * compatibility. We never break backwards compatibility, but | ||
| 466 | * may add more structs, events, and ioctls in later revisions. | ||
| 276 | * @rom_length: If @rom is non-zero, at most rom_length bytes of configuration | 467 | * @rom_length: If @rom is non-zero, at most rom_length bytes of configuration |
| 277 | * ROM will be copied into that user space address. In either | 468 | * ROM will be copied into that user space address. In either |
| 278 | * case, @rom_length is updated with the actual length of the | 469 | * case, @rom_length is updated with the actual length of the |
| @@ -339,28 +530,48 @@ struct fw_cdev_send_response { | |||
| 339 | }; | 530 | }; |
| 340 | 531 | ||
| 341 | /** | 532 | /** |
| 342 | * struct fw_cdev_allocate - Allocate a CSR address range | 533 | * struct fw_cdev_allocate - Allocate a CSR in an address range |
| 343 | * @offset: Start offset of the address range | 534 | * @offset: Start offset of the address range |
| 344 | * @closure: To be passed back to userspace in request events | 535 | * @closure: To be passed back to userspace in request events |
| 345 | * @length: Length of the address range, in bytes | 536 | * @length: Length of the CSR, in bytes |
| 346 | * @handle: Handle to the allocation, written by the kernel | 537 | * @handle: Handle to the allocation, written by the kernel |
| 538 | * @region_end: First address above the address range (added in ABI v4, 2.6.36) | ||
| 347 | * | 539 | * |
| 348 | * Allocate an address range in the 48-bit address space on the local node | 540 | * Allocate an address range in the 48-bit address space on the local node |
| 349 | * (the controller). This allows userspace to listen for requests with an | 541 | * (the controller). This allows userspace to listen for requests with an |
| 350 | * offset within that address range. When the kernel receives a request | 542 | * offset within that address range. Every time when the kernel receives a |
| 351 | * within the range, an &fw_cdev_event_request event will be written back. | 543 | * request within the range, an &fw_cdev_event_request2 event will be emitted. |
| 352 | * The @closure field is passed back to userspace in the response event. | 544 | * (If the kernel or the client implements ABI version <= 3, an |
| 545 | * &fw_cdev_event_request will be generated instead.) | ||
| 546 | * | ||
| 547 | * The @closure field is passed back to userspace in these request events. | ||
| 353 | * The @handle field is an out parameter, returning a handle to the allocated | 548 | * The @handle field is an out parameter, returning a handle to the allocated |
| 354 | * range to be used for later deallocation of the range. | 549 | * range to be used for later deallocation of the range. |
| 355 | * | 550 | * |
| 356 | * The address range is allocated on all local nodes. The address allocation | 551 | * The address range is allocated on all local nodes. The address allocation |
| 357 | * is exclusive except for the FCP command and response registers. | 552 | * is exclusive except for the FCP command and response registers. If an |
| 553 | * exclusive address region is already in use, the ioctl fails with errno set | ||
| 554 | * to %EBUSY. | ||
| 555 | * | ||
| 556 | * If kernel and client implement ABI version >= 4, the kernel looks up a free | ||
| 557 | * spot of size @length inside [@offset..@region_end) and, if found, writes | ||
| 558 | * the start address of the new CSR back in @offset. I.e. @offset is an | ||
| 559 | * in and out parameter. If this automatic placement of a CSR in a bigger | ||
| 560 | * address range is not desired, the client simply needs to set @region_end | ||
| 561 | * = @offset + @length. | ||
| 562 | * | ||
| 563 | * If the kernel or the client implements ABI version <= 3, @region_end is | ||
| 564 | * ignored and effectively assumed to be @offset + @length. | ||
| 565 | * | ||
| 566 | * @region_end is only present in a kernel header >= 2.6.36. If necessary, | ||
| 567 | * this can for example be tested by #ifdef FW_CDEV_EVENT_REQUEST2. | ||
| 358 | */ | 568 | */ |
| 359 | struct fw_cdev_allocate { | 569 | struct fw_cdev_allocate { |
| 360 | __u64 offset; | 570 | __u64 offset; |
| 361 | __u64 closure; | 571 | __u64 closure; |
| 362 | __u32 length; | 572 | __u32 length; |
| 363 | __u32 handle; | 573 | __u32 handle; |
| 574 | __u64 region_end; /* available since kernel version 2.6.36 */ | ||
| 364 | }; | 575 | }; |
| 365 | 576 | ||
| 366 | /** | 577 | /** |
| @@ -382,9 +593,14 @@ struct fw_cdev_deallocate { | |||
| 382 | * Initiate a bus reset for the bus this device is on. The bus reset can be | 593 | * Initiate a bus reset for the bus this device is on. The bus reset can be |
| 383 | * either the original (long) bus reset or the arbitrated (short) bus reset | 594 | * either the original (long) bus reset or the arbitrated (short) bus reset |
| 384 | * introduced in 1394a-2000. | 595 | * introduced in 1394a-2000. |
| 596 | * | ||
| 597 | * The ioctl returns immediately. A subsequent &fw_cdev_event_bus_reset | ||
| 598 | * indicates when the reset actually happened. Since ABI v4, this may be | ||
| 599 | * considerably later than the ioctl because the kernel ensures a grace period | ||
| 600 | * between subsequent bus resets as per IEEE 1394 bus management specification. | ||
| 385 | */ | 601 | */ |
| 386 | struct fw_cdev_initiate_bus_reset { | 602 | struct fw_cdev_initiate_bus_reset { |
| 387 | __u32 type; /* FW_CDEV_SHORT_RESET or FW_CDEV_LONG_RESET */ | 603 | __u32 type; |
| 388 | }; | 604 | }; |
| 389 | 605 | ||
| 390 | /** | 606 | /** |
| @@ -408,9 +624,10 @@ struct fw_cdev_initiate_bus_reset { | |||
| 408 | * | 624 | * |
| 409 | * @immediate, @key, and @data array elements are CPU-endian quadlets. | 625 | * @immediate, @key, and @data array elements are CPU-endian quadlets. |
| 410 | * | 626 | * |
| 411 | * If successful, the kernel adds the descriptor and writes back a handle to the | 627 | * If successful, the kernel adds the descriptor and writes back a @handle to |
| 412 | * kernel-side object to be used for later removal of the descriptor block and | 628 | * the kernel-side object to be used for later removal of the descriptor block |
| 413 | * immediate key. | 629 | * and immediate key. The kernel will also generate a bus reset to signal the |
| 630 | * change of the configuration ROM to other nodes. | ||
| 414 | * | 631 | * |
| 415 | * This ioctl affects the configuration ROMs of all local nodes. | 632 | * This ioctl affects the configuration ROMs of all local nodes. |
| 416 | * The ioctl only succeeds on device files which represent a local node. | 633 | * The ioctl only succeeds on device files which represent a local node. |
| @@ -429,38 +646,50 @@ struct fw_cdev_add_descriptor { | |||
| 429 | * descriptor was added | 646 | * descriptor was added |
| 430 | * | 647 | * |
| 431 | * Remove a descriptor block and accompanying immediate key from the local | 648 | * Remove a descriptor block and accompanying immediate key from the local |
| 432 | * nodes' configuration ROMs. | 649 | * nodes' configuration ROMs. The kernel will also generate a bus reset to |
| 650 | * signal the change of the configuration ROM to other nodes. | ||
| 433 | */ | 651 | */ |
| 434 | struct fw_cdev_remove_descriptor { | 652 | struct fw_cdev_remove_descriptor { |
| 435 | __u32 handle; | 653 | __u32 handle; |
| 436 | }; | 654 | }; |
| 437 | 655 | ||
| 438 | #define FW_CDEV_ISO_CONTEXT_TRANSMIT 0 | 656 | #define FW_CDEV_ISO_CONTEXT_TRANSMIT 0 |
| 439 | #define FW_CDEV_ISO_CONTEXT_RECEIVE 1 | 657 | #define FW_CDEV_ISO_CONTEXT_RECEIVE 1 |
| 658 | #define FW_CDEV_ISO_CONTEXT_RECEIVE_MULTICHANNEL 2 /* added in 2.6.36 */ | ||
| 440 | 659 | ||
| 441 | /** | 660 | /** |
| 442 | * struct fw_cdev_create_iso_context - Create a context for isochronous IO | 661 | * struct fw_cdev_create_iso_context - Create a context for isochronous I/O |
| 443 | * @type: %FW_CDEV_ISO_CONTEXT_TRANSMIT or %FW_CDEV_ISO_CONTEXT_RECEIVE | 662 | * @type: %FW_CDEV_ISO_CONTEXT_TRANSMIT or %FW_CDEV_ISO_CONTEXT_RECEIVE or |
| 444 | * @header_size: Header size to strip for receive contexts | 663 | * %FW_CDEV_ISO_CONTEXT_RECEIVE_MULTICHANNEL |
| 445 | * @channel: Channel to bind to | 664 | * @header_size: Header size to strip in single-channel reception |
| 446 | * @speed: Speed for transmit contexts | 665 | * @channel: Channel to bind to in single-channel reception or transmission |
| 447 | * @closure: To be returned in &fw_cdev_event_iso_interrupt | 666 | * @speed: Transmission speed |
| 667 | * @closure: To be returned in &fw_cdev_event_iso_interrupt or | ||
| 668 | * &fw_cdev_event_iso_interrupt_multichannel | ||
| 448 | * @handle: Handle to context, written back by kernel | 669 | * @handle: Handle to context, written back by kernel |
| 449 | * | 670 | * |
| 450 | * Prior to sending or receiving isochronous I/O, a context must be created. | 671 | * Prior to sending or receiving isochronous I/O, a context must be created. |
| 451 | * The context records information about the transmit or receive configuration | 672 | * The context records information about the transmit or receive configuration |
| 452 | * and typically maps to an underlying hardware resource. A context is set up | 673 | * and typically maps to an underlying hardware resource. A context is set up |
| 453 | * for either sending or receiving. It is bound to a specific isochronous | 674 | * for either sending or receiving. It is bound to a specific isochronous |
| 454 | * channel. | 675 | * @channel. |
| 676 | * | ||
| 677 | * In case of multichannel reception, @header_size and @channel are ignored | ||
| 678 | * and the channels are selected by %FW_CDEV_IOC_SET_ISO_CHANNELS. | ||
| 679 | * | ||
| 680 | * For %FW_CDEV_ISO_CONTEXT_RECEIVE contexts, @header_size must be at least 4 | ||
| 681 | * and must be a multiple of 4. It is ignored in other context types. | ||
| 682 | * | ||
| 683 | * @speed is ignored in receive context types. | ||
| 455 | * | 684 | * |
| 456 | * If a context was successfully created, the kernel writes back a handle to the | 685 | * If a context was successfully created, the kernel writes back a handle to the |
| 457 | * context, which must be passed in for subsequent operations on that context. | 686 | * context, which must be passed in for subsequent operations on that context. |
| 458 | * | 687 | * |
| 459 | * For receive contexts, @header_size must be at least 4 and must be a multiple | 688 | * Limitations: |
| 460 | * of 4. | 689 | * No more than one iso context can be created per fd. |
| 461 | * | 690 | * The total number of contexts that all userspace and kernelspace drivers can |
| 462 | * Note that the effect of a @header_size > 4 depends on | 691 | * create on a card at a time is a hardware limit, typically 4 or 8 contexts per |
| 463 | * &fw_cdev_get_info.version, as documented at &fw_cdev_event_iso_interrupt. | 692 | * direction, and of them at most one multichannel receive context. |
| 464 | */ | 693 | */ |
| 465 | struct fw_cdev_create_iso_context { | 694 | struct fw_cdev_create_iso_context { |
| 466 | __u32 type; | 695 | __u32 type; |
| @@ -471,6 +700,22 @@ struct fw_cdev_create_iso_context { | |||
| 471 | __u32 handle; | 700 | __u32 handle; |
| 472 | }; | 701 | }; |
| 473 | 702 | ||
| 703 | /** | ||
| 704 | * struct fw_cdev_set_iso_channels - Select channels in multichannel reception | ||
| 705 | * @channels: Bitmask of channels to listen to | ||
| 706 | * @handle: Handle of the mutichannel receive context | ||
| 707 | * | ||
| 708 | * @channels is the bitwise or of 1ULL << n for each channel n to listen to. | ||
| 709 | * | ||
| 710 | * The ioctl fails with errno %EBUSY if there is already another receive context | ||
| 711 | * on a channel in @channels. In that case, the bitmask of all unoccupied | ||
| 712 | * channels is returned in @channels. | ||
| 713 | */ | ||
| 714 | struct fw_cdev_set_iso_channels { | ||
| 715 | __u64 channels; | ||
| 716 | __u32 handle; | ||
| 717 | }; | ||
| 718 | |||
| 474 | #define FW_CDEV_ISO_PAYLOAD_LENGTH(v) (v) | 719 | #define FW_CDEV_ISO_PAYLOAD_LENGTH(v) (v) |
| 475 | #define FW_CDEV_ISO_INTERRUPT (1 << 16) | 720 | #define FW_CDEV_ISO_INTERRUPT (1 << 16) |
| 476 | #define FW_CDEV_ISO_SKIP (1 << 17) | 721 | #define FW_CDEV_ISO_SKIP (1 << 17) |
| @@ -481,42 +726,72 @@ struct fw_cdev_create_iso_context { | |||
| 481 | 726 | ||
| 482 | /** | 727 | /** |
| 483 | * struct fw_cdev_iso_packet - Isochronous packet | 728 | * struct fw_cdev_iso_packet - Isochronous packet |
| 484 | * @control: Contains the header length (8 uppermost bits), the sy field | 729 | * @control: Contains the header length (8 uppermost bits), |
| 485 | * (4 bits), the tag field (2 bits), a sync flag (1 bit), | 730 | * the sy field (4 bits), the tag field (2 bits), a sync flag |
| 486 | * a skip flag (1 bit), an interrupt flag (1 bit), and the | 731 | * or a skip flag (1 bit), an interrupt flag (1 bit), and the |
| 487 | * payload length (16 lowermost bits) | 732 | * payload length (16 lowermost bits) |
| 488 | * @header: Header and payload | 733 | * @header: Header and payload in case of a transmit context. |
| 489 | * | 734 | * |
| 490 | * &struct fw_cdev_iso_packet is used to describe isochronous packet queues. | 735 | * &struct fw_cdev_iso_packet is used to describe isochronous packet queues. |
| 491 | * | ||
| 492 | * Use the FW_CDEV_ISO_ macros to fill in @control. | 736 | * Use the FW_CDEV_ISO_ macros to fill in @control. |
| 737 | * The @header array is empty in case of receive contexts. | ||
| 738 | * | ||
| 739 | * Context type %FW_CDEV_ISO_CONTEXT_TRANSMIT: | ||
| 740 | * | ||
| 741 | * @control.HEADER_LENGTH must be a multiple of 4. It specifies the numbers of | ||
| 742 | * bytes in @header that will be prepended to the packet's payload. These bytes | ||
| 743 | * are copied into the kernel and will not be accessed after the ioctl has | ||
| 744 | * returned. | ||
| 745 | * | ||
| 746 | * The @control.SY and TAG fields are copied to the iso packet header. These | ||
| 747 | * fields are specified by IEEE 1394a and IEC 61883-1. | ||
| 748 | * | ||
| 749 | * The @control.SKIP flag specifies that no packet is to be sent in a frame. | ||
| 750 | * When using this, all other fields except @control.INTERRUPT must be zero. | ||
| 751 | * | ||
| 752 | * When a packet with the @control.INTERRUPT flag set has been completed, an | ||
| 753 | * &fw_cdev_event_iso_interrupt event will be sent. | ||
| 754 | * | ||
| 755 | * Context type %FW_CDEV_ISO_CONTEXT_RECEIVE: | ||
| 756 | * | ||
| 757 | * @control.HEADER_LENGTH must be a multiple of the context's header_size. | ||
| 758 | * If the HEADER_LENGTH is larger than the context's header_size, multiple | ||
| 759 | * packets are queued for this entry. | ||
| 760 | * | ||
| 761 | * The @control.SY and TAG fields are ignored. | ||
| 762 | * | ||
| 763 | * If the @control.SYNC flag is set, the context drops all packets until a | ||
| 764 | * packet with a sy field is received which matches &fw_cdev_start_iso.sync. | ||
| 765 | * | ||
| 766 | * @control.PAYLOAD_LENGTH defines how many payload bytes can be received for | ||
| 767 | * one packet (in addition to payload quadlets that have been defined as headers | ||
| 768 | * and are stripped and returned in the &fw_cdev_event_iso_interrupt structure). | ||
| 769 | * If more bytes are received, the additional bytes are dropped. If less bytes | ||
| 770 | * are received, the remaining bytes in this part of the payload buffer will not | ||
| 771 | * be written to, not even by the next packet. I.e., packets received in | ||
| 772 | * consecutive frames will not necessarily be consecutive in memory. If an | ||
| 773 | * entry has queued multiple packets, the PAYLOAD_LENGTH is divided equally | ||
| 774 | * among them. | ||
| 493 | * | 775 | * |
| 494 | * For transmit packets, the header length must be a multiple of 4 and specifies | 776 | * When a packet with the @control.INTERRUPT flag set has been completed, an |
| 495 | * the numbers of bytes in @header that will be prepended to the packet's | ||
| 496 | * payload; these bytes are copied into the kernel and will not be accessed | ||
| 497 | * after the ioctl has returned. The sy and tag fields are copied to the iso | ||
| 498 | * packet header (these fields are specified by IEEE 1394a and IEC 61883-1). | ||
| 499 | * The skip flag specifies that no packet is to be sent in a frame; when using | ||
| 500 | * this, all other fields except the interrupt flag must be zero. | ||
| 501 | * | ||
| 502 | * For receive packets, the header length must be a multiple of the context's | ||
| 503 | * header size; if the header length is larger than the context's header size, | ||
| 504 | * multiple packets are queued for this entry. The sy and tag fields are | ||
| 505 | * ignored. If the sync flag is set, the context drops all packets until | ||
| 506 | * a packet with a matching sy field is received (the sync value to wait for is | ||
| 507 | * specified in the &fw_cdev_start_iso structure). The payload length defines | ||
| 508 | * how many payload bytes can be received for one packet (in addition to payload | ||
| 509 | * quadlets that have been defined as headers and are stripped and returned in | ||
| 510 | * the &fw_cdev_event_iso_interrupt structure). If more bytes are received, the | ||
| 511 | * additional bytes are dropped. If less bytes are received, the remaining | ||
| 512 | * bytes in this part of the payload buffer will not be written to, not even by | ||
| 513 | * the next packet, i.e., packets received in consecutive frames will not | ||
| 514 | * necessarily be consecutive in memory. If an entry has queued multiple | ||
| 515 | * packets, the payload length is divided equally among them. | ||
| 516 | * | ||
| 517 | * When a packet with the interrupt flag set has been completed, the | ||
| 518 | * &fw_cdev_event_iso_interrupt event will be sent. An entry that has queued | 777 | * &fw_cdev_event_iso_interrupt event will be sent. An entry that has queued |
| 519 | * multiple receive packets is completed when its last packet is completed. | 778 | * multiple receive packets is completed when its last packet is completed. |
| 779 | * | ||
| 780 | * Context type %FW_CDEV_ISO_CONTEXT_RECEIVE_MULTICHANNEL: | ||
| 781 | * | ||
| 782 | * Here, &fw_cdev_iso_packet would be more aptly named _iso_buffer_chunk since | ||
| 783 | * it specifies a chunk of the mmap()'ed buffer, while the number and alignment | ||
| 784 | * of packets to be placed into the buffer chunk is not known beforehand. | ||
| 785 | * | ||
| 786 | * @control.PAYLOAD_LENGTH is the size of the buffer chunk and specifies room | ||
| 787 | * for header, payload, padding, and trailer bytes of one or more packets. | ||
| 788 | * It must be a multiple of 4. | ||
| 789 | * | ||
| 790 | * @control.HEADER_LENGTH, TAG and SY are ignored. SYNC is treated as described | ||
| 791 | * for single-channel reception. | ||
| 792 | * | ||
| 793 | * When a buffer chunk with the @control.INTERRUPT flag set has been filled | ||
| 794 | * entirely, an &fw_cdev_event_iso_interrupt_mc event will be sent. | ||
| 520 | */ | 795 | */ |
| 521 | struct fw_cdev_iso_packet { | 796 | struct fw_cdev_iso_packet { |
| 522 | __u32 control; | 797 | __u32 control; |
| @@ -525,9 +800,9 @@ struct fw_cdev_iso_packet { | |||
| 525 | 800 | ||
| 526 | /** | 801 | /** |
| 527 | * struct fw_cdev_queue_iso - Queue isochronous packets for I/O | 802 | * struct fw_cdev_queue_iso - Queue isochronous packets for I/O |
| 528 | * @packets: Userspace pointer to packet data | 803 | * @packets: Userspace pointer to an array of &fw_cdev_iso_packet |
| 529 | * @data: Pointer into mmap()'ed payload buffer | 804 | * @data: Pointer into mmap()'ed payload buffer |
| 530 | * @size: Size of packet data in bytes | 805 | * @size: Size of the @packets array, in bytes |
| 531 | * @handle: Isochronous context handle | 806 | * @handle: Isochronous context handle |
| 532 | * | 807 | * |
| 533 | * Queue a number of isochronous packets for reception or transmission. | 808 | * Queue a number of isochronous packets for reception or transmission. |
| @@ -540,6 +815,9 @@ struct fw_cdev_iso_packet { | |||
| 540 | * The kernel may or may not queue all packets, but will write back updated | 815 | * The kernel may or may not queue all packets, but will write back updated |
| 541 | * values of the @packets, @data and @size fields, so the ioctl can be | 816 | * values of the @packets, @data and @size fields, so the ioctl can be |
| 542 | * resubmitted easily. | 817 | * resubmitted easily. |
| 818 | * | ||
| 819 | * In case of a multichannel receive context, @data must be quadlet-aligned | ||
| 820 | * relative to the buffer start. | ||
| 543 | */ | 821 | */ |
| 544 | struct fw_cdev_queue_iso { | 822 | struct fw_cdev_queue_iso { |
| 545 | __u64 packets; | 823 | __u64 packets; |
| @@ -698,4 +976,39 @@ struct fw_cdev_send_stream_packet { | |||
| 698 | __u32 speed; | 976 | __u32 speed; |
| 699 | }; | 977 | }; |
| 700 | 978 | ||
| 979 | /** | ||
| 980 | * struct fw_cdev_send_phy_packet - send a PHY packet | ||
| 981 | * @closure: Passed back to userspace in the PHY-packet-sent event | ||
| 982 | * @data: First and second quadlet of the PHY packet | ||
| 983 | * @generation: The bus generation where packet is valid | ||
| 984 | * | ||
| 985 | * The %FW_CDEV_IOC_SEND_PHY_PACKET ioctl sends a PHY packet to all nodes | ||
| 986 | * on the same card as this device. After transmission, an | ||
| 987 | * %FW_CDEV_EVENT_PHY_PACKET_SENT event is generated. | ||
| 988 | * | ||
| 989 | * The payload @data[] shall be specified in host byte order. Usually, | ||
| 990 | * @data[1] needs to be the bitwise inverse of @data[0]. VersaPHY packets | ||
| 991 | * are an exception to this rule. | ||
| 992 | * | ||
| 993 | * The ioctl is only permitted on device files which represent a local node. | ||
| 994 | */ | ||
| 995 | struct fw_cdev_send_phy_packet { | ||
| 996 | __u64 closure; | ||
| 997 | __u32 data[2]; | ||
| 998 | __u32 generation; | ||
| 999 | }; | ||
| 1000 | |||
| 1001 | /** | ||
| 1002 | * struct fw_cdev_receive_phy_packets - start reception of PHY packets | ||
| 1003 | * @closure: Passed back to userspace in phy packet events | ||
| 1004 | * | ||
| 1005 | * This ioctl activates issuing of %FW_CDEV_EVENT_PHY_PACKET_RECEIVED due to | ||
| 1006 | * incoming PHY packets from any node on the same bus as the device. | ||
| 1007 | * | ||
| 1008 | * The ioctl is only permitted on device files which represent a local node. | ||
| 1009 | */ | ||
| 1010 | struct fw_cdev_receive_phy_packets { | ||
| 1011 | __u64 closure; | ||
| 1012 | }; | ||
| 1013 | |||
| 701 | #endif /* _LINUX_FIREWIRE_CDEV_H */ | 1014 | #endif /* _LINUX_FIREWIRE_CDEV_H */ |
diff --git a/include/linux/firewire.h b/include/linux/firewire.h index 72e2b8ac2a5a..1cd637ef62d2 100644 --- a/include/linux/firewire.h +++ b/include/linux/firewire.h | |||
| @@ -32,11 +32,13 @@ | |||
| 32 | #define CSR_CYCLE_TIME 0x200 | 32 | #define CSR_CYCLE_TIME 0x200 |
| 33 | #define CSR_BUS_TIME 0x204 | 33 | #define CSR_BUS_TIME 0x204 |
| 34 | #define CSR_BUSY_TIMEOUT 0x210 | 34 | #define CSR_BUSY_TIMEOUT 0x210 |
| 35 | #define CSR_PRIORITY_BUDGET 0x218 | ||
| 35 | #define CSR_BUS_MANAGER_ID 0x21c | 36 | #define CSR_BUS_MANAGER_ID 0x21c |
| 36 | #define CSR_BANDWIDTH_AVAILABLE 0x220 | 37 | #define CSR_BANDWIDTH_AVAILABLE 0x220 |
| 37 | #define CSR_CHANNELS_AVAILABLE 0x224 | 38 | #define CSR_CHANNELS_AVAILABLE 0x224 |
| 38 | #define CSR_CHANNELS_AVAILABLE_HI 0x224 | 39 | #define CSR_CHANNELS_AVAILABLE_HI 0x224 |
| 39 | #define CSR_CHANNELS_AVAILABLE_LO 0x228 | 40 | #define CSR_CHANNELS_AVAILABLE_LO 0x228 |
| 41 | #define CSR_MAINT_UTILITY 0x230 | ||
| 40 | #define CSR_BROADCAST_CHANNEL 0x234 | 42 | #define CSR_BROADCAST_CHANNEL 0x234 |
| 41 | #define CSR_CONFIG_ROM 0x400 | 43 | #define CSR_CONFIG_ROM 0x400 |
| 42 | #define CSR_CONFIG_ROM_END 0x800 | 44 | #define CSR_CONFIG_ROM_END 0x800 |
| @@ -89,6 +91,11 @@ struct fw_card { | |||
| 89 | struct list_head transaction_list; | 91 | struct list_head transaction_list; |
| 90 | unsigned long reset_jiffies; | 92 | unsigned long reset_jiffies; |
| 91 | 93 | ||
| 94 | u32 split_timeout_hi; | ||
| 95 | u32 split_timeout_lo; | ||
| 96 | unsigned int split_timeout_cycles; | ||
| 97 | unsigned int split_timeout_jiffies; | ||
| 98 | |||
| 92 | unsigned long long guid; | 99 | unsigned long long guid; |
| 93 | unsigned max_receive; | 100 | unsigned max_receive; |
| 94 | int link_speed; | 101 | int link_speed; |
| @@ -104,18 +111,28 @@ struct fw_card { | |||
| 104 | bool beta_repeaters_present; | 111 | bool beta_repeaters_present; |
| 105 | 112 | ||
| 106 | int index; | 113 | int index; |
| 107 | |||
| 108 | struct list_head link; | 114 | struct list_head link; |
| 109 | 115 | ||
| 110 | /* Work struct for BM duties. */ | 116 | struct list_head phy_receiver_list; |
| 111 | struct delayed_work work; | 117 | |
| 118 | struct delayed_work br_work; /* bus reset job */ | ||
| 119 | bool br_short; | ||
| 120 | |||
| 121 | struct delayed_work bm_work; /* bus manager job */ | ||
| 112 | int bm_retries; | 122 | int bm_retries; |
| 113 | int bm_generation; | 123 | int bm_generation; |
| 114 | __be32 bm_transaction_data[2]; | 124 | __be32 bm_transaction_data[2]; |
| 125 | int bm_node_id; | ||
| 126 | bool bm_abdicate; | ||
| 127 | |||
| 128 | bool priority_budget_implemented; /* controller feature */ | ||
| 129 | bool broadcast_channel_auto_allocated; /* controller feature */ | ||
| 115 | 130 | ||
| 116 | bool broadcast_channel_allocated; | 131 | bool broadcast_channel_allocated; |
| 117 | u32 broadcast_channel; | 132 | u32 broadcast_channel; |
| 118 | __be32 topology_map[(CSR_TOPOLOGY_MAP_END - CSR_TOPOLOGY_MAP) / 4]; | 133 | __be32 topology_map[(CSR_TOPOLOGY_MAP_END - CSR_TOPOLOGY_MAP) / 4]; |
| 134 | |||
| 135 | __be32 maint_utility_register; | ||
| 119 | }; | 136 | }; |
| 120 | 137 | ||
| 121 | struct fw_attribute_group { | 138 | struct fw_attribute_group { |
| @@ -252,7 +269,7 @@ typedef void (*fw_transaction_callback_t)(struct fw_card *card, int rcode, | |||
| 252 | typedef void (*fw_address_callback_t)(struct fw_card *card, | 269 | typedef void (*fw_address_callback_t)(struct fw_card *card, |
| 253 | struct fw_request *request, | 270 | struct fw_request *request, |
| 254 | int tcode, int destination, int source, | 271 | int tcode, int destination, int source, |
| 255 | int generation, int speed, | 272 | int generation, |
| 256 | unsigned long long offset, | 273 | unsigned long long offset, |
| 257 | void *data, size_t length, | 274 | void *data, size_t length, |
| 258 | void *callback_data); | 275 | void *callback_data); |
| @@ -269,10 +286,10 @@ struct fw_packet { | |||
| 269 | u32 timestamp; | 286 | u32 timestamp; |
| 270 | 287 | ||
| 271 | /* | 288 | /* |
| 272 | * This callback is called when the packet transmission has | 289 | * This callback is called when the packet transmission has completed. |
| 273 | * completed; for successful transmission, the status code is | 290 | * For successful transmission, the status code is the ack received |
| 274 | * the ack received from the destination, otherwise it's a | 291 | * from the destination. Otherwise it is one of the juju-specific |
| 275 | * negative errno: ENOMEM, ESTALE, ETIMEDOUT, ENODEV, EIO. | 292 | * rcodes: RCODE_SEND_ERROR, _CANCELLED, _BUSY, _GENERATION, _NO_ACK. |
| 276 | * The callback can be called from tasklet context and thus | 293 | * The callback can be called from tasklet context and thus |
| 277 | * must never block. | 294 | * must never block. |
| 278 | */ | 295 | */ |
| @@ -355,17 +372,19 @@ void fw_core_remove_descriptor(struct fw_descriptor *desc); | |||
| 355 | * scatter-gather streaming (e.g. assembling video frame automatically). | 372 | * scatter-gather streaming (e.g. assembling video frame automatically). |
| 356 | */ | 373 | */ |
| 357 | struct fw_iso_packet { | 374 | struct fw_iso_packet { |
| 358 | u16 payload_length; /* Length of indirect payload. */ | 375 | u16 payload_length; /* Length of indirect payload */ |
| 359 | u32 interrupt:1; /* Generate interrupt on this packet */ | 376 | u32 interrupt:1; /* Generate interrupt on this packet */ |
| 360 | u32 skip:1; /* Set to not send packet at all. */ | 377 | u32 skip:1; /* tx: Set to not send packet at all */ |
| 361 | u32 tag:2; | 378 | /* rx: Sync bit, wait for matching sy */ |
| 362 | u32 sy:4; | 379 | u32 tag:2; /* tx: Tag in packet header */ |
| 363 | u32 header_length:8; /* Length of immediate header. */ | 380 | u32 sy:4; /* tx: Sy in packet header */ |
| 364 | u32 header[0]; | 381 | u32 header_length:8; /* Length of immediate header */ |
| 382 | u32 header[0]; /* tx: Top of 1394 isoch. data_block */ | ||
| 365 | }; | 383 | }; |
| 366 | 384 | ||
| 367 | #define FW_ISO_CONTEXT_TRANSMIT 0 | 385 | #define FW_ISO_CONTEXT_TRANSMIT 0 |
| 368 | #define FW_ISO_CONTEXT_RECEIVE 1 | 386 | #define FW_ISO_CONTEXT_RECEIVE 1 |
| 387 | #define FW_ISO_CONTEXT_RECEIVE_MULTICHANNEL 2 | ||
| 369 | 388 | ||
| 370 | #define FW_ISO_CONTEXT_MATCH_TAG0 1 | 389 | #define FW_ISO_CONTEXT_MATCH_TAG0 1 |
| 371 | #define FW_ISO_CONTEXT_MATCH_TAG1 2 | 390 | #define FW_ISO_CONTEXT_MATCH_TAG1 2 |
| @@ -389,24 +408,31 @@ struct fw_iso_buffer { | |||
| 389 | int fw_iso_buffer_init(struct fw_iso_buffer *buffer, struct fw_card *card, | 408 | int fw_iso_buffer_init(struct fw_iso_buffer *buffer, struct fw_card *card, |
| 390 | int page_count, enum dma_data_direction direction); | 409 | int page_count, enum dma_data_direction direction); |
| 391 | void fw_iso_buffer_destroy(struct fw_iso_buffer *buffer, struct fw_card *card); | 410 | void fw_iso_buffer_destroy(struct fw_iso_buffer *buffer, struct fw_card *card); |
| 411 | size_t fw_iso_buffer_lookup(struct fw_iso_buffer *buffer, dma_addr_t completed); | ||
| 392 | 412 | ||
| 393 | struct fw_iso_context; | 413 | struct fw_iso_context; |
| 394 | typedef void (*fw_iso_callback_t)(struct fw_iso_context *context, | 414 | typedef void (*fw_iso_callback_t)(struct fw_iso_context *context, |
| 395 | u32 cycle, size_t header_length, | 415 | u32 cycle, size_t header_length, |
| 396 | void *header, void *data); | 416 | void *header, void *data); |
| 417 | typedef void (*fw_iso_mc_callback_t)(struct fw_iso_context *context, | ||
| 418 | dma_addr_t completed, void *data); | ||
| 397 | struct fw_iso_context { | 419 | struct fw_iso_context { |
| 398 | struct fw_card *card; | 420 | struct fw_card *card; |
| 399 | int type; | 421 | int type; |
| 400 | int channel; | 422 | int channel; |
| 401 | int speed; | 423 | int speed; |
| 402 | size_t header_size; | 424 | size_t header_size; |
| 403 | fw_iso_callback_t callback; | 425 | union { |
| 426 | fw_iso_callback_t sc; | ||
| 427 | fw_iso_mc_callback_t mc; | ||
| 428 | } callback; | ||
| 404 | void *callback_data; | 429 | void *callback_data; |
| 405 | }; | 430 | }; |
| 406 | 431 | ||
| 407 | struct fw_iso_context *fw_iso_context_create(struct fw_card *card, | 432 | struct fw_iso_context *fw_iso_context_create(struct fw_card *card, |
| 408 | int type, int channel, int speed, size_t header_size, | 433 | int type, int channel, int speed, size_t header_size, |
| 409 | fw_iso_callback_t callback, void *callback_data); | 434 | fw_iso_callback_t callback, void *callback_data); |
| 435 | int fw_iso_context_set_channels(struct fw_iso_context *ctx, u64 *channels); | ||
| 410 | int fw_iso_context_queue(struct fw_iso_context *ctx, | 436 | int fw_iso_context_queue(struct fw_iso_context *ctx, |
| 411 | struct fw_iso_packet *packet, | 437 | struct fw_iso_packet *packet, |
| 412 | struct fw_iso_buffer *buffer, | 438 | struct fw_iso_buffer *buffer, |
diff --git a/include/linux/flex_array.h b/include/linux/flex_array.h index 1d747f72298b..631b77f2ac70 100644 --- a/include/linux/flex_array.h +++ b/include/linux/flex_array.h | |||
| @@ -70,4 +70,9 @@ int flex_array_clear(struct flex_array *fa, unsigned int element_nr); | |||
| 70 | void *flex_array_get(struct flex_array *fa, unsigned int element_nr); | 70 | void *flex_array_get(struct flex_array *fa, unsigned int element_nr); |
| 71 | int flex_array_shrink(struct flex_array *fa); | 71 | int flex_array_shrink(struct flex_array *fa); |
| 72 | 72 | ||
| 73 | #define flex_array_put_ptr(fa, nr, src, gfp) \ | ||
| 74 | flex_array_put(fa, nr, &(void *)(src), gfp) | ||
| 75 | |||
| 76 | void *flex_array_get_ptr(struct flex_array *fa, unsigned int element_nr); | ||
| 77 | |||
| 73 | #endif /* _FLEX_ARRAY_H */ | 78 | #endif /* _FLEX_ARRAY_H */ |
diff --git a/include/linux/fs.h b/include/linux/fs.h index 68ca1b0491af..1c73b50e81ff 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
| @@ -8,6 +8,8 @@ | |||
| 8 | 8 | ||
| 9 | #include <linux/limits.h> | 9 | #include <linux/limits.h> |
| 10 | #include <linux/ioctl.h> | 10 | #include <linux/ioctl.h> |
| 11 | #include <linux/blk_types.h> | ||
| 12 | #include <linux/types.h> | ||
| 11 | 13 | ||
| 12 | /* | 14 | /* |
| 13 | * It's silly to have NR_OPEN bigger than NR_FILE, but you can change | 15 | * It's silly to have NR_OPEN bigger than NR_FILE, but you can change |
| @@ -31,11 +33,17 @@ | |||
| 31 | #define SEEK_END 2 /* seek relative to end of file */ | 33 | #define SEEK_END 2 /* seek relative to end of file */ |
| 32 | #define SEEK_MAX SEEK_END | 34 | #define SEEK_MAX SEEK_END |
| 33 | 35 | ||
| 36 | struct fstrim_range { | ||
| 37 | uint64_t start; | ||
| 38 | uint64_t len; | ||
| 39 | uint64_t minlen; | ||
| 40 | }; | ||
| 41 | |||
| 34 | /* And dynamically-tunable limits and defaults: */ | 42 | /* And dynamically-tunable limits and defaults: */ |
| 35 | struct files_stat_struct { | 43 | struct files_stat_struct { |
| 36 | int nr_files; /* read only */ | 44 | unsigned long nr_files; /* read only */ |
| 37 | int nr_free_files; /* read only */ | 45 | unsigned long nr_free_files; /* read only */ |
| 38 | int max_files; /* tunable */ | 46 | unsigned long max_files; /* tunable */ |
| 39 | }; | 47 | }; |
| 40 | 48 | ||
| 41 | struct inodes_stat_t { | 49 | struct inodes_stat_t { |
| @@ -53,6 +61,7 @@ struct inodes_stat_t { | |||
| 53 | #define MAY_APPEND 8 | 61 | #define MAY_APPEND 8 |
| 54 | #define MAY_ACCESS 16 | 62 | #define MAY_ACCESS 16 |
| 55 | #define MAY_OPEN 32 | 63 | #define MAY_OPEN 32 |
| 64 | #define MAY_CHDIR 64 | ||
| 56 | 65 | ||
| 57 | /* | 66 | /* |
| 58 | * flags in file.f_mode. Note that FMODE_READ and FMODE_WRITE must correspond | 67 | * flags in file.f_mode. Note that FMODE_READ and FMODE_WRITE must correspond |
| @@ -90,6 +99,12 @@ struct inodes_stat_t { | |||
| 90 | /* Expect random access pattern */ | 99 | /* Expect random access pattern */ |
| 91 | #define FMODE_RANDOM ((__force fmode_t)0x1000) | 100 | #define FMODE_RANDOM ((__force fmode_t)0x1000) |
| 92 | 101 | ||
| 102 | /* File is huge (eg. /dev/kmem): treat loff_t as unsigned */ | ||
| 103 | #define FMODE_UNSIGNED_OFFSET ((__force fmode_t)0x2000) | ||
| 104 | |||
| 105 | /* File was opened by fanotify and shouldn't generate fanotify events */ | ||
| 106 | #define FMODE_NONOTIFY ((__force fmode_t)0x1000000) | ||
| 107 | |||
| 93 | /* | 108 | /* |
| 94 | * The below are the various read and write types that we support. Some of | 109 | * The below are the various read and write types that we support. Some of |
| 95 | * them include behavioral modifiers that send information down to the | 110 | * them include behavioral modifiers that send information down to the |
| @@ -117,12 +132,9 @@ struct inodes_stat_t { | |||
| 117 | * immediately wait on this read without caring about | 132 | * immediately wait on this read without caring about |
| 118 | * unplugging. | 133 | * unplugging. |
| 119 | * READA Used for read-ahead operations. Lower priority, and the | 134 | * READA Used for read-ahead operations. Lower priority, and the |
| 120 | * block layer could (in theory) choose to ignore this | 135 | * block layer could (in theory) choose to ignore this |
| 121 | * request if it runs into resource problems. | 136 | * request if it runs into resource problems. |
| 122 | * WRITE A normal async write. Device will be plugged. | 137 | * WRITE A normal async write. Device will be plugged. |
| 123 | * SWRITE Like WRITE, but a special case for ll_rw_block() that | ||
| 124 | * tells it to lock the buffer first. Normally a buffer | ||
| 125 | * must be locked before doing IO. | ||
| 126 | * WRITE_SYNC_PLUG Synchronous write. Identical to WRITE, but passes down | 138 | * WRITE_SYNC_PLUG Synchronous write. Identical to WRITE, but passes down |
| 127 | * the hint that someone will be waiting on this IO | 139 | * the hint that someone will be waiting on this IO |
| 128 | * shortly. The device must still be unplugged explicitly, | 140 | * shortly. The device must still be unplugged explicitly, |
| @@ -133,40 +145,33 @@ struct inodes_stat_t { | |||
| 133 | * immediately after submission. The write equivalent | 145 | * immediately after submission. The write equivalent |
| 134 | * of READ_SYNC. | 146 | * of READ_SYNC. |
| 135 | * WRITE_ODIRECT_PLUG Special case write for O_DIRECT only. | 147 | * WRITE_ODIRECT_PLUG Special case write for O_DIRECT only. |
| 136 | * SWRITE_SYNC | 148 | * WRITE_FLUSH Like WRITE_SYNC but with preceding cache flush. |
| 137 | * SWRITE_SYNC_PLUG Like WRITE_SYNC/WRITE_SYNC_PLUG, but locks the buffer. | 149 | * WRITE_FUA Like WRITE_SYNC but data is guaranteed to be on |
| 138 | * See SWRITE. | 150 | * non-volatile media on completion. |
| 139 | * WRITE_BARRIER Like WRITE, but tells the block layer that all | 151 | * WRITE_FLUSH_FUA Combination of WRITE_FLUSH and FUA. The IO is preceded |
| 140 | * previously submitted writes must be safely on storage | 152 | * by a cache flush and data is guaranteed to be on |
| 141 | * before this one is started. Also guarantees that when | 153 | * non-volatile media on completion. |
| 142 | * this write is complete, it itself is also safely on | ||
| 143 | * storage. Prevents reordering of writes on both sides | ||
| 144 | * of this IO. | ||
| 145 | * | 154 | * |
| 146 | */ | 155 | */ |
| 147 | #define RW_MASK 1 | 156 | #define RW_MASK REQ_WRITE |
| 148 | #define RWA_MASK 2 | 157 | #define RWA_MASK REQ_RAHEAD |
| 149 | #define READ 0 | 158 | |
| 150 | #define WRITE 1 | 159 | #define READ 0 |
| 151 | #define READA 2 /* read-ahead - don't block if no resources */ | 160 | #define WRITE RW_MASK |
| 152 | #define SWRITE 3 /* for ll_rw_block() - wait for buffer lock */ | 161 | #define READA RWA_MASK |
| 153 | #define READ_SYNC (READ | (1 << BIO_RW_SYNCIO) | (1 << BIO_RW_UNPLUG)) | 162 | |
| 154 | #define READ_META (READ | (1 << BIO_RW_META)) | 163 | #define READ_SYNC (READ | REQ_SYNC | REQ_UNPLUG) |
| 155 | #define WRITE_SYNC_PLUG (WRITE | (1 << BIO_RW_SYNCIO) | (1 << BIO_RW_NOIDLE)) | 164 | #define READ_META (READ | REQ_META) |
| 156 | #define WRITE_SYNC (WRITE_SYNC_PLUG | (1 << BIO_RW_UNPLUG)) | 165 | #define WRITE_SYNC_PLUG (WRITE | REQ_SYNC | REQ_NOIDLE) |
| 157 | #define WRITE_ODIRECT_PLUG (WRITE | (1 << BIO_RW_SYNCIO)) | 166 | #define WRITE_SYNC (WRITE | REQ_SYNC | REQ_NOIDLE | REQ_UNPLUG) |
| 158 | #define WRITE_META (WRITE | (1 << BIO_RW_META)) | 167 | #define WRITE_ODIRECT_PLUG (WRITE | REQ_SYNC) |
| 159 | #define SWRITE_SYNC_PLUG \ | 168 | #define WRITE_META (WRITE | REQ_META) |
| 160 | (SWRITE | (1 << BIO_RW_SYNCIO) | (1 << BIO_RW_NOIDLE)) | 169 | #define WRITE_FLUSH (WRITE | REQ_SYNC | REQ_NOIDLE | REQ_UNPLUG | \ |
| 161 | #define SWRITE_SYNC (SWRITE_SYNC_PLUG | (1 << BIO_RW_UNPLUG)) | 170 | REQ_FLUSH) |
| 162 | #define WRITE_BARRIER (WRITE | (1 << BIO_RW_BARRIER)) | 171 | #define WRITE_FUA (WRITE | REQ_SYNC | REQ_NOIDLE | REQ_UNPLUG | \ |
| 163 | 172 | REQ_FUA) | |
| 164 | /* | 173 | #define WRITE_FLUSH_FUA (WRITE | REQ_SYNC | REQ_NOIDLE | REQ_UNPLUG | \ |
| 165 | * These aren't really reads or writes, they pass down information about | 174 | REQ_FLUSH | REQ_FUA) |
| 166 | * parts of device that are now unused by the file system. | ||
| 167 | */ | ||
| 168 | #define DISCARD_NOBARRIER (WRITE | (1 << BIO_RW_DISCARD)) | ||
| 169 | #define DISCARD_BARRIER (DISCARD_NOBARRIER | (1 << BIO_RW_BARRIER)) | ||
| 170 | 175 | ||
| 171 | #define SEL_IN 1 | 176 | #define SEL_IN 1 |
| 172 | #define SEL_OUT 2 | 177 | #define SEL_OUT 2 |
| @@ -209,6 +214,7 @@ struct inodes_stat_t { | |||
| 209 | #define MS_KERNMOUNT (1<<22) /* this is a kern_mount call */ | 214 | #define MS_KERNMOUNT (1<<22) /* this is a kern_mount call */ |
| 210 | #define MS_I_VERSION (1<<23) /* Update inode I_version field */ | 215 | #define MS_I_VERSION (1<<23) /* Update inode I_version field */ |
| 211 | #define MS_STRICTATIME (1<<24) /* Always perform atime updates */ | 216 | #define MS_STRICTATIME (1<<24) /* Always perform atime updates */ |
| 217 | #define MS_BORN (1<<29) | ||
| 212 | #define MS_ACTIVE (1<<30) | 218 | #define MS_ACTIVE (1<<30) |
| 213 | #define MS_NOUSER (1<<31) | 219 | #define MS_NOUSER (1<<31) |
| 214 | 220 | ||
| @@ -235,6 +241,7 @@ struct inodes_stat_t { | |||
| 235 | #define S_NOCMTIME 128 /* Do not update file c/mtime */ | 241 | #define S_NOCMTIME 128 /* Do not update file c/mtime */ |
| 236 | #define S_SWAPFILE 256 /* Do not truncate: swapon got its bmaps */ | 242 | #define S_SWAPFILE 256 /* Do not truncate: swapon got its bmaps */ |
| 237 | #define S_PRIVATE 512 /* Inode is fs-internal */ | 243 | #define S_PRIVATE 512 /* Inode is fs-internal */ |
| 244 | #define S_IMA 1024 /* Inode has an associated IMA struct */ | ||
| 238 | 245 | ||
| 239 | /* | 246 | /* |
| 240 | * Note that nosuid etc flags are inode-specific: setting some file-system | 247 | * Note that nosuid etc flags are inode-specific: setting some file-system |
| @@ -269,6 +276,7 @@ struct inodes_stat_t { | |||
| 269 | #define IS_NOCMTIME(inode) ((inode)->i_flags & S_NOCMTIME) | 276 | #define IS_NOCMTIME(inode) ((inode)->i_flags & S_NOCMTIME) |
| 270 | #define IS_SWAPFILE(inode) ((inode)->i_flags & S_SWAPFILE) | 277 | #define IS_SWAPFILE(inode) ((inode)->i_flags & S_SWAPFILE) |
| 271 | #define IS_PRIVATE(inode) ((inode)->i_flags & S_PRIVATE) | 278 | #define IS_PRIVATE(inode) ((inode)->i_flags & S_PRIVATE) |
| 279 | #define IS_IMA(inode) ((inode)->i_flags & S_IMA) | ||
| 272 | 280 | ||
| 273 | /* the read-only stuff doesn't really belong here, but any other place is | 281 | /* the read-only stuff doesn't really belong here, but any other place is |
| 274 | probably as bad and I don't want to create yet another include file. */ | 282 | probably as bad and I don't want to create yet another include file. */ |
| @@ -309,12 +317,14 @@ struct inodes_stat_t { | |||
| 309 | #define BLKALIGNOFF _IO(0x12,122) | 317 | #define BLKALIGNOFF _IO(0x12,122) |
| 310 | #define BLKPBSZGET _IO(0x12,123) | 318 | #define BLKPBSZGET _IO(0x12,123) |
| 311 | #define BLKDISCARDZEROES _IO(0x12,124) | 319 | #define BLKDISCARDZEROES _IO(0x12,124) |
| 320 | #define BLKSECDISCARD _IO(0x12,125) | ||
| 312 | 321 | ||
| 313 | #define BMAP_IOCTL 1 /* obsolete - kept for compatibility */ | 322 | #define BMAP_IOCTL 1 /* obsolete - kept for compatibility */ |
| 314 | #define FIBMAP _IO(0x00,1) /* bmap access */ | 323 | #define FIBMAP _IO(0x00,1) /* bmap access */ |
| 315 | #define FIGETBSZ _IO(0x00,2) /* get the block size used for bmap */ | 324 | #define FIGETBSZ _IO(0x00,2) /* get the block size used for bmap */ |
| 316 | #define FIFREEZE _IOWR('X', 119, int) /* Freeze */ | 325 | #define FIFREEZE _IOWR('X', 119, int) /* Freeze */ |
| 317 | #define FITHAW _IOWR('X', 120, int) /* Thaw */ | 326 | #define FITHAW _IOWR('X', 120, int) /* Thaw */ |
| 327 | #define FITRIM _IOWR('X', 121, struct fstrim_range) /* Trim */ | ||
| 318 | 328 | ||
| 319 | #define FS_IOC_GETFLAGS _IOR('f', 1, long) | 329 | #define FS_IOC_GETFLAGS _IOR('f', 1, long) |
| 320 | #define FS_IOC_SETFLAGS _IOW('f', 2, long) | 330 | #define FS_IOC_SETFLAGS _IOW('f', 2, long) |
| @@ -403,19 +413,17 @@ extern void __init inode_init_early(void); | |||
| 403 | extern void __init files_init(unsigned long); | 413 | extern void __init files_init(unsigned long); |
| 404 | 414 | ||
| 405 | extern struct files_stat_struct files_stat; | 415 | extern struct files_stat_struct files_stat; |
| 406 | extern int get_max_files(void); | 416 | extern unsigned long get_max_files(void); |
| 407 | extern int sysctl_nr_open; | 417 | extern int sysctl_nr_open; |
| 408 | extern struct inodes_stat_t inodes_stat; | 418 | extern struct inodes_stat_t inodes_stat; |
| 409 | extern int leases_enable, lease_break_time; | 419 | extern int leases_enable, lease_break_time; |
| 410 | #ifdef CONFIG_DNOTIFY | ||
| 411 | extern int dir_notify_enable; | ||
| 412 | #endif | ||
| 413 | 420 | ||
| 414 | struct buffer_head; | 421 | struct buffer_head; |
| 415 | typedef int (get_block_t)(struct inode *inode, sector_t iblock, | 422 | typedef int (get_block_t)(struct inode *inode, sector_t iblock, |
| 416 | struct buffer_head *bh_result, int create); | 423 | struct buffer_head *bh_result, int create); |
| 417 | typedef void (dio_iodone_t)(struct kiocb *iocb, loff_t offset, | 424 | typedef void (dio_iodone_t)(struct kiocb *iocb, loff_t offset, |
| 418 | ssize_t bytes, void *private); | 425 | ssize_t bytes, void *private, int ret, |
| 426 | bool is_async); | ||
| 419 | 427 | ||
| 420 | /* | 428 | /* |
| 421 | * Attribute flags. These should be or-ed together to figure out what | 429 | * Attribute flags. These should be or-ed together to figure out what |
| @@ -685,6 +693,7 @@ struct block_device { | |||
| 685 | */ | 693 | */ |
| 686 | #define PAGECACHE_TAG_DIRTY 0 | 694 | #define PAGECACHE_TAG_DIRTY 0 |
| 687 | #define PAGECACHE_TAG_WRITEBACK 1 | 695 | #define PAGECACHE_TAG_WRITEBACK 1 |
| 696 | #define PAGECACHE_TAG_TOWRITE 2 | ||
| 688 | 697 | ||
| 689 | int mapping_tagged(struct address_space *mapping, int tag); | 698 | int mapping_tagged(struct address_space *mapping, int tag); |
| 690 | 699 | ||
| @@ -724,7 +733,8 @@ struct posix_acl; | |||
| 724 | 733 | ||
| 725 | struct inode { | 734 | struct inode { |
| 726 | struct hlist_node i_hash; | 735 | struct hlist_node i_hash; |
| 727 | struct list_head i_list; /* backing dev IO list */ | 736 | struct list_head i_wb_list; /* backing dev IO list */ |
| 737 | struct list_head i_lru; /* inode LRU list */ | ||
| 728 | struct list_head i_sb_list; | 738 | struct list_head i_sb_list; |
| 729 | struct list_head i_dentry; | 739 | struct list_head i_dentry; |
| 730 | unsigned long i_ino; | 740 | unsigned long i_ino; |
| @@ -768,12 +778,7 @@ struct inode { | |||
| 768 | 778 | ||
| 769 | #ifdef CONFIG_FSNOTIFY | 779 | #ifdef CONFIG_FSNOTIFY |
| 770 | __u32 i_fsnotify_mask; /* all events this inode cares about */ | 780 | __u32 i_fsnotify_mask; /* all events this inode cares about */ |
| 771 | struct hlist_head i_fsnotify_mark_entries; /* fsnotify mark entries */ | 781 | struct hlist_head i_fsnotify_marks; |
| 772 | #endif | ||
| 773 | |||
| 774 | #ifdef CONFIG_INOTIFY | ||
| 775 | struct list_head inotify_watches; /* watches on this inode */ | ||
| 776 | struct mutex inotify_mutex; /* protects the watches list */ | ||
| 777 | #endif | 782 | #endif |
| 778 | 783 | ||
| 779 | unsigned long i_state; | 784 | unsigned long i_state; |
| @@ -781,6 +786,10 @@ struct inode { | |||
| 781 | 786 | ||
| 782 | unsigned int i_flags; | 787 | unsigned int i_flags; |
| 783 | 788 | ||
| 789 | #ifdef CONFIG_IMA | ||
| 790 | /* protected by i_lock */ | ||
| 791 | unsigned int i_readcount; /* struct files open RO */ | ||
| 792 | #endif | ||
| 784 | atomic_t i_writecount; | 793 | atomic_t i_writecount; |
| 785 | #ifdef CONFIG_SECURITY | 794 | #ifdef CONFIG_SECURITY |
| 786 | void *i_security; | 795 | void *i_security; |
| @@ -792,6 +801,11 @@ struct inode { | |||
| 792 | void *i_private; /* fs or device private pointer */ | 801 | void *i_private; /* fs or device private pointer */ |
| 793 | }; | 802 | }; |
| 794 | 803 | ||
| 804 | static inline int inode_unhashed(struct inode *inode) | ||
| 805 | { | ||
| 806 | return hlist_unhashed(&inode->i_hash); | ||
| 807 | } | ||
| 808 | |||
| 795 | /* | 809 | /* |
| 796 | * inode->i_mutex nesting subclasses for the lock validator: | 810 | * inode->i_mutex nesting subclasses for the lock validator: |
| 797 | * | 811 | * |
| @@ -925,6 +939,9 @@ struct file { | |||
| 925 | #define f_vfsmnt f_path.mnt | 939 | #define f_vfsmnt f_path.mnt |
| 926 | const struct file_operations *f_op; | 940 | const struct file_operations *f_op; |
| 927 | spinlock_t f_lock; /* f_ep_links, f_flags, no IRQ */ | 941 | spinlock_t f_lock; /* f_ep_links, f_flags, no IRQ */ |
| 942 | #ifdef CONFIG_SMP | ||
| 943 | int f_sb_list_cpu; | ||
| 944 | #endif | ||
| 928 | atomic_long_t f_count; | 945 | atomic_long_t f_count; |
| 929 | unsigned int f_flags; | 946 | unsigned int f_flags; |
| 930 | fmode_t f_mode; | 947 | fmode_t f_mode; |
| @@ -949,9 +966,6 @@ struct file { | |||
| 949 | unsigned long f_mnt_write_state; | 966 | unsigned long f_mnt_write_state; |
| 950 | #endif | 967 | #endif |
| 951 | }; | 968 | }; |
| 952 | extern spinlock_t files_lock; | ||
| 953 | #define file_list_lock() spin_lock(&files_lock); | ||
| 954 | #define file_list_unlock() spin_unlock(&files_lock); | ||
| 955 | 969 | ||
| 956 | #define get_file(x) atomic_long_inc(&(x)->f_count) | 970 | #define get_file(x) atomic_long_inc(&(x)->f_count) |
| 957 | #define fput_atomic(x) atomic_long_add_unless(&(x)->f_count, -1, 1) | 971 | #define fput_atomic(x) atomic_long_add_unless(&(x)->f_count, -1, 1) |
| @@ -1116,6 +1130,7 @@ extern int fcntl_getlease(struct file *filp); | |||
| 1116 | 1130 | ||
| 1117 | /* fs/locks.c */ | 1131 | /* fs/locks.c */ |
| 1118 | extern void locks_init_lock(struct file_lock *); | 1132 | extern void locks_init_lock(struct file_lock *); |
| 1133 | extern struct file_lock * locks_alloc_lock(void); | ||
| 1119 | extern void locks_copy_lock(struct file_lock *, struct file_lock *); | 1134 | extern void locks_copy_lock(struct file_lock *, struct file_lock *); |
| 1120 | extern void __locks_copy_lock(struct file_lock *, const struct file_lock *); | 1135 | extern void __locks_copy_lock(struct file_lock *, const struct file_lock *); |
| 1121 | extern void locks_remove_posix(struct file *, fl_owner_t); | 1136 | extern void locks_remove_posix(struct file *, fl_owner_t); |
| @@ -1136,6 +1151,8 @@ extern int vfs_setlease(struct file *, long, struct file_lock **); | |||
| 1136 | extern int lease_modify(struct file_lock **, int); | 1151 | extern int lease_modify(struct file_lock **, int); |
| 1137 | extern int lock_may_read(struct inode *, loff_t start, unsigned long count); | 1152 | extern int lock_may_read(struct inode *, loff_t start, unsigned long count); |
| 1138 | extern int lock_may_write(struct inode *, loff_t start, unsigned long count); | 1153 | extern int lock_may_write(struct inode *, loff_t start, unsigned long count); |
| 1154 | extern void lock_flocks(void); | ||
| 1155 | extern void unlock_flocks(void); | ||
| 1139 | #else /* !CONFIG_FILE_LOCKING */ | 1156 | #else /* !CONFIG_FILE_LOCKING */ |
| 1140 | static inline int fcntl_getlk(struct file *file, struct flock __user *user) | 1157 | static inline int fcntl_getlk(struct file *file, struct flock __user *user) |
| 1141 | { | 1158 | { |
| @@ -1278,6 +1295,14 @@ static inline int lock_may_write(struct inode *inode, loff_t start, | |||
| 1278 | return 1; | 1295 | return 1; |
| 1279 | } | 1296 | } |
| 1280 | 1297 | ||
| 1298 | static inline void lock_flocks(void) | ||
| 1299 | { | ||
| 1300 | } | ||
| 1301 | |||
| 1302 | static inline void unlock_flocks(void) | ||
| 1303 | { | ||
| 1304 | } | ||
| 1305 | |||
| 1281 | #endif /* !CONFIG_FILE_LOCKING */ | 1306 | #endif /* !CONFIG_FILE_LOCKING */ |
| 1282 | 1307 | ||
| 1283 | 1308 | ||
| @@ -1294,6 +1319,11 @@ struct fasync_struct { | |||
| 1294 | 1319 | ||
| 1295 | /* SMP safe fasync helpers: */ | 1320 | /* SMP safe fasync helpers: */ |
| 1296 | extern int fasync_helper(int, struct file *, int, struct fasync_struct **); | 1321 | extern int fasync_helper(int, struct file *, int, struct fasync_struct **); |
| 1322 | extern struct fasync_struct *fasync_insert_entry(int, struct file *, struct fasync_struct **, struct fasync_struct *); | ||
| 1323 | extern int fasync_remove_entry(struct file *, struct fasync_struct **); | ||
| 1324 | extern struct fasync_struct *fasync_alloc(void); | ||
| 1325 | extern void fasync_free(struct fasync_struct *); | ||
| 1326 | |||
| 1297 | /* can be called from interrupts */ | 1327 | /* can be called from interrupts */ |
| 1298 | extern void kill_fasync(struct fasync_struct **, int, int); | 1328 | extern void kill_fasync(struct fasync_struct **, int, int); |
| 1299 | 1329 | ||
| @@ -1342,7 +1372,11 @@ struct super_block { | |||
| 1342 | 1372 | ||
| 1343 | struct list_head s_inodes; /* all inodes */ | 1373 | struct list_head s_inodes; /* all inodes */ |
| 1344 | struct hlist_head s_anon; /* anonymous dentries for (nfs) exporting */ | 1374 | struct hlist_head s_anon; /* anonymous dentries for (nfs) exporting */ |
| 1375 | #ifdef CONFIG_SMP | ||
| 1376 | struct list_head __percpu *s_files; | ||
| 1377 | #else | ||
| 1345 | struct list_head s_files; | 1378 | struct list_head s_files; |
| 1379 | #endif | ||
| 1346 | /* s_dentry_lru and s_nr_dentry_unused are protected by dcache_lock */ | 1380 | /* s_dentry_lru and s_nr_dentry_unused are protected by dcache_lock */ |
| 1347 | struct list_head s_dentry_lru; /* unused dentry lru */ | 1381 | struct list_head s_dentry_lru; /* unused dentry lru */ |
| 1348 | int s_nr_dentry_unused; /* # of dentry on lru */ | 1382 | int s_nr_dentry_unused; /* # of dentry on lru */ |
| @@ -1381,7 +1415,7 @@ struct super_block { | |||
| 1381 | * Saved mount options for lazy filesystems using | 1415 | * Saved mount options for lazy filesystems using |
| 1382 | * generic_show_options() | 1416 | * generic_show_options() |
| 1383 | */ | 1417 | */ |
| 1384 | char *s_options; | 1418 | char __rcu *s_options; |
| 1385 | }; | 1419 | }; |
| 1386 | 1420 | ||
| 1387 | extern struct timespec current_fs_time(struct super_block *sb); | 1421 | extern struct timespec current_fs_time(struct super_block *sb); |
| @@ -1479,8 +1513,8 @@ struct block_device_operations; | |||
| 1479 | 1513 | ||
| 1480 | /* | 1514 | /* |
| 1481 | * NOTE: | 1515 | * NOTE: |
| 1482 | * read, write, poll, fsync, readv, writev, unlocked_ioctl and compat_ioctl | 1516 | * all file operations except setlease can be called without |
| 1483 | * can be called without the big kernel lock held in all filesystems. | 1517 | * the big kernel lock held in all filesystems. |
| 1484 | */ | 1518 | */ |
| 1485 | struct file_operations { | 1519 | struct file_operations { |
| 1486 | struct module *owner; | 1520 | struct module *owner; |
| @@ -1491,7 +1525,6 @@ struct file_operations { | |||
| 1491 | ssize_t (*aio_write) (struct kiocb *, const struct iovec *, unsigned long, loff_t); | 1525 | ssize_t (*aio_write) (struct kiocb *, const struct iovec *, unsigned long, loff_t); |
| 1492 | int (*readdir) (struct file *, void *, filldir_t); | 1526 | int (*readdir) (struct file *, void *, filldir_t); |
| 1493 | unsigned int (*poll) (struct file *, struct poll_table_struct *); | 1527 | unsigned int (*poll) (struct file *, struct poll_table_struct *); |
| 1494 | int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long); | ||
| 1495 | long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long); | 1528 | long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long); |
| 1496 | long (*compat_ioctl) (struct file *, unsigned int, unsigned long); | 1529 | long (*compat_ioctl) (struct file *, unsigned int, unsigned long); |
| 1497 | int (*mmap) (struct file *, struct vm_area_struct *); | 1530 | int (*mmap) (struct file *, struct vm_area_struct *); |
| @@ -1561,8 +1594,8 @@ struct super_operations { | |||
| 1561 | 1594 | ||
| 1562 | void (*dirty_inode) (struct inode *); | 1595 | void (*dirty_inode) (struct inode *); |
| 1563 | int (*write_inode) (struct inode *, struct writeback_control *wbc); | 1596 | int (*write_inode) (struct inode *, struct writeback_control *wbc); |
| 1564 | void (*drop_inode) (struct inode *); | 1597 | int (*drop_inode) (struct inode *); |
| 1565 | void (*delete_inode) (struct inode *); | 1598 | void (*evict_inode) (struct inode *); |
| 1566 | void (*put_super) (struct super_block *); | 1599 | void (*put_super) (struct super_block *); |
| 1567 | void (*write_super) (struct super_block *); | 1600 | void (*write_super) (struct super_block *); |
| 1568 | int (*sync_fs)(struct super_block *sb, int wait); | 1601 | int (*sync_fs)(struct super_block *sb, int wait); |
| @@ -1570,7 +1603,6 @@ struct super_operations { | |||
| 1570 | int (*unfreeze_fs) (struct super_block *); | 1603 | int (*unfreeze_fs) (struct super_block *); |
| 1571 | int (*statfs) (struct dentry *, struct kstatfs *); | 1604 | int (*statfs) (struct dentry *, struct kstatfs *); |
| 1572 | int (*remount_fs) (struct super_block *, int *, char *); | 1605 | int (*remount_fs) (struct super_block *, int *, char *); |
| 1573 | void (*clear_inode) (struct inode *); | ||
| 1574 | void (*umount_begin) (struct super_block *); | 1606 | void (*umount_begin) (struct super_block *); |
| 1575 | 1607 | ||
| 1576 | int (*show_options)(struct seq_file *, struct vfsmount *); | 1608 | int (*show_options)(struct seq_file *, struct vfsmount *); |
| @@ -1580,6 +1612,7 @@ struct super_operations { | |||
| 1580 | ssize_t (*quota_write)(struct super_block *, int, const char *, size_t, loff_t); | 1612 | ssize_t (*quota_write)(struct super_block *, int, const char *, size_t, loff_t); |
| 1581 | #endif | 1613 | #endif |
| 1582 | int (*bdev_try_to_free_page)(struct super_block*, struct page*, gfp_t); | 1614 | int (*bdev_try_to_free_page)(struct super_block*, struct page*, gfp_t); |
| 1615 | int (*trim_fs) (struct super_block *, struct fstrim_range *); | ||
| 1583 | }; | 1616 | }; |
| 1584 | 1617 | ||
| 1585 | /* | 1618 | /* |
| @@ -1615,8 +1648,8 @@ struct super_operations { | |||
| 1615 | * I_FREEING Set when inode is about to be freed but still has dirty | 1648 | * I_FREEING Set when inode is about to be freed but still has dirty |
| 1616 | * pages or buffers attached or the inode itself is still | 1649 | * pages or buffers attached or the inode itself is still |
| 1617 | * dirty. | 1650 | * dirty. |
| 1618 | * I_CLEAR Set by clear_inode(). In this state the inode is clean | 1651 | * I_CLEAR Added by end_writeback(). In this state the inode is clean |
| 1619 | * and can be destroyed. | 1652 | * and can be destroyed. Inode keeps I_FREEING. |
| 1620 | * | 1653 | * |
| 1621 | * Inodes that are I_WILL_FREE, I_FREEING or I_CLEAR are | 1654 | * Inodes that are I_WILL_FREE, I_FREEING or I_CLEAR are |
| 1622 | * prohibited for many purposes. iget() must wait for | 1655 | * prohibited for many purposes. iget() must wait for |
| @@ -1630,16 +1663,17 @@ struct super_operations { | |||
| 1630 | * | 1663 | * |
| 1631 | * Q: What is the difference between I_WILL_FREE and I_FREEING? | 1664 | * Q: What is the difference between I_WILL_FREE and I_FREEING? |
| 1632 | */ | 1665 | */ |
| 1633 | #define I_DIRTY_SYNC 1 | 1666 | #define I_DIRTY_SYNC (1 << 0) |
| 1634 | #define I_DIRTY_DATASYNC 2 | 1667 | #define I_DIRTY_DATASYNC (1 << 1) |
| 1635 | #define I_DIRTY_PAGES 4 | 1668 | #define I_DIRTY_PAGES (1 << 2) |
| 1636 | #define __I_NEW 3 | 1669 | #define __I_NEW 3 |
| 1637 | #define I_NEW (1 << __I_NEW) | 1670 | #define I_NEW (1 << __I_NEW) |
| 1638 | #define I_WILL_FREE 16 | 1671 | #define I_WILL_FREE (1 << 4) |
| 1639 | #define I_FREEING 32 | 1672 | #define I_FREEING (1 << 5) |
| 1640 | #define I_CLEAR 64 | 1673 | #define I_CLEAR (1 << 6) |
| 1641 | #define __I_SYNC 7 | 1674 | #define __I_SYNC 7 |
| 1642 | #define I_SYNC (1 << __I_SYNC) | 1675 | #define I_SYNC (1 << __I_SYNC) |
| 1676 | #define I_REFERENCED (1 << 8) | ||
| 1643 | 1677 | ||
| 1644 | #define I_DIRTY (I_DIRTY_SYNC | I_DIRTY_DATASYNC | I_DIRTY_PAGES) | 1678 | #define I_DIRTY (I_DIRTY_SYNC | I_DIRTY_DATASYNC | I_DIRTY_PAGES) |
| 1645 | 1679 | ||
| @@ -1731,6 +1765,7 @@ static inline void file_accessed(struct file *file) | |||
| 1731 | } | 1765 | } |
| 1732 | 1766 | ||
| 1733 | int sync_inode(struct inode *inode, struct writeback_control *wbc); | 1767 | int sync_inode(struct inode *inode, struct writeback_control *wbc); |
| 1768 | int sync_inode_metadata(struct inode *inode, int wait); | ||
| 1734 | 1769 | ||
| 1735 | struct file_system_type { | 1770 | struct file_system_type { |
| 1736 | const char *name; | 1771 | const char *name; |
| @@ -1813,7 +1848,8 @@ extern struct vfsmount *collect_mounts(struct path *); | |||
| 1813 | extern void drop_collected_mounts(struct vfsmount *); | 1848 | extern void drop_collected_mounts(struct vfsmount *); |
| 1814 | extern int iterate_mounts(int (*)(struct vfsmount *, void *), void *, | 1849 | extern int iterate_mounts(int (*)(struct vfsmount *, void *), void *, |
| 1815 | struct vfsmount *); | 1850 | struct vfsmount *); |
| 1816 | extern int vfs_statfs(struct dentry *, struct kstatfs *); | 1851 | extern int vfs_statfs(struct path *, struct kstatfs *); |
| 1852 | extern int statfs_by_dentry(struct dentry *, struct kstatfs *); | ||
| 1817 | extern int freeze_super(struct super_block *super); | 1853 | extern int freeze_super(struct super_block *super); |
| 1818 | extern int thaw_super(struct super_block *super); | 1854 | extern int thaw_super(struct super_block *super); |
| 1819 | 1855 | ||
| @@ -2074,7 +2110,6 @@ extern int check_disk_change(struct block_device *); | |||
| 2074 | extern int __invalidate_device(struct block_device *); | 2110 | extern int __invalidate_device(struct block_device *); |
| 2075 | extern int invalidate_partition(struct gendisk *, int); | 2111 | extern int invalidate_partition(struct gendisk *, int); |
| 2076 | #endif | 2112 | #endif |
| 2077 | extern int invalidate_inodes(struct super_block *); | ||
| 2078 | unsigned long invalidate_mapping_pages(struct address_space *mapping, | 2113 | unsigned long invalidate_mapping_pages(struct address_space *mapping, |
| 2079 | pgoff_t start, pgoff_t end); | 2114 | pgoff_t start, pgoff_t end); |
| 2080 | 2115 | ||
| @@ -2158,14 +2193,13 @@ extern loff_t vfs_llseek(struct file *file, loff_t offset, int origin); | |||
| 2158 | 2193 | ||
| 2159 | extern int inode_init_always(struct super_block *, struct inode *); | 2194 | extern int inode_init_always(struct super_block *, struct inode *); |
| 2160 | extern void inode_init_once(struct inode *); | 2195 | extern void inode_init_once(struct inode *); |
| 2161 | extern void inode_add_to_lists(struct super_block *, struct inode *); | 2196 | extern void ihold(struct inode * inode); |
| 2162 | extern void iput(struct inode *); | 2197 | extern void iput(struct inode *); |
| 2163 | extern struct inode * igrab(struct inode *); | 2198 | extern struct inode * igrab(struct inode *); |
| 2164 | extern ino_t iunique(struct super_block *, ino_t); | 2199 | extern ino_t iunique(struct super_block *, ino_t); |
| 2165 | extern int inode_needs_sync(struct inode *inode); | 2200 | extern int inode_needs_sync(struct inode *inode); |
| 2166 | extern void generic_delete_inode(struct inode *inode); | 2201 | extern int generic_delete_inode(struct inode *inode); |
| 2167 | extern void generic_drop_inode(struct inode *inode); | 2202 | extern int generic_drop_inode(struct inode *inode); |
| 2168 | extern int generic_detach_inode(struct inode *inode); | ||
| 2169 | 2203 | ||
| 2170 | extern struct inode *ilookup5_nowait(struct super_block *sb, | 2204 | extern struct inode *ilookup5_nowait(struct super_block *sb, |
| 2171 | unsigned long hashval, int (*test)(struct inode *, void *), | 2205 | unsigned long hashval, int (*test)(struct inode *, void *), |
| @@ -2179,11 +2213,11 @@ extern struct inode * iget_locked(struct super_block *, unsigned long); | |||
| 2179 | extern int insert_inode_locked4(struct inode *, unsigned long, int (*test)(struct inode *, void *), void *); | 2213 | extern int insert_inode_locked4(struct inode *, unsigned long, int (*test)(struct inode *, void *), void *); |
| 2180 | extern int insert_inode_locked(struct inode *); | 2214 | extern int insert_inode_locked(struct inode *); |
| 2181 | extern void unlock_new_inode(struct inode *); | 2215 | extern void unlock_new_inode(struct inode *); |
| 2216 | extern unsigned int get_next_ino(void); | ||
| 2182 | 2217 | ||
| 2183 | extern void __iget(struct inode * inode); | 2218 | extern void __iget(struct inode * inode); |
| 2184 | extern void iget_failed(struct inode *); | 2219 | extern void iget_failed(struct inode *); |
| 2185 | extern void clear_inode(struct inode *); | 2220 | extern void end_writeback(struct inode *); |
| 2186 | extern void destroy_inode(struct inode *); | ||
| 2187 | extern void __destroy_inode(struct inode *); | 2221 | extern void __destroy_inode(struct inode *); |
| 2188 | extern struct inode *new_inode(struct super_block *); | 2222 | extern struct inode *new_inode(struct super_block *); |
| 2189 | extern int should_remove_suid(struct dentry *); | 2223 | extern int should_remove_suid(struct dentry *); |
| @@ -2191,14 +2225,13 @@ extern int file_remove_suid(struct file *); | |||
| 2191 | 2225 | ||
| 2192 | extern void __insert_inode_hash(struct inode *, unsigned long hashval); | 2226 | extern void __insert_inode_hash(struct inode *, unsigned long hashval); |
| 2193 | extern void remove_inode_hash(struct inode *); | 2227 | extern void remove_inode_hash(struct inode *); |
| 2194 | static inline void insert_inode_hash(struct inode *inode) { | 2228 | static inline void insert_inode_hash(struct inode *inode) |
| 2229 | { | ||
| 2195 | __insert_inode_hash(inode, inode->i_ino); | 2230 | __insert_inode_hash(inode, inode->i_ino); |
| 2196 | } | 2231 | } |
| 2232 | extern void inode_sb_list_add(struct inode *inode); | ||
| 2197 | 2233 | ||
| 2198 | extern void file_move(struct file *f, struct list_head *list); | ||
| 2199 | extern void file_kill(struct file *f); | ||
| 2200 | #ifdef CONFIG_BLOCK | 2234 | #ifdef CONFIG_BLOCK |
| 2201 | struct bio; | ||
| 2202 | extern void submit_bio(int, struct bio *); | 2235 | extern void submit_bio(int, struct bio *); |
| 2203 | extern int bdev_read_only(struct block_device *); | 2236 | extern int bdev_read_only(struct block_device *); |
| 2204 | #endif | 2237 | #endif |
| @@ -2265,19 +2298,8 @@ static inline int xip_truncate_page(struct address_space *mapping, loff_t from) | |||
| 2265 | #endif | 2298 | #endif |
| 2266 | 2299 | ||
| 2267 | #ifdef CONFIG_BLOCK | 2300 | #ifdef CONFIG_BLOCK |
| 2268 | struct bio; | ||
| 2269 | typedef void (dio_submit_t)(int rw, struct bio *bio, struct inode *inode, | 2301 | typedef void (dio_submit_t)(int rw, struct bio *bio, struct inode *inode, |
| 2270 | loff_t file_offset); | 2302 | loff_t file_offset); |
| 2271 | void dio_end_io(struct bio *bio, int error); | ||
| 2272 | |||
| 2273 | ssize_t __blockdev_direct_IO_newtrunc(int rw, struct kiocb *iocb, struct inode *inode, | ||
| 2274 | struct block_device *bdev, const struct iovec *iov, loff_t offset, | ||
| 2275 | unsigned long nr_segs, get_block_t get_block, dio_iodone_t end_io, | ||
| 2276 | dio_submit_t submit_io, int lock_type); | ||
| 2277 | ssize_t __blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode, | ||
| 2278 | struct block_device *bdev, const struct iovec *iov, loff_t offset, | ||
| 2279 | unsigned long nr_segs, get_block_t get_block, dio_iodone_t end_io, | ||
| 2280 | dio_submit_t submit_io, int lock_type); | ||
| 2281 | 2303 | ||
| 2282 | enum { | 2304 | enum { |
| 2283 | /* need locking between buffered and direct access */ | 2305 | /* need locking between buffered and direct access */ |
| @@ -2287,24 +2309,13 @@ enum { | |||
| 2287 | DIO_SKIP_HOLES = 0x02, | 2309 | DIO_SKIP_HOLES = 0x02, |
| 2288 | }; | 2310 | }; |
| 2289 | 2311 | ||
| 2290 | static inline ssize_t blockdev_direct_IO_newtrunc(int rw, struct kiocb *iocb, | 2312 | void dio_end_io(struct bio *bio, int error); |
| 2291 | struct inode *inode, struct block_device *bdev, const struct iovec *iov, | 2313 | |
| 2292 | loff_t offset, unsigned long nr_segs, get_block_t get_block, | 2314 | ssize_t __blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode, |
| 2293 | dio_iodone_t end_io) | 2315 | struct block_device *bdev, const struct iovec *iov, loff_t offset, |
| 2294 | { | 2316 | unsigned long nr_segs, get_block_t get_block, dio_iodone_t end_io, |
| 2295 | return __blockdev_direct_IO_newtrunc(rw, iocb, inode, bdev, iov, offset, | 2317 | dio_submit_t submit_io, int flags); |
| 2296 | nr_segs, get_block, end_io, NULL, | ||
| 2297 | DIO_LOCKING | DIO_SKIP_HOLES); | ||
| 2298 | } | ||
| 2299 | 2318 | ||
| 2300 | static inline ssize_t blockdev_direct_IO_no_locking_newtrunc(int rw, struct kiocb *iocb, | ||
| 2301 | struct inode *inode, struct block_device *bdev, const struct iovec *iov, | ||
| 2302 | loff_t offset, unsigned long nr_segs, get_block_t get_block, | ||
| 2303 | dio_iodone_t end_io) | ||
| 2304 | { | ||
| 2305 | return __blockdev_direct_IO_newtrunc(rw, iocb, inode, bdev, iov, offset, | ||
| 2306 | nr_segs, get_block, end_io, NULL, 0); | ||
| 2307 | } | ||
| 2308 | static inline ssize_t blockdev_direct_IO(int rw, struct kiocb *iocb, | 2319 | static inline ssize_t blockdev_direct_IO(int rw, struct kiocb *iocb, |
| 2309 | struct inode *inode, struct block_device *bdev, const struct iovec *iov, | 2320 | struct inode *inode, struct block_device *bdev, const struct iovec *iov, |
| 2310 | loff_t offset, unsigned long nr_segs, get_block_t get_block, | 2321 | loff_t offset, unsigned long nr_segs, get_block_t get_block, |
| @@ -2314,15 +2325,6 @@ static inline ssize_t blockdev_direct_IO(int rw, struct kiocb *iocb, | |||
| 2314 | nr_segs, get_block, end_io, NULL, | 2325 | nr_segs, get_block, end_io, NULL, |
| 2315 | DIO_LOCKING | DIO_SKIP_HOLES); | 2326 | DIO_LOCKING | DIO_SKIP_HOLES); |
| 2316 | } | 2327 | } |
| 2317 | |||
| 2318 | static inline ssize_t blockdev_direct_IO_no_locking(int rw, struct kiocb *iocb, | ||
| 2319 | struct inode *inode, struct block_device *bdev, const struct iovec *iov, | ||
| 2320 | loff_t offset, unsigned long nr_segs, get_block_t get_block, | ||
| 2321 | dio_iodone_t end_io) | ||
| 2322 | { | ||
| 2323 | return __blockdev_direct_IO(rw, iocb, inode, bdev, iov, offset, | ||
| 2324 | nr_segs, get_block, end_io, NULL, 0); | ||
| 2325 | } | ||
| 2326 | #endif | 2328 | #endif |
| 2327 | 2329 | ||
| 2328 | extern const struct file_operations generic_ro_fops; | 2330 | extern const struct file_operations generic_ro_fops; |
| @@ -2349,10 +2351,10 @@ void inode_set_bytes(struct inode *inode, loff_t bytes); | |||
| 2349 | 2351 | ||
| 2350 | extern int vfs_readdir(struct file *, filldir_t, void *); | 2352 | extern int vfs_readdir(struct file *, filldir_t, void *); |
| 2351 | 2353 | ||
| 2352 | extern int vfs_stat(char __user *, struct kstat *); | 2354 | extern int vfs_stat(const char __user *, struct kstat *); |
| 2353 | extern int vfs_lstat(char __user *, struct kstat *); | 2355 | extern int vfs_lstat(const char __user *, struct kstat *); |
| 2354 | extern int vfs_fstat(unsigned int, struct kstat *); | 2356 | extern int vfs_fstat(unsigned int, struct kstat *); |
| 2355 | extern int vfs_fstatat(int , char __user *, struct kstat *, int); | 2357 | extern int vfs_fstatat(int , const char __user *, struct kstat *, int); |
| 2356 | 2358 | ||
| 2357 | extern int do_vfs_ioctl(struct file *filp, unsigned int fd, unsigned int cmd, | 2359 | extern int do_vfs_ioctl(struct file *filp, unsigned int fd, unsigned int cmd, |
| 2358 | unsigned long arg); | 2360 | unsigned long arg); |
| @@ -2384,7 +2386,6 @@ extern int simple_link(struct dentry *, struct inode *, struct dentry *); | |||
| 2384 | extern int simple_unlink(struct inode *, struct dentry *); | 2386 | extern int simple_unlink(struct inode *, struct dentry *); |
| 2385 | extern int simple_rmdir(struct inode *, struct dentry *); | 2387 | extern int simple_rmdir(struct inode *, struct dentry *); |
| 2386 | extern int simple_rename(struct inode *, struct dentry *, struct inode *, struct dentry *); | 2388 | extern int simple_rename(struct inode *, struct dentry *, struct inode *, struct dentry *); |
| 2387 | extern int simple_setsize(struct inode *, loff_t); | ||
| 2388 | extern int noop_fsync(struct file *, int); | 2389 | extern int noop_fsync(struct file *, int); |
| 2389 | extern int simple_empty(struct dentry *); | 2390 | extern int simple_empty(struct dentry *); |
| 2390 | extern int simple_readpage(struct file *file, struct page *page); | 2391 | extern int simple_readpage(struct file *file, struct page *page); |
| @@ -2412,6 +2413,8 @@ extern ssize_t simple_write_to_buffer(void *to, size_t available, loff_t *ppos, | |||
| 2412 | 2413 | ||
| 2413 | extern int generic_file_fsync(struct file *, int); | 2414 | extern int generic_file_fsync(struct file *, int); |
| 2414 | 2415 | ||
| 2416 | extern int generic_check_addressable(unsigned, u64); | ||
| 2417 | |||
| 2415 | #ifdef CONFIG_MIGRATION | 2418 | #ifdef CONFIG_MIGRATION |
| 2416 | extern int buffer_migrate_page(struct address_space *, | 2419 | extern int buffer_migrate_page(struct address_space *, |
| 2417 | struct page *, struct page *); | 2420 | struct page *, struct page *); |
| @@ -2421,8 +2424,7 @@ extern int buffer_migrate_page(struct address_space *, | |||
| 2421 | 2424 | ||
| 2422 | extern int inode_change_ok(const struct inode *, struct iattr *); | 2425 | extern int inode_change_ok(const struct inode *, struct iattr *); |
| 2423 | extern int inode_newsize_ok(const struct inode *, loff_t offset); | 2426 | extern int inode_newsize_ok(const struct inode *, loff_t offset); |
| 2424 | extern int __must_check inode_setattr(struct inode *, const struct iattr *); | 2427 | extern void setattr_copy(struct inode *inode, const struct iattr *attr); |
| 2425 | extern void generic_setattr(struct inode *inode, const struct iattr *attr); | ||
| 2426 | 2428 | ||
| 2427 | extern void file_update_time(struct file *file); | 2429 | extern void file_update_time(struct file *file); |
| 2428 | 2430 | ||
| @@ -2489,6 +2491,7 @@ static const struct file_operations __fops = { \ | |||
| 2489 | .release = simple_attr_release, \ | 2491 | .release = simple_attr_release, \ |
| 2490 | .read = simple_attr_read, \ | 2492 | .read = simple_attr_read, \ |
| 2491 | .write = simple_attr_write, \ | 2493 | .write = simple_attr_write, \ |
| 2494 | .llseek = generic_file_llseek, \ | ||
| 2492 | }; | 2495 | }; |
| 2493 | 2496 | ||
| 2494 | static inline void __attribute__((format(printf, 1, 2))) | 2497 | static inline void __attribute__((format(printf, 1, 2))) |
| @@ -2509,11 +2512,15 @@ ssize_t simple_attr_write(struct file *file, const char __user *buf, | |||
| 2509 | struct ctl_table; | 2512 | struct ctl_table; |
| 2510 | int proc_nr_files(struct ctl_table *table, int write, | 2513 | int proc_nr_files(struct ctl_table *table, int write, |
| 2511 | void __user *buffer, size_t *lenp, loff_t *ppos); | 2514 | void __user *buffer, size_t *lenp, loff_t *ppos); |
| 2512 | 2515 | int proc_nr_dentry(struct ctl_table *table, int write, | |
| 2516 | void __user *buffer, size_t *lenp, loff_t *ppos); | ||
| 2517 | int proc_nr_inodes(struct ctl_table *table, int write, | ||
| 2518 | void __user *buffer, size_t *lenp, loff_t *ppos); | ||
| 2513 | int __init get_filesystem_list(char *buf); | 2519 | int __init get_filesystem_list(char *buf); |
| 2514 | 2520 | ||
| 2515 | #define ACC_MODE(x) ("\004\002\006\006"[(x)&O_ACCMODE]) | 2521 | #define ACC_MODE(x) ("\004\002\006\006"[(x)&O_ACCMODE]) |
| 2516 | #define OPEN_FMODE(flag) ((__force fmode_t)((flag + 1) & O_ACCMODE)) | 2522 | #define OPEN_FMODE(flag) ((__force fmode_t)(((flag + 1) & O_ACCMODE) | \ |
| 2523 | (flag & FMODE_NONOTIFY))) | ||
| 2517 | 2524 | ||
| 2518 | #endif /* __KERNEL__ */ | 2525 | #endif /* __KERNEL__ */ |
| 2519 | #endif /* _LINUX_FS_H */ | 2526 | #endif /* _LINUX_FS_H */ |
diff --git a/include/linux/fs_struct.h b/include/linux/fs_struct.h index 78a05bfcd8eb..a42b5bf02f8b 100644 --- a/include/linux/fs_struct.h +++ b/include/linux/fs_struct.h | |||
| @@ -5,7 +5,7 @@ | |||
| 5 | 5 | ||
| 6 | struct fs_struct { | 6 | struct fs_struct { |
| 7 | int users; | 7 | int users; |
| 8 | rwlock_t lock; | 8 | spinlock_t lock; |
| 9 | int umask; | 9 | int umask; |
| 10 | int in_exec; | 10 | int in_exec; |
| 11 | struct path root, pwd; | 11 | struct path root, pwd; |
| @@ -21,4 +21,31 @@ extern void free_fs_struct(struct fs_struct *); | |||
| 21 | extern void daemonize_fs_struct(void); | 21 | extern void daemonize_fs_struct(void); |
| 22 | extern int unshare_fs_struct(void); | 22 | extern int unshare_fs_struct(void); |
| 23 | 23 | ||
| 24 | static inline void get_fs_root(struct fs_struct *fs, struct path *root) | ||
| 25 | { | ||
| 26 | spin_lock(&fs->lock); | ||
| 27 | *root = fs->root; | ||
| 28 | path_get(root); | ||
| 29 | spin_unlock(&fs->lock); | ||
| 30 | } | ||
| 31 | |||
| 32 | static inline void get_fs_pwd(struct fs_struct *fs, struct path *pwd) | ||
| 33 | { | ||
| 34 | spin_lock(&fs->lock); | ||
| 35 | *pwd = fs->pwd; | ||
| 36 | path_get(pwd); | ||
| 37 | spin_unlock(&fs->lock); | ||
| 38 | } | ||
| 39 | |||
| 40 | static inline void get_fs_root_and_pwd(struct fs_struct *fs, struct path *root, | ||
| 41 | struct path *pwd) | ||
| 42 | { | ||
| 43 | spin_lock(&fs->lock); | ||
| 44 | *root = fs->root; | ||
| 45 | path_get(root); | ||
| 46 | *pwd = fs->pwd; | ||
| 47 | path_get(pwd); | ||
| 48 | spin_unlock(&fs->lock); | ||
| 49 | } | ||
| 50 | |||
| 24 | #endif /* _LINUX_FS_STRUCT_H */ | 51 | #endif /* _LINUX_FS_STRUCT_H */ |
diff --git a/include/linux/fscache-cache.h b/include/linux/fscache-cache.h index c57db27ac861..b8581c09d19f 100644 --- a/include/linux/fscache-cache.h +++ b/include/linux/fscache-cache.h | |||
| @@ -20,7 +20,7 @@ | |||
| 20 | 20 | ||
| 21 | #include <linux/fscache.h> | 21 | #include <linux/fscache.h> |
| 22 | #include <linux/sched.h> | 22 | #include <linux/sched.h> |
| 23 | #include <linux/slow-work.h> | 23 | #include <linux/workqueue.h> |
| 24 | 24 | ||
| 25 | #define NR_MAXCACHES BITS_PER_LONG | 25 | #define NR_MAXCACHES BITS_PER_LONG |
| 26 | 26 | ||
| @@ -76,18 +76,14 @@ typedef void (*fscache_operation_release_t)(struct fscache_operation *op); | |||
| 76 | typedef void (*fscache_operation_processor_t)(struct fscache_operation *op); | 76 | typedef void (*fscache_operation_processor_t)(struct fscache_operation *op); |
| 77 | 77 | ||
| 78 | struct fscache_operation { | 78 | struct fscache_operation { |
| 79 | union { | 79 | struct work_struct work; /* record for async ops */ |
| 80 | struct work_struct fast_work; /* record for fast ops */ | ||
| 81 | struct slow_work slow_work; /* record for (very) slow ops */ | ||
| 82 | }; | ||
| 83 | struct list_head pend_link; /* link in object->pending_ops */ | 80 | struct list_head pend_link; /* link in object->pending_ops */ |
| 84 | struct fscache_object *object; /* object to be operated upon */ | 81 | struct fscache_object *object; /* object to be operated upon */ |
| 85 | 82 | ||
| 86 | unsigned long flags; | 83 | unsigned long flags; |
| 87 | #define FSCACHE_OP_TYPE 0x000f /* operation type */ | 84 | #define FSCACHE_OP_TYPE 0x000f /* operation type */ |
| 88 | #define FSCACHE_OP_FAST 0x0001 /* - fast op, processor may not sleep for disk */ | 85 | #define FSCACHE_OP_ASYNC 0x0001 /* - async op, processor may sleep for disk */ |
| 89 | #define FSCACHE_OP_SLOW 0x0002 /* - (very) slow op, processor may sleep for disk */ | 86 | #define FSCACHE_OP_MYTHREAD 0x0002 /* - processing is done be issuing thread, not pool */ |
| 90 | #define FSCACHE_OP_MYTHREAD 0x0003 /* - processing is done be issuing thread, not pool */ | ||
| 91 | #define FSCACHE_OP_WAITING 4 /* cleared when op is woken */ | 87 | #define FSCACHE_OP_WAITING 4 /* cleared when op is woken */ |
| 92 | #define FSCACHE_OP_EXCLUSIVE 5 /* exclusive op, other ops must wait */ | 88 | #define FSCACHE_OP_EXCLUSIVE 5 /* exclusive op, other ops must wait */ |
| 93 | #define FSCACHE_OP_DEAD 6 /* op is now dead */ | 89 | #define FSCACHE_OP_DEAD 6 /* op is now dead */ |
| @@ -105,7 +101,8 @@ struct fscache_operation { | |||
| 105 | /* operation releaser */ | 101 | /* operation releaser */ |
| 106 | fscache_operation_release_t release; | 102 | fscache_operation_release_t release; |
| 107 | 103 | ||
| 108 | #ifdef CONFIG_SLOW_WORK_DEBUG | 104 | #ifdef CONFIG_WORKQUEUE_DEBUGFS |
| 105 | struct work_struct put_work; /* work to delay operation put */ | ||
| 109 | const char *name; /* operation name */ | 106 | const char *name; /* operation name */ |
| 110 | const char *state; /* operation state */ | 107 | const char *state; /* operation state */ |
| 111 | #define fscache_set_op_name(OP, N) do { (OP)->name = (N); } while(0) | 108 | #define fscache_set_op_name(OP, N) do { (OP)->name = (N); } while(0) |
| @@ -117,7 +114,7 @@ struct fscache_operation { | |||
| 117 | }; | 114 | }; |
| 118 | 115 | ||
| 119 | extern atomic_t fscache_op_debug_id; | 116 | extern atomic_t fscache_op_debug_id; |
| 120 | extern const struct slow_work_ops fscache_op_slow_work_ops; | 117 | extern void fscache_op_work_func(struct work_struct *work); |
| 121 | 118 | ||
| 122 | extern void fscache_enqueue_operation(struct fscache_operation *); | 119 | extern void fscache_enqueue_operation(struct fscache_operation *); |
| 123 | extern void fscache_put_operation(struct fscache_operation *); | 120 | extern void fscache_put_operation(struct fscache_operation *); |
| @@ -128,33 +125,21 @@ extern void fscache_put_operation(struct fscache_operation *); | |||
| 128 | * @release: The release function to assign | 125 | * @release: The release function to assign |
| 129 | * | 126 | * |
| 130 | * Do basic initialisation of an operation. The caller must still set flags, | 127 | * Do basic initialisation of an operation. The caller must still set flags, |
| 131 | * object, either fast_work or slow_work if necessary, and processor if needed. | 128 | * object and processor if needed. |
| 132 | */ | 129 | */ |
| 133 | static inline void fscache_operation_init(struct fscache_operation *op, | 130 | static inline void fscache_operation_init(struct fscache_operation *op, |
| 134 | fscache_operation_release_t release) | 131 | fscache_operation_processor_t processor, |
| 132 | fscache_operation_release_t release) | ||
| 135 | { | 133 | { |
| 134 | INIT_WORK(&op->work, fscache_op_work_func); | ||
| 136 | atomic_set(&op->usage, 1); | 135 | atomic_set(&op->usage, 1); |
| 137 | op->debug_id = atomic_inc_return(&fscache_op_debug_id); | 136 | op->debug_id = atomic_inc_return(&fscache_op_debug_id); |
| 137 | op->processor = processor; | ||
| 138 | op->release = release; | 138 | op->release = release; |
| 139 | INIT_LIST_HEAD(&op->pend_link); | 139 | INIT_LIST_HEAD(&op->pend_link); |
| 140 | fscache_set_op_state(op, "Init"); | 140 | fscache_set_op_state(op, "Init"); |
| 141 | } | 141 | } |
| 142 | 142 | ||
| 143 | /** | ||
| 144 | * fscache_operation_init_slow - Do additional initialisation of a slow op | ||
| 145 | * @op: The operation to initialise | ||
| 146 | * @processor: The processor function to assign | ||
| 147 | * | ||
| 148 | * Do additional initialisation of an operation as required for slow work. | ||
| 149 | */ | ||
| 150 | static inline | ||
| 151 | void fscache_operation_init_slow(struct fscache_operation *op, | ||
| 152 | fscache_operation_processor_t processor) | ||
| 153 | { | ||
| 154 | op->processor = processor; | ||
| 155 | slow_work_init(&op->slow_work, &fscache_op_slow_work_ops); | ||
| 156 | } | ||
| 157 | |||
| 158 | /* | 143 | /* |
| 159 | * data read operation | 144 | * data read operation |
| 160 | */ | 145 | */ |
| @@ -389,7 +374,7 @@ struct fscache_object { | |||
| 389 | struct fscache_cache *cache; /* cache that supplied this object */ | 374 | struct fscache_cache *cache; /* cache that supplied this object */ |
| 390 | struct fscache_cookie *cookie; /* netfs's file/index object */ | 375 | struct fscache_cookie *cookie; /* netfs's file/index object */ |
| 391 | struct fscache_object *parent; /* parent object */ | 376 | struct fscache_object *parent; /* parent object */ |
| 392 | struct slow_work work; /* attention scheduling record */ | 377 | struct work_struct work; /* attention scheduling record */ |
| 393 | struct list_head dependents; /* FIFO of dependent objects */ | 378 | struct list_head dependents; /* FIFO of dependent objects */ |
| 394 | struct list_head dep_link; /* link in parent's dependents list */ | 379 | struct list_head dep_link; /* link in parent's dependents list */ |
| 395 | struct list_head pending_ops; /* unstarted operations on this object */ | 380 | struct list_head pending_ops; /* unstarted operations on this object */ |
| @@ -411,7 +396,7 @@ extern const char *fscache_object_states[]; | |||
| 411 | (test_bit(FSCACHE_IOERROR, &(obj)->cache->flags) && \ | 396 | (test_bit(FSCACHE_IOERROR, &(obj)->cache->flags) && \ |
| 412 | (obj)->state >= FSCACHE_OBJECT_DYING) | 397 | (obj)->state >= FSCACHE_OBJECT_DYING) |
| 413 | 398 | ||
| 414 | extern const struct slow_work_ops fscache_object_slow_work_ops; | 399 | extern void fscache_object_work_func(struct work_struct *work); |
| 415 | 400 | ||
| 416 | /** | 401 | /** |
| 417 | * fscache_object_init - Initialise a cache object description | 402 | * fscache_object_init - Initialise a cache object description |
| @@ -433,7 +418,7 @@ void fscache_object_init(struct fscache_object *object, | |||
| 433 | spin_lock_init(&object->lock); | 418 | spin_lock_init(&object->lock); |
| 434 | INIT_LIST_HEAD(&object->cache_link); | 419 | INIT_LIST_HEAD(&object->cache_link); |
| 435 | INIT_HLIST_NODE(&object->cookie_link); | 420 | INIT_HLIST_NODE(&object->cookie_link); |
| 436 | vslow_work_init(&object->work, &fscache_object_slow_work_ops); | 421 | INIT_WORK(&object->work, fscache_object_work_func); |
| 437 | INIT_LIST_HEAD(&object->dependents); | 422 | INIT_LIST_HEAD(&object->dependents); |
| 438 | INIT_LIST_HEAD(&object->dep_link); | 423 | INIT_LIST_HEAD(&object->dep_link); |
| 439 | INIT_LIST_HEAD(&object->pending_ops); | 424 | INIT_LIST_HEAD(&object->pending_ops); |
| @@ -534,6 +519,8 @@ extern void fscache_io_error(struct fscache_cache *cache); | |||
| 534 | extern void fscache_mark_pages_cached(struct fscache_retrieval *op, | 519 | extern void fscache_mark_pages_cached(struct fscache_retrieval *op, |
| 535 | struct pagevec *pagevec); | 520 | struct pagevec *pagevec); |
| 536 | 521 | ||
| 522 | extern bool fscache_object_sleep_till_congested(signed long *timeoutp); | ||
| 523 | |||
| 537 | extern enum fscache_checkaux fscache_check_aux(struct fscache_object *object, | 524 | extern enum fscache_checkaux fscache_check_aux(struct fscache_object *object, |
| 538 | const void *data, | 525 | const void *data, |
| 539 | uint16_t datalen); | 526 | uint16_t datalen); |
diff --git a/include/linux/fscache.h b/include/linux/fscache.h index 595ce49288b7..ec0dad5ab90f 100644 --- a/include/linux/fscache.h +++ b/include/linux/fscache.h | |||
| @@ -85,7 +85,7 @@ struct fscache_cookie_def { | |||
| 85 | 85 | ||
| 86 | /* get an index key | 86 | /* get an index key |
| 87 | * - should store the key data in the buffer | 87 | * - should store the key data in the buffer |
| 88 | * - should return the amount of amount stored | 88 | * - should return the amount of data stored |
| 89 | * - not permitted to return an error | 89 | * - not permitted to return an error |
| 90 | * - the netfs data from the cookie being used as the source is | 90 | * - the netfs data from the cookie being used as the source is |
| 91 | * presented | 91 | * presented |
| @@ -454,6 +454,7 @@ int fscache_read_or_alloc_page(struct fscache_cookie *cookie, | |||
| 454 | * @cookie: The cookie representing the cache object | 454 | * @cookie: The cookie representing the cache object |
| 455 | * @mapping: The netfs inode mapping to which the pages will be attached | 455 | * @mapping: The netfs inode mapping to which the pages will be attached |
| 456 | * @pages: A list of potential netfs pages to be filled | 456 | * @pages: A list of potential netfs pages to be filled |
| 457 | * @nr_pages: Number of pages to be read and/or allocated | ||
| 457 | * @end_io_func: The callback to invoke when and if each page is filled | 458 | * @end_io_func: The callback to invoke when and if each page is filled |
| 458 | * @context: An arbitrary piece of data to pass on to end_io_func() | 459 | * @context: An arbitrary piece of data to pass on to end_io_func() |
| 459 | * @gfp: The conditions under which memory allocation should be made | 460 | * @gfp: The conditions under which memory allocation should be made |
diff --git a/include/linux/fsl-diu-fb.h b/include/linux/fsl-diu-fb.h new file mode 100644 index 000000000000..fc295d7ea463 --- /dev/null +++ b/include/linux/fsl-diu-fb.h | |||
| @@ -0,0 +1,223 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2008 Freescale Semiconductor, Inc. All Rights Reserved. | ||
| 3 | * | ||
| 4 | * Freescale DIU Frame Buffer device driver | ||
| 5 | * | ||
| 6 | * Authors: Hongjun Chen <hong-jun.chen@freescale.com> | ||
| 7 | * Paul Widmer <paul.widmer@freescale.com> | ||
| 8 | * Srikanth Srinivasan <srikanth.srinivasan@freescale.com> | ||
| 9 | * York Sun <yorksun@freescale.com> | ||
| 10 | * | ||
| 11 | * Based on imxfb.c Copyright (C) 2004 S.Hauer, Pengutronix | ||
| 12 | * | ||
| 13 | * This program is free software; you can redistribute it and/or modify it | ||
| 14 | * under the terms of the GNU General Public License as published by the | ||
| 15 | * Free Software Foundation; either version 2 of the License, or (at your | ||
| 16 | * option) any later version. | ||
| 17 | * | ||
| 18 | */ | ||
| 19 | |||
| 20 | #ifndef __FSL_DIU_FB_H__ | ||
| 21 | #define __FSL_DIU_FB_H__ | ||
| 22 | |||
| 23 | /* Arbitrary threshold to determine the allocation method | ||
| 24 | * See mpc8610fb_set_par(), map_video_memory(), and unmap_video_memory() | ||
| 25 | */ | ||
| 26 | #define MEM_ALLOC_THRESHOLD (1024*768*4+32) | ||
| 27 | /* Minimum value that the pixel clock can be set to in pico seconds | ||
| 28 | * This is determined by platform clock/3 where the minimum platform | ||
| 29 | * clock is 533MHz. This gives 5629 pico seconds. | ||
| 30 | */ | ||
| 31 | #define MIN_PIX_CLK 5629 | ||
| 32 | #define MAX_PIX_CLK 96096 | ||
| 33 | |||
| 34 | #include <linux/types.h> | ||
| 35 | |||
| 36 | struct mfb_alpha { | ||
| 37 | int enable; | ||
| 38 | int alpha; | ||
| 39 | }; | ||
| 40 | |||
| 41 | struct mfb_chroma_key { | ||
| 42 | int enable; | ||
| 43 | __u8 red_max; | ||
| 44 | __u8 green_max; | ||
| 45 | __u8 blue_max; | ||
| 46 | __u8 red_min; | ||
| 47 | __u8 green_min; | ||
| 48 | __u8 blue_min; | ||
| 49 | }; | ||
| 50 | |||
| 51 | struct aoi_display_offset { | ||
| 52 | int x_aoi_d; | ||
| 53 | int y_aoi_d; | ||
| 54 | }; | ||
| 55 | |||
| 56 | #define MFB_SET_CHROMA_KEY _IOW('M', 1, struct mfb_chroma_key) | ||
| 57 | #define MFB_WAIT_FOR_VSYNC _IOW('F', 0x20, u_int32_t) | ||
| 58 | #define MFB_SET_BRIGHTNESS _IOW('M', 3, __u8) | ||
| 59 | |||
| 60 | #define MFB_SET_ALPHA 0x80014d00 | ||
| 61 | #define MFB_GET_ALPHA 0x40014d00 | ||
| 62 | #define MFB_SET_AOID 0x80084d04 | ||
| 63 | #define MFB_GET_AOID 0x40084d04 | ||
| 64 | #define MFB_SET_PIXFMT 0x80014d08 | ||
| 65 | #define MFB_GET_PIXFMT 0x40014d08 | ||
| 66 | |||
| 67 | #define FBIOGET_GWINFO 0x46E0 | ||
| 68 | #define FBIOPUT_GWINFO 0x46E1 | ||
| 69 | |||
| 70 | #ifdef __KERNEL__ | ||
| 71 | #include <linux/spinlock.h> | ||
| 72 | |||
| 73 | /* | ||
| 74 | * These are the fields of area descriptor(in DDR memory) for every plane | ||
| 75 | */ | ||
| 76 | struct diu_ad { | ||
| 77 | /* Word 0(32-bit) in DDR memory */ | ||
| 78 | /* __u16 comp; */ | ||
| 79 | /* __u16 pixel_s:2; */ | ||
| 80 | /* __u16 pallete:1; */ | ||
| 81 | /* __u16 red_c:2; */ | ||
| 82 | /* __u16 green_c:2; */ | ||
| 83 | /* __u16 blue_c:2; */ | ||
| 84 | /* __u16 alpha_c:3; */ | ||
| 85 | /* __u16 byte_f:1; */ | ||
| 86 | /* __u16 res0:3; */ | ||
| 87 | |||
| 88 | __be32 pix_fmt; /* hard coding pixel format */ | ||
| 89 | |||
| 90 | /* Word 1(32-bit) in DDR memory */ | ||
| 91 | __le32 addr; | ||
| 92 | |||
| 93 | /* Word 2(32-bit) in DDR memory */ | ||
| 94 | /* __u32 delta_xs:11; */ | ||
| 95 | /* __u32 res1:1; */ | ||
| 96 | /* __u32 delta_ys:11; */ | ||
| 97 | /* __u32 res2:1; */ | ||
| 98 | /* __u32 g_alpha:8; */ | ||
| 99 | __le32 src_size_g_alpha; | ||
| 100 | |||
| 101 | /* Word 3(32-bit) in DDR memory */ | ||
| 102 | /* __u32 delta_xi:11; */ | ||
| 103 | /* __u32 res3:5; */ | ||
| 104 | /* __u32 delta_yi:11; */ | ||
| 105 | /* __u32 res4:3; */ | ||
| 106 | /* __u32 flip:2; */ | ||
| 107 | __le32 aoi_size; | ||
| 108 | |||
| 109 | /* Word 4(32-bit) in DDR memory */ | ||
| 110 | /*__u32 offset_xi:11; | ||
| 111 | __u32 res5:5; | ||
| 112 | __u32 offset_yi:11; | ||
| 113 | __u32 res6:5; | ||
| 114 | */ | ||
| 115 | __le32 offset_xyi; | ||
| 116 | |||
| 117 | /* Word 5(32-bit) in DDR memory */ | ||
| 118 | /*__u32 offset_xd:11; | ||
| 119 | __u32 res7:5; | ||
| 120 | __u32 offset_yd:11; | ||
| 121 | __u32 res8:5; */ | ||
| 122 | __le32 offset_xyd; | ||
| 123 | |||
| 124 | |||
| 125 | /* Word 6(32-bit) in DDR memory */ | ||
| 126 | __u8 ckmax_r; | ||
| 127 | __u8 ckmax_g; | ||
| 128 | __u8 ckmax_b; | ||
| 129 | __u8 res9; | ||
| 130 | |||
| 131 | /* Word 7(32-bit) in DDR memory */ | ||
| 132 | __u8 ckmin_r; | ||
| 133 | __u8 ckmin_g; | ||
| 134 | __u8 ckmin_b; | ||
| 135 | __u8 res10; | ||
| 136 | /* __u32 res10:8; */ | ||
| 137 | |||
| 138 | /* Word 8(32-bit) in DDR memory */ | ||
| 139 | __le32 next_ad; | ||
| 140 | |||
| 141 | /* Word 9(32-bit) in DDR memory, just for 64-bit aligned */ | ||
| 142 | __u32 paddr; | ||
| 143 | } __attribute__ ((packed)); | ||
| 144 | |||
| 145 | /* DIU register map */ | ||
| 146 | struct diu { | ||
| 147 | __be32 desc[3]; | ||
| 148 | __be32 gamma; | ||
| 149 | __be32 pallete; | ||
| 150 | __be32 cursor; | ||
| 151 | __be32 curs_pos; | ||
| 152 | __be32 diu_mode; | ||
| 153 | __be32 bgnd; | ||
| 154 | __be32 bgnd_wb; | ||
| 155 | __be32 disp_size; | ||
| 156 | __be32 wb_size; | ||
| 157 | __be32 wb_mem_addr; | ||
| 158 | __be32 hsyn_para; | ||
| 159 | __be32 vsyn_para; | ||
| 160 | __be32 syn_pol; | ||
| 161 | __be32 thresholds; | ||
| 162 | __be32 int_status; | ||
| 163 | __be32 int_mask; | ||
| 164 | __be32 colorbar[8]; | ||
| 165 | __be32 filling; | ||
| 166 | __be32 plut; | ||
| 167 | } __attribute__ ((packed)); | ||
| 168 | |||
| 169 | struct diu_hw { | ||
| 170 | struct diu *diu_reg; | ||
| 171 | spinlock_t reg_lock; | ||
| 172 | |||
| 173 | __u32 mode; /* DIU operation mode */ | ||
| 174 | }; | ||
| 175 | |||
| 176 | struct diu_addr { | ||
| 177 | __u8 __iomem *vaddr; /* Virtual address */ | ||
| 178 | dma_addr_t paddr; /* Physical address */ | ||
| 179 | __u32 offset; | ||
| 180 | }; | ||
| 181 | |||
| 182 | struct diu_pool { | ||
| 183 | struct diu_addr ad; | ||
| 184 | struct diu_addr gamma; | ||
| 185 | struct diu_addr pallete; | ||
| 186 | struct diu_addr cursor; | ||
| 187 | }; | ||
| 188 | |||
| 189 | #define FSL_DIU_BASE_OFFSET 0x2C000 /* Offset of DIU */ | ||
| 190 | #define INT_LCDC 64 /* DIU interrupt number */ | ||
| 191 | |||
| 192 | #define FSL_AOI_NUM 6 /* 5 AOIs and one dummy AOI */ | ||
| 193 | /* 1 for plane 0, 2 for plane 1&2 each */ | ||
| 194 | |||
| 195 | /* Minimum X and Y resolutions */ | ||
| 196 | #define MIN_XRES 64 | ||
| 197 | #define MIN_YRES 64 | ||
| 198 | |||
| 199 | /* HW cursor parameters */ | ||
| 200 | #define MAX_CURS 32 | ||
| 201 | |||
| 202 | /* Modes of operation of DIU */ | ||
| 203 | #define MFB_MODE0 0 /* DIU off */ | ||
| 204 | #define MFB_MODE1 1 /* All three planes output to display */ | ||
| 205 | #define MFB_MODE2 2 /* Plane 1 to display, planes 2+3 written back*/ | ||
| 206 | #define MFB_MODE3 3 /* All three planes written back to memory */ | ||
| 207 | #define MFB_MODE4 4 /* Color bar generation */ | ||
| 208 | |||
| 209 | /* INT_STATUS/INT_MASK field descriptions */ | ||
| 210 | #define INT_VSYNC 0x01 /* Vsync interrupt */ | ||
| 211 | #define INT_VSYNC_WB 0x02 /* Vsync interrupt for write back operation */ | ||
| 212 | #define INT_UNDRUN 0x04 /* Under run exception interrupt */ | ||
| 213 | #define INT_PARERR 0x08 /* Display parameters error interrupt */ | ||
| 214 | #define INT_LS_BF_VS 0x10 /* Lines before vsync. interrupt */ | ||
| 215 | |||
| 216 | /* Panels'operation modes */ | ||
| 217 | #define MFB_TYPE_OUTPUT 0 /* Panel output to display */ | ||
| 218 | #define MFB_TYPE_OFF 1 /* Panel off */ | ||
| 219 | #define MFB_TYPE_WB 2 /* Panel written back to memory */ | ||
| 220 | #define MFB_TYPE_TEST 3 /* Panel generate color bar */ | ||
| 221 | |||
| 222 | #endif /* __KERNEL__ */ | ||
| 223 | #endif /* __FSL_DIU_FB_H__ */ | ||
diff --git a/include/linux/fsl_devices.h b/include/linux/fsl_devices.h index 28e33fea5107..4eb56ed75fbc 100644 --- a/include/linux/fsl_devices.h +++ b/include/linux/fsl_devices.h | |||
| @@ -58,17 +58,35 @@ enum fsl_usb2_phy_modes { | |||
| 58 | FSL_USB2_PHY_SERIAL, | 58 | FSL_USB2_PHY_SERIAL, |
| 59 | }; | 59 | }; |
| 60 | 60 | ||
| 61 | struct clk; | ||
| 62 | struct platform_device; | ||
| 63 | |||
| 61 | struct fsl_usb2_platform_data { | 64 | struct fsl_usb2_platform_data { |
| 62 | /* board specific information */ | 65 | /* board specific information */ |
| 63 | enum fsl_usb2_operating_modes operating_mode; | 66 | enum fsl_usb2_operating_modes operating_mode; |
| 64 | enum fsl_usb2_phy_modes phy_mode; | 67 | enum fsl_usb2_phy_modes phy_mode; |
| 65 | unsigned int port_enables; | 68 | unsigned int port_enables; |
| 69 | unsigned int workaround; | ||
| 70 | |||
| 71 | int (*init)(struct platform_device *); | ||
| 72 | void (*exit)(struct platform_device *); | ||
| 73 | void __iomem *regs; /* ioremap'd register base */ | ||
| 74 | struct clk *clk; | ||
| 75 | unsigned big_endian_mmio:1; | ||
| 76 | unsigned big_endian_desc:1; | ||
| 77 | unsigned es:1; /* need USBMODE:ES */ | ||
| 78 | unsigned le_setup_buf:1; | ||
| 79 | unsigned have_sysif_regs:1; | ||
| 80 | unsigned invert_drvvbus:1; | ||
| 81 | unsigned invert_pwr_fault:1; | ||
| 66 | }; | 82 | }; |
| 67 | 83 | ||
| 68 | /* Flags in fsl_usb2_mph_platform_data */ | 84 | /* Flags in fsl_usb2_mph_platform_data */ |
| 69 | #define FSL_USB2_PORT0_ENABLED 0x00000001 | 85 | #define FSL_USB2_PORT0_ENABLED 0x00000001 |
| 70 | #define FSL_USB2_PORT1_ENABLED 0x00000002 | 86 | #define FSL_USB2_PORT1_ENABLED 0x00000002 |
| 71 | 87 | ||
| 88 | #define FLS_USB2_WORKAROUND_ENGCM09152 (1 << 0) | ||
| 89 | |||
| 72 | struct spi_device; | 90 | struct spi_device; |
| 73 | 91 | ||
| 74 | struct fsl_spi_platform_data { | 92 | struct fsl_spi_platform_data { |
diff --git a/include/linux/fsnotify.h b/include/linux/fsnotify.h index 01755909ce81..59d0df43ff9d 100644 --- a/include/linux/fsnotify.h +++ b/include/linux/fsnotify.h | |||
| @@ -11,8 +11,6 @@ | |||
| 11 | * (C) Copyright 2005 Robert Love | 11 | * (C) Copyright 2005 Robert Love |
| 12 | */ | 12 | */ |
| 13 | 13 | ||
| 14 | #include <linux/dnotify.h> | ||
| 15 | #include <linux/inotify.h> | ||
| 16 | #include <linux/fsnotify_backend.h> | 14 | #include <linux/fsnotify_backend.h> |
| 17 | #include <linux/audit.h> | 15 | #include <linux/audit.h> |
| 18 | #include <linux/slab.h> | 16 | #include <linux/slab.h> |
| @@ -21,35 +19,53 @@ | |||
| 21 | * fsnotify_d_instantiate - instantiate a dentry for inode | 19 | * fsnotify_d_instantiate - instantiate a dentry for inode |
| 22 | * Called with dcache_lock held. | 20 | * Called with dcache_lock held. |
| 23 | */ | 21 | */ |
| 24 | static inline void fsnotify_d_instantiate(struct dentry *entry, | 22 | static inline void fsnotify_d_instantiate(struct dentry *dentry, |
| 25 | struct inode *inode) | 23 | struct inode *inode) |
| 26 | { | 24 | { |
| 27 | __fsnotify_d_instantiate(entry, inode); | 25 | __fsnotify_d_instantiate(dentry, inode); |
| 28 | |||
| 29 | inotify_d_instantiate(entry, inode); | ||
| 30 | } | 26 | } |
| 31 | 27 | ||
| 32 | /* Notify this dentry's parent about a child's events. */ | 28 | /* Notify this dentry's parent about a child's events. */ |
| 33 | static inline void fsnotify_parent(struct dentry *dentry, __u32 mask) | 29 | static inline void fsnotify_parent(struct path *path, struct dentry *dentry, __u32 mask) |
| 34 | { | 30 | { |
| 35 | __fsnotify_parent(dentry, mask); | 31 | if (!dentry) |
| 32 | dentry = path->dentry; | ||
| 33 | |||
| 34 | __fsnotify_parent(path, dentry, mask); | ||
| 35 | } | ||
| 36 | 36 | ||
| 37 | inotify_dentry_parent_queue_event(dentry, mask, 0, dentry->d_name.name); | 37 | /* simple call site for access decisions */ |
| 38 | static inline int fsnotify_perm(struct file *file, int mask) | ||
| 39 | { | ||
| 40 | struct path *path = &file->f_path; | ||
| 41 | struct inode *inode = path->dentry->d_inode; | ||
| 42 | __u32 fsnotify_mask = 0; | ||
| 43 | |||
| 44 | if (file->f_mode & FMODE_NONOTIFY) | ||
| 45 | return 0; | ||
| 46 | if (!(mask & (MAY_READ | MAY_OPEN))) | ||
| 47 | return 0; | ||
| 48 | if (mask & MAY_OPEN) | ||
| 49 | fsnotify_mask = FS_OPEN_PERM; | ||
| 50 | else if (mask & MAY_READ) | ||
| 51 | fsnotify_mask = FS_ACCESS_PERM; | ||
| 52 | else | ||
| 53 | BUG(); | ||
| 54 | |||
| 55 | return fsnotify(inode, fsnotify_mask, path, FSNOTIFY_EVENT_PATH, NULL, 0); | ||
| 38 | } | 56 | } |
| 39 | 57 | ||
| 40 | /* | 58 | /* |
| 41 | * fsnotify_d_move - entry has been moved | 59 | * fsnotify_d_move - dentry has been moved |
| 42 | * Called with dcache_lock and entry->d_lock held. | 60 | * Called with dcache_lock and dentry->d_lock held. |
| 43 | */ | 61 | */ |
| 44 | static inline void fsnotify_d_move(struct dentry *entry) | 62 | static inline void fsnotify_d_move(struct dentry *dentry) |
| 45 | { | 63 | { |
| 46 | /* | 64 | /* |
| 47 | * On move we need to update entry->d_flags to indicate if the new parent | 65 | * On move we need to update dentry->d_flags to indicate if the new parent |
| 48 | * cares about events from this entry. | 66 | * cares about events from this dentry. |
| 49 | */ | 67 | */ |
| 50 | __fsnotify_update_dcache_flags(entry); | 68 | __fsnotify_update_dcache_flags(dentry); |
| 51 | |||
| 52 | inotify_d_move(entry); | ||
| 53 | } | 69 | } |
| 54 | 70 | ||
| 55 | /* | 71 | /* |
| @@ -57,8 +73,6 @@ static inline void fsnotify_d_move(struct dentry *entry) | |||
| 57 | */ | 73 | */ |
| 58 | static inline void fsnotify_link_count(struct inode *inode) | 74 | static inline void fsnotify_link_count(struct inode *inode) |
| 59 | { | 75 | { |
| 60 | inotify_inode_queue_event(inode, IN_ATTRIB, 0, NULL, NULL); | ||
| 61 | |||
| 62 | fsnotify(inode, FS_ATTRIB, inode, FSNOTIFY_EVENT_INODE, NULL, 0); | 76 | fsnotify(inode, FS_ATTRIB, inode, FSNOTIFY_EVENT_INODE, NULL, 0); |
| 63 | } | 77 | } |
| 64 | 78 | ||
| @@ -66,45 +80,31 @@ static inline void fsnotify_link_count(struct inode *inode) | |||
| 66 | * fsnotify_move - file old_name at old_dir was moved to new_name at new_dir | 80 | * fsnotify_move - file old_name at old_dir was moved to new_name at new_dir |
| 67 | */ | 81 | */ |
| 68 | static inline void fsnotify_move(struct inode *old_dir, struct inode *new_dir, | 82 | static inline void fsnotify_move(struct inode *old_dir, struct inode *new_dir, |
| 69 | const char *old_name, | 83 | const unsigned char *old_name, |
| 70 | int isdir, struct inode *target, struct dentry *moved) | 84 | int isdir, struct inode *target, struct dentry *moved) |
| 71 | { | 85 | { |
| 72 | struct inode *source = moved->d_inode; | 86 | struct inode *source = moved->d_inode; |
| 73 | u32 in_cookie = inotify_get_cookie(); | ||
| 74 | u32 fs_cookie = fsnotify_get_cookie(); | 87 | u32 fs_cookie = fsnotify_get_cookie(); |
| 75 | __u32 old_dir_mask = (FS_EVENT_ON_CHILD | FS_MOVED_FROM); | 88 | __u32 old_dir_mask = (FS_EVENT_ON_CHILD | FS_MOVED_FROM); |
| 76 | __u32 new_dir_mask = (FS_EVENT_ON_CHILD | FS_MOVED_TO); | 89 | __u32 new_dir_mask = (FS_EVENT_ON_CHILD | FS_MOVED_TO); |
| 77 | const char *new_name = moved->d_name.name; | 90 | const unsigned char *new_name = moved->d_name.name; |
| 78 | 91 | ||
| 79 | if (old_dir == new_dir) | 92 | if (old_dir == new_dir) |
| 80 | old_dir_mask |= FS_DN_RENAME; | 93 | old_dir_mask |= FS_DN_RENAME; |
| 81 | 94 | ||
| 82 | if (isdir) { | 95 | if (isdir) { |
| 83 | isdir = IN_ISDIR; | ||
| 84 | old_dir_mask |= FS_IN_ISDIR; | 96 | old_dir_mask |= FS_IN_ISDIR; |
| 85 | new_dir_mask |= FS_IN_ISDIR; | 97 | new_dir_mask |= FS_IN_ISDIR; |
| 86 | } | 98 | } |
| 87 | 99 | ||
| 88 | inotify_inode_queue_event(old_dir, IN_MOVED_FROM|isdir, in_cookie, old_name, | ||
| 89 | source); | ||
| 90 | inotify_inode_queue_event(new_dir, IN_MOVED_TO|isdir, in_cookie, new_name, | ||
| 91 | source); | ||
| 92 | |||
| 93 | fsnotify(old_dir, old_dir_mask, old_dir, FSNOTIFY_EVENT_INODE, old_name, fs_cookie); | 100 | fsnotify(old_dir, old_dir_mask, old_dir, FSNOTIFY_EVENT_INODE, old_name, fs_cookie); |
| 94 | fsnotify(new_dir, new_dir_mask, new_dir, FSNOTIFY_EVENT_INODE, new_name, fs_cookie); | 101 | fsnotify(new_dir, new_dir_mask, new_dir, FSNOTIFY_EVENT_INODE, new_name, fs_cookie); |
| 95 | 102 | ||
| 96 | if (target) { | 103 | if (target) |
| 97 | inotify_inode_queue_event(target, IN_DELETE_SELF, 0, NULL, NULL); | ||
| 98 | inotify_inode_is_dead(target); | ||
| 99 | |||
| 100 | /* this is really a link_count change not a removal */ | ||
| 101 | fsnotify_link_count(target); | 104 | fsnotify_link_count(target); |
| 102 | } | ||
| 103 | 105 | ||
| 104 | if (source) { | 106 | if (source) |
| 105 | inotify_inode_queue_event(source, IN_MOVE_SELF, 0, NULL, NULL); | ||
| 106 | fsnotify(source, FS_MOVE_SELF, moved->d_inode, FSNOTIFY_EVENT_INODE, NULL, 0); | 107 | fsnotify(source, FS_MOVE_SELF, moved->d_inode, FSNOTIFY_EVENT_INODE, NULL, 0); |
| 107 | } | ||
| 108 | audit_inode_child(moved, new_dir); | 108 | audit_inode_child(moved, new_dir); |
| 109 | } | 109 | } |
| 110 | 110 | ||
| @@ -117,6 +117,14 @@ static inline void fsnotify_inode_delete(struct inode *inode) | |||
| 117 | } | 117 | } |
| 118 | 118 | ||
| 119 | /* | 119 | /* |
| 120 | * fsnotify_vfsmount_delete - a vfsmount is being destroyed, clean up is needed | ||
| 121 | */ | ||
| 122 | static inline void fsnotify_vfsmount_delete(struct vfsmount *mnt) | ||
| 123 | { | ||
| 124 | __fsnotify_vfsmount_delete(mnt); | ||
| 125 | } | ||
| 126 | |||
| 127 | /* | ||
| 120 | * fsnotify_nameremove - a filename was removed from a directory | 128 | * fsnotify_nameremove - a filename was removed from a directory |
| 121 | */ | 129 | */ |
| 122 | static inline void fsnotify_nameremove(struct dentry *dentry, int isdir) | 130 | static inline void fsnotify_nameremove(struct dentry *dentry, int isdir) |
| @@ -126,7 +134,7 @@ static inline void fsnotify_nameremove(struct dentry *dentry, int isdir) | |||
| 126 | if (isdir) | 134 | if (isdir) |
| 127 | mask |= FS_IN_ISDIR; | 135 | mask |= FS_IN_ISDIR; |
| 128 | 136 | ||
| 129 | fsnotify_parent(dentry, mask); | 137 | fsnotify_parent(NULL, dentry, mask); |
| 130 | } | 138 | } |
| 131 | 139 | ||
| 132 | /* | 140 | /* |
| @@ -134,9 +142,6 @@ static inline void fsnotify_nameremove(struct dentry *dentry, int isdir) | |||
| 134 | */ | 142 | */ |
| 135 | static inline void fsnotify_inoderemove(struct inode *inode) | 143 | static inline void fsnotify_inoderemove(struct inode *inode) |
| 136 | { | 144 | { |
| 137 | inotify_inode_queue_event(inode, IN_DELETE_SELF, 0, NULL, NULL); | ||
| 138 | inotify_inode_is_dead(inode); | ||
| 139 | |||
| 140 | fsnotify(inode, FS_DELETE_SELF, inode, FSNOTIFY_EVENT_INODE, NULL, 0); | 145 | fsnotify(inode, FS_DELETE_SELF, inode, FSNOTIFY_EVENT_INODE, NULL, 0); |
| 141 | __fsnotify_inode_delete(inode); | 146 | __fsnotify_inode_delete(inode); |
| 142 | } | 147 | } |
| @@ -146,8 +151,6 @@ static inline void fsnotify_inoderemove(struct inode *inode) | |||
| 146 | */ | 151 | */ |
| 147 | static inline void fsnotify_create(struct inode *inode, struct dentry *dentry) | 152 | static inline void fsnotify_create(struct inode *inode, struct dentry *dentry) |
| 148 | { | 153 | { |
| 149 | inotify_inode_queue_event(inode, IN_CREATE, 0, dentry->d_name.name, | ||
| 150 | dentry->d_inode); | ||
| 151 | audit_inode_child(dentry, inode); | 154 | audit_inode_child(dentry, inode); |
| 152 | 155 | ||
| 153 | fsnotify(inode, FS_CREATE, dentry->d_inode, FSNOTIFY_EVENT_INODE, dentry->d_name.name, 0); | 156 | fsnotify(inode, FS_CREATE, dentry->d_inode, FSNOTIFY_EVENT_INODE, dentry->d_name.name, 0); |
| @@ -160,8 +163,6 @@ static inline void fsnotify_create(struct inode *inode, struct dentry *dentry) | |||
| 160 | */ | 163 | */ |
| 161 | static inline void fsnotify_link(struct inode *dir, struct inode *inode, struct dentry *new_dentry) | 164 | static inline void fsnotify_link(struct inode *dir, struct inode *inode, struct dentry *new_dentry) |
| 162 | { | 165 | { |
| 163 | inotify_inode_queue_event(dir, IN_CREATE, 0, new_dentry->d_name.name, | ||
| 164 | inode); | ||
| 165 | fsnotify_link_count(inode); | 166 | fsnotify_link_count(inode); |
| 166 | audit_inode_child(new_dentry, dir); | 167 | audit_inode_child(new_dentry, dir); |
| 167 | 168 | ||
| @@ -176,7 +177,6 @@ static inline void fsnotify_mkdir(struct inode *inode, struct dentry *dentry) | |||
| 176 | __u32 mask = (FS_CREATE | FS_IN_ISDIR); | 177 | __u32 mask = (FS_CREATE | FS_IN_ISDIR); |
| 177 | struct inode *d_inode = dentry->d_inode; | 178 | struct inode *d_inode = dentry->d_inode; |
| 178 | 179 | ||
| 179 | inotify_inode_queue_event(inode, mask, 0, dentry->d_name.name, d_inode); | ||
| 180 | audit_inode_child(dentry, inode); | 180 | audit_inode_child(dentry, inode); |
| 181 | 181 | ||
| 182 | fsnotify(inode, mask, d_inode, FSNOTIFY_EVENT_INODE, dentry->d_name.name, 0); | 182 | fsnotify(inode, mask, d_inode, FSNOTIFY_EVENT_INODE, dentry->d_name.name, 0); |
| @@ -185,52 +185,55 @@ static inline void fsnotify_mkdir(struct inode *inode, struct dentry *dentry) | |||
| 185 | /* | 185 | /* |
| 186 | * fsnotify_access - file was read | 186 | * fsnotify_access - file was read |
| 187 | */ | 187 | */ |
| 188 | static inline void fsnotify_access(struct dentry *dentry) | 188 | static inline void fsnotify_access(struct file *file) |
| 189 | { | 189 | { |
| 190 | struct inode *inode = dentry->d_inode; | 190 | struct path *path = &file->f_path; |
| 191 | struct inode *inode = path->dentry->d_inode; | ||
| 191 | __u32 mask = FS_ACCESS; | 192 | __u32 mask = FS_ACCESS; |
| 192 | 193 | ||
| 193 | if (S_ISDIR(inode->i_mode)) | 194 | if (S_ISDIR(inode->i_mode)) |
| 194 | mask |= FS_IN_ISDIR; | 195 | mask |= FS_IN_ISDIR; |
| 195 | 196 | ||
| 196 | inotify_inode_queue_event(inode, mask, 0, NULL, NULL); | 197 | if (!(file->f_mode & FMODE_NONOTIFY)) { |
| 197 | 198 | fsnotify_parent(path, NULL, mask); | |
| 198 | fsnotify_parent(dentry, mask); | 199 | fsnotify(inode, mask, path, FSNOTIFY_EVENT_PATH, NULL, 0); |
| 199 | fsnotify(inode, mask, inode, FSNOTIFY_EVENT_INODE, NULL, 0); | 200 | } |
| 200 | } | 201 | } |
| 201 | 202 | ||
| 202 | /* | 203 | /* |
| 203 | * fsnotify_modify - file was modified | 204 | * fsnotify_modify - file was modified |
| 204 | */ | 205 | */ |
| 205 | static inline void fsnotify_modify(struct dentry *dentry) | 206 | static inline void fsnotify_modify(struct file *file) |
| 206 | { | 207 | { |
| 207 | struct inode *inode = dentry->d_inode; | 208 | struct path *path = &file->f_path; |
| 209 | struct inode *inode = path->dentry->d_inode; | ||
| 208 | __u32 mask = FS_MODIFY; | 210 | __u32 mask = FS_MODIFY; |
| 209 | 211 | ||
| 210 | if (S_ISDIR(inode->i_mode)) | 212 | if (S_ISDIR(inode->i_mode)) |
| 211 | mask |= FS_IN_ISDIR; | 213 | mask |= FS_IN_ISDIR; |
| 212 | 214 | ||
| 213 | inotify_inode_queue_event(inode, mask, 0, NULL, NULL); | 215 | if (!(file->f_mode & FMODE_NONOTIFY)) { |
| 214 | 216 | fsnotify_parent(path, NULL, mask); | |
| 215 | fsnotify_parent(dentry, mask); | 217 | fsnotify(inode, mask, path, FSNOTIFY_EVENT_PATH, NULL, 0); |
| 216 | fsnotify(inode, mask, inode, FSNOTIFY_EVENT_INODE, NULL, 0); | 218 | } |
| 217 | } | 219 | } |
| 218 | 220 | ||
| 219 | /* | 221 | /* |
| 220 | * fsnotify_open - file was opened | 222 | * fsnotify_open - file was opened |
| 221 | */ | 223 | */ |
| 222 | static inline void fsnotify_open(struct dentry *dentry) | 224 | static inline void fsnotify_open(struct file *file) |
| 223 | { | 225 | { |
| 224 | struct inode *inode = dentry->d_inode; | 226 | struct path *path = &file->f_path; |
| 227 | struct inode *inode = path->dentry->d_inode; | ||
| 225 | __u32 mask = FS_OPEN; | 228 | __u32 mask = FS_OPEN; |
| 226 | 229 | ||
| 227 | if (S_ISDIR(inode->i_mode)) | 230 | if (S_ISDIR(inode->i_mode)) |
| 228 | mask |= FS_IN_ISDIR; | 231 | mask |= FS_IN_ISDIR; |
| 229 | 232 | ||
| 230 | inotify_inode_queue_event(inode, mask, 0, NULL, NULL); | 233 | if (!(file->f_mode & FMODE_NONOTIFY)) { |
| 231 | 234 | fsnotify_parent(path, NULL, mask); | |
| 232 | fsnotify_parent(dentry, mask); | 235 | fsnotify(inode, mask, path, FSNOTIFY_EVENT_PATH, NULL, 0); |
| 233 | fsnotify(inode, mask, inode, FSNOTIFY_EVENT_INODE, NULL, 0); | 236 | } |
| 234 | } | 237 | } |
| 235 | 238 | ||
| 236 | /* | 239 | /* |
| @@ -238,18 +241,18 @@ static inline void fsnotify_open(struct dentry *dentry) | |||
| 238 | */ | 241 | */ |
| 239 | static inline void fsnotify_close(struct file *file) | 242 | static inline void fsnotify_close(struct file *file) |
| 240 | { | 243 | { |
| 241 | struct dentry *dentry = file->f_path.dentry; | 244 | struct path *path = &file->f_path; |
| 242 | struct inode *inode = dentry->d_inode; | 245 | struct inode *inode = file->f_path.dentry->d_inode; |
| 243 | fmode_t mode = file->f_mode; | 246 | fmode_t mode = file->f_mode; |
| 244 | __u32 mask = (mode & FMODE_WRITE) ? FS_CLOSE_WRITE : FS_CLOSE_NOWRITE; | 247 | __u32 mask = (mode & FMODE_WRITE) ? FS_CLOSE_WRITE : FS_CLOSE_NOWRITE; |
| 245 | 248 | ||
| 246 | if (S_ISDIR(inode->i_mode)) | 249 | if (S_ISDIR(inode->i_mode)) |
| 247 | mask |= FS_IN_ISDIR; | 250 | mask |= FS_IN_ISDIR; |
| 248 | 251 | ||
| 249 | inotify_inode_queue_event(inode, mask, 0, NULL, NULL); | 252 | if (!(file->f_mode & FMODE_NONOTIFY)) { |
| 250 | 253 | fsnotify_parent(path, NULL, mask); | |
| 251 | fsnotify_parent(dentry, mask); | 254 | fsnotify(inode, mask, path, FSNOTIFY_EVENT_PATH, NULL, 0); |
| 252 | fsnotify(inode, mask, file, FSNOTIFY_EVENT_FILE, NULL, 0); | 255 | } |
| 253 | } | 256 | } |
| 254 | 257 | ||
| 255 | /* | 258 | /* |
| @@ -263,9 +266,7 @@ static inline void fsnotify_xattr(struct dentry *dentry) | |||
| 263 | if (S_ISDIR(inode->i_mode)) | 266 | if (S_ISDIR(inode->i_mode)) |
| 264 | mask |= FS_IN_ISDIR; | 267 | mask |= FS_IN_ISDIR; |
| 265 | 268 | ||
| 266 | inotify_inode_queue_event(inode, mask, 0, NULL, NULL); | 269 | fsnotify_parent(NULL, dentry, mask); |
| 267 | |||
| 268 | fsnotify_parent(dentry, mask); | ||
| 269 | fsnotify(inode, mask, inode, FSNOTIFY_EVENT_INODE, NULL, 0); | 270 | fsnotify(inode, mask, inode, FSNOTIFY_EVENT_INODE, NULL, 0); |
| 270 | } | 271 | } |
| 271 | 272 | ||
| @@ -299,19 +300,18 @@ static inline void fsnotify_change(struct dentry *dentry, unsigned int ia_valid) | |||
| 299 | if (mask) { | 300 | if (mask) { |
| 300 | if (S_ISDIR(inode->i_mode)) | 301 | if (S_ISDIR(inode->i_mode)) |
| 301 | mask |= FS_IN_ISDIR; | 302 | mask |= FS_IN_ISDIR; |
| 302 | inotify_inode_queue_event(inode, mask, 0, NULL, NULL); | ||
| 303 | 303 | ||
| 304 | fsnotify_parent(dentry, mask); | 304 | fsnotify_parent(NULL, dentry, mask); |
| 305 | fsnotify(inode, mask, inode, FSNOTIFY_EVENT_INODE, NULL, 0); | 305 | fsnotify(inode, mask, inode, FSNOTIFY_EVENT_INODE, NULL, 0); |
| 306 | } | 306 | } |
| 307 | } | 307 | } |
| 308 | 308 | ||
| 309 | #if defined(CONFIG_INOTIFY) || defined(CONFIG_FSNOTIFY) /* notify helpers */ | 309 | #if defined(CONFIG_FSNOTIFY) /* notify helpers */ |
| 310 | 310 | ||
| 311 | /* | 311 | /* |
| 312 | * fsnotify_oldname_init - save off the old filename before we change it | 312 | * fsnotify_oldname_init - save off the old filename before we change it |
| 313 | */ | 313 | */ |
| 314 | static inline const char *fsnotify_oldname_init(const char *name) | 314 | static inline const unsigned char *fsnotify_oldname_init(const unsigned char *name) |
| 315 | { | 315 | { |
| 316 | return kstrdup(name, GFP_KERNEL); | 316 | return kstrdup(name, GFP_KERNEL); |
| 317 | } | 317 | } |
| @@ -319,22 +319,22 @@ static inline const char *fsnotify_oldname_init(const char *name) | |||
| 319 | /* | 319 | /* |
| 320 | * fsnotify_oldname_free - free the name we got from fsnotify_oldname_init | 320 | * fsnotify_oldname_free - free the name we got from fsnotify_oldname_init |
| 321 | */ | 321 | */ |
| 322 | static inline void fsnotify_oldname_free(const char *old_name) | 322 | static inline void fsnotify_oldname_free(const unsigned char *old_name) |
| 323 | { | 323 | { |
| 324 | kfree(old_name); | 324 | kfree(old_name); |
| 325 | } | 325 | } |
| 326 | 326 | ||
| 327 | #else /* CONFIG_INOTIFY || CONFIG_FSNOTIFY */ | 327 | #else /* CONFIG_FSNOTIFY */ |
| 328 | 328 | ||
| 329 | static inline const char *fsnotify_oldname_init(const char *name) | 329 | static inline const char *fsnotify_oldname_init(const unsigned char *name) |
| 330 | { | 330 | { |
| 331 | return NULL; | 331 | return NULL; |
| 332 | } | 332 | } |
| 333 | 333 | ||
| 334 | static inline void fsnotify_oldname_free(const char *old_name) | 334 | static inline void fsnotify_oldname_free(const unsigned char *old_name) |
| 335 | { | 335 | { |
| 336 | } | 336 | } |
| 337 | 337 | ||
| 338 | #endif /* ! CONFIG_INOTIFY */ | 338 | #endif /* CONFIG_FSNOTIFY */ |
| 339 | 339 | ||
| 340 | #endif /* _LINUX_FS_NOTIFY_H */ | 340 | #endif /* _LINUX_FS_NOTIFY_H */ |
diff --git a/include/linux/fsnotify_backend.h b/include/linux/fsnotify_backend.h index 4d6f47b51189..e40190d16878 100644 --- a/include/linux/fsnotify_backend.h +++ b/include/linux/fsnotify_backend.h | |||
| @@ -41,6 +41,10 @@ | |||
| 41 | #define FS_Q_OVERFLOW 0x00004000 /* Event queued overflowed */ | 41 | #define FS_Q_OVERFLOW 0x00004000 /* Event queued overflowed */ |
| 42 | #define FS_IN_IGNORED 0x00008000 /* last inotify event here */ | 42 | #define FS_IN_IGNORED 0x00008000 /* last inotify event here */ |
| 43 | 43 | ||
| 44 | #define FS_OPEN_PERM 0x00010000 /* open event in an permission hook */ | ||
| 45 | #define FS_ACCESS_PERM 0x00020000 /* access event in a permissions hook */ | ||
| 46 | |||
| 47 | #define FS_EXCL_UNLINK 0x04000000 /* do not send events if object is unlinked */ | ||
| 44 | #define FS_IN_ISDIR 0x40000000 /* event occurred against dir */ | 48 | #define FS_IN_ISDIR 0x40000000 /* event occurred against dir */ |
| 45 | #define FS_IN_ONESHOT 0x80000000 /* only send event once */ | 49 | #define FS_IN_ONESHOT 0x80000000 /* only send event once */ |
| 46 | 50 | ||
| @@ -58,13 +62,20 @@ | |||
| 58 | FS_MOVED_FROM | FS_MOVED_TO | FS_CREATE |\ | 62 | FS_MOVED_FROM | FS_MOVED_TO | FS_CREATE |\ |
| 59 | FS_DELETE) | 63 | FS_DELETE) |
| 60 | 64 | ||
| 61 | /* listeners that hard code group numbers near the top */ | 65 | #define FS_MOVE (FS_MOVED_FROM | FS_MOVED_TO) |
| 62 | #define DNOTIFY_GROUP_NUM UINT_MAX | 66 | |
| 63 | #define INOTIFY_GROUP_NUM (DNOTIFY_GROUP_NUM-1) | 67 | #define ALL_FSNOTIFY_EVENTS (FS_ACCESS | FS_MODIFY | FS_ATTRIB | \ |
| 68 | FS_CLOSE_WRITE | FS_CLOSE_NOWRITE | FS_OPEN | \ | ||
| 69 | FS_MOVED_FROM | FS_MOVED_TO | FS_CREATE | \ | ||
| 70 | FS_DELETE | FS_DELETE_SELF | FS_MOVE_SELF | \ | ||
| 71 | FS_UNMOUNT | FS_Q_OVERFLOW | FS_IN_IGNORED | \ | ||
| 72 | FS_OPEN_PERM | FS_ACCESS_PERM | FS_EXCL_UNLINK | \ | ||
| 73 | FS_IN_ISDIR | FS_IN_ONESHOT | FS_DN_RENAME | \ | ||
| 74 | FS_DN_MULTISHOT | FS_EVENT_ON_CHILD) | ||
| 64 | 75 | ||
| 65 | struct fsnotify_group; | 76 | struct fsnotify_group; |
| 66 | struct fsnotify_event; | 77 | struct fsnotify_event; |
| 67 | struct fsnotify_mark_entry; | 78 | struct fsnotify_mark; |
| 68 | struct fsnotify_event_private_data; | 79 | struct fsnotify_event_private_data; |
| 69 | 80 | ||
| 70 | /* | 81 | /* |
| @@ -80,10 +91,16 @@ struct fsnotify_event_private_data; | |||
| 80 | * valid group and inode to use to clean up. | 91 | * valid group and inode to use to clean up. |
| 81 | */ | 92 | */ |
| 82 | struct fsnotify_ops { | 93 | struct fsnotify_ops { |
| 83 | bool (*should_send_event)(struct fsnotify_group *group, struct inode *inode, __u32 mask); | 94 | bool (*should_send_event)(struct fsnotify_group *group, struct inode *inode, |
| 84 | int (*handle_event)(struct fsnotify_group *group, struct fsnotify_event *event); | 95 | struct fsnotify_mark *inode_mark, |
| 96 | struct fsnotify_mark *vfsmount_mark, | ||
| 97 | __u32 mask, void *data, int data_type); | ||
| 98 | int (*handle_event)(struct fsnotify_group *group, | ||
| 99 | struct fsnotify_mark *inode_mark, | ||
| 100 | struct fsnotify_mark *vfsmount_mark, | ||
| 101 | struct fsnotify_event *event); | ||
| 85 | void (*free_group_priv)(struct fsnotify_group *group); | 102 | void (*free_group_priv)(struct fsnotify_group *group); |
| 86 | void (*freeing_mark)(struct fsnotify_mark_entry *entry, struct fsnotify_group *group); | 103 | void (*freeing_mark)(struct fsnotify_mark *mark, struct fsnotify_group *group); |
| 87 | void (*free_event_priv)(struct fsnotify_event_private_data *priv); | 104 | void (*free_event_priv)(struct fsnotify_event_private_data *priv); |
| 88 | }; | 105 | }; |
| 89 | 106 | ||
| @@ -95,22 +112,6 @@ struct fsnotify_ops { | |||
| 95 | */ | 112 | */ |
| 96 | struct fsnotify_group { | 113 | struct fsnotify_group { |
| 97 | /* | 114 | /* |
| 98 | * global list of all groups receiving events from fsnotify. | ||
| 99 | * anchored by fsnotify_groups and protected by either fsnotify_grp_mutex | ||
| 100 | * or fsnotify_grp_srcu depending on write vs read. | ||
| 101 | */ | ||
| 102 | struct list_head group_list; | ||
| 103 | |||
| 104 | /* | ||
| 105 | * Defines all of the event types in which this group is interested. | ||
| 106 | * This mask is a bitwise OR of the FS_* events from above. Each time | ||
| 107 | * this mask changes for a group (if it changes) the correct functions | ||
| 108 | * must be called to update the global structures which indicate global | ||
| 109 | * interest in event types. | ||
| 110 | */ | ||
| 111 | __u32 mask; | ||
| 112 | |||
| 113 | /* | ||
| 114 | * How the refcnt is used is up to each group. When the refcnt hits 0 | 115 | * How the refcnt is used is up to each group. When the refcnt hits 0 |
| 115 | * fsnotify will clean up all of the resources associated with this group. | 116 | * fsnotify will clean up all of the resources associated with this group. |
| 116 | * As an example, the dnotify group will always have a refcnt=1 and that | 117 | * As an example, the dnotify group will always have a refcnt=1 and that |
| @@ -119,7 +120,6 @@ struct fsnotify_group { | |||
| 119 | * closed. | 120 | * closed. |
| 120 | */ | 121 | */ |
| 121 | atomic_t refcnt; /* things with interest in this group */ | 122 | atomic_t refcnt; /* things with interest in this group */ |
| 122 | unsigned int group_num; /* simply prevents accidental group collision */ | ||
| 123 | 123 | ||
| 124 | const struct fsnotify_ops *ops; /* how this group handles things */ | 124 | const struct fsnotify_ops *ops; /* how this group handles things */ |
| 125 | 125 | ||
| @@ -130,15 +130,12 @@ struct fsnotify_group { | |||
| 130 | unsigned int q_len; /* events on the queue */ | 130 | unsigned int q_len; /* events on the queue */ |
| 131 | unsigned int max_events; /* maximum events allowed on the list */ | 131 | unsigned int max_events; /* maximum events allowed on the list */ |
| 132 | 132 | ||
| 133 | /* stores all fastapth entries assoc with this group so they can be cleaned on unregister */ | 133 | /* stores all fastpath marks assoc with this group so they can be cleaned on unregister */ |
| 134 | spinlock_t mark_lock; /* protect mark_entries list */ | 134 | spinlock_t mark_lock; /* protect marks_list */ |
| 135 | atomic_t num_marks; /* 1 for each mark entry and 1 for not being | 135 | atomic_t num_marks; /* 1 for each mark and 1 for not being |
| 136 | * past the point of no return when freeing | 136 | * past the point of no return when freeing |
| 137 | * a group */ | 137 | * a group */ |
| 138 | struct list_head mark_entries; /* all inode mark entries for this group */ | 138 | struct list_head marks_list; /* all inode marks for this group */ |
| 139 | |||
| 140 | /* prevents double list_del of group_list. protected by global fsnotify_grp_mutex */ | ||
| 141 | bool on_group_list; | ||
| 142 | 139 | ||
| 143 | /* groups can define private fields here or use the void *private */ | 140 | /* groups can define private fields here or use the void *private */ |
| 144 | union { | 141 | union { |
| @@ -152,6 +149,18 @@ struct fsnotify_group { | |||
| 152 | struct user_struct *user; | 149 | struct user_struct *user; |
| 153 | } inotify_data; | 150 | } inotify_data; |
| 154 | #endif | 151 | #endif |
| 152 | #ifdef CONFIG_FANOTIFY | ||
| 153 | struct fanotify_group_private_data { | ||
| 154 | #ifdef CONFIG_FANOTIFY_ACCESS_PERMISSIONS | ||
| 155 | /* allows a group to block waiting for a userspace response */ | ||
| 156 | struct mutex access_mutex; | ||
| 157 | struct list_head access_list; | ||
| 158 | wait_queue_head_t access_waitq; | ||
| 159 | bool bypass_perm; /* protected by access_mutex */ | ||
| 160 | #endif /* CONFIG_FANOTIFY_ACCESS_PERMISSIONS */ | ||
| 161 | int f_flags; | ||
| 162 | } fanotify_data; | ||
| 163 | #endif /* CONFIG_FANOTIFY */ | ||
| 155 | }; | 164 | }; |
| 156 | }; | 165 | }; |
| 157 | 166 | ||
| @@ -210,20 +219,42 @@ struct fsnotify_event { | |||
| 210 | #define FSNOTIFY_EVENT_NONE 0 | 219 | #define FSNOTIFY_EVENT_NONE 0 |
| 211 | #define FSNOTIFY_EVENT_PATH 1 | 220 | #define FSNOTIFY_EVENT_PATH 1 |
| 212 | #define FSNOTIFY_EVENT_INODE 2 | 221 | #define FSNOTIFY_EVENT_INODE 2 |
| 213 | #define FSNOTIFY_EVENT_FILE 3 | ||
| 214 | int data_type; /* which of the above union we have */ | 222 | int data_type; /* which of the above union we have */ |
| 215 | atomic_t refcnt; /* how many groups still are using/need to send this event */ | 223 | atomic_t refcnt; /* how many groups still are using/need to send this event */ |
| 216 | __u32 mask; /* the type of access, bitwise OR for FS_* event types */ | 224 | __u32 mask; /* the type of access, bitwise OR for FS_* event types */ |
| 217 | 225 | ||
| 218 | u32 sync_cookie; /* used to corrolate events, namely inotify mv events */ | 226 | u32 sync_cookie; /* used to corrolate events, namely inotify mv events */ |
| 219 | char *file_name; | 227 | const unsigned char *file_name; |
| 220 | size_t name_len; | 228 | size_t name_len; |
| 229 | struct pid *tgid; | ||
| 230 | |||
| 231 | #ifdef CONFIG_FANOTIFY_ACCESS_PERMISSIONS | ||
| 232 | __u32 response; /* userspace answer to question */ | ||
| 233 | #endif /* CONFIG_FANOTIFY_ACCESS_PERMISSIONS */ | ||
| 221 | 234 | ||
| 222 | struct list_head private_data_list; /* groups can store private data here */ | 235 | struct list_head private_data_list; /* groups can store private data here */ |
| 223 | }; | 236 | }; |
| 224 | 237 | ||
| 225 | /* | 238 | /* |
| 226 | * a mark is simply an entry attached to an in core inode which allows an | 239 | * Inode specific fields in an fsnotify_mark |
| 240 | */ | ||
| 241 | struct fsnotify_inode_mark { | ||
| 242 | struct inode *inode; /* inode this mark is associated with */ | ||
| 243 | struct hlist_node i_list; /* list of marks by inode->i_fsnotify_marks */ | ||
| 244 | struct list_head free_i_list; /* tmp list used when freeing this mark */ | ||
| 245 | }; | ||
| 246 | |||
| 247 | /* | ||
| 248 | * Mount point specific fields in an fsnotify_mark | ||
| 249 | */ | ||
| 250 | struct fsnotify_vfsmount_mark { | ||
| 251 | struct vfsmount *mnt; /* vfsmount this mark is associated with */ | ||
| 252 | struct hlist_node m_list; /* list of marks by inode->i_fsnotify_marks */ | ||
| 253 | struct list_head free_m_list; /* tmp list used when freeing this mark */ | ||
| 254 | }; | ||
| 255 | |||
| 256 | /* | ||
| 257 | * a mark is simply an object attached to an in core inode which allows an | ||
| 227 | * fsnotify listener to indicate they are either no longer interested in events | 258 | * fsnotify listener to indicate they are either no longer interested in events |
| 228 | * of a type matching mask or only interested in those events. | 259 | * of a type matching mask or only interested in those events. |
| 229 | * | 260 | * |
| @@ -232,19 +263,28 @@ struct fsnotify_event { | |||
| 232 | * (such as dnotify) will flush these when the open fd is closed and not at | 263 | * (such as dnotify) will flush these when the open fd is closed and not at |
| 233 | * inode eviction or modification. | 264 | * inode eviction or modification. |
| 234 | */ | 265 | */ |
| 235 | struct fsnotify_mark_entry { | 266 | struct fsnotify_mark { |
| 236 | __u32 mask; /* mask this mark entry is for */ | 267 | __u32 mask; /* mask this mark is for */ |
| 237 | /* we hold ref for each i_list and g_list. also one ref for each 'thing' | 268 | /* we hold ref for each i_list and g_list. also one ref for each 'thing' |
| 238 | * in kernel that found and may be using this mark. */ | 269 | * in kernel that found and may be using this mark. */ |
| 239 | atomic_t refcnt; /* active things looking at this mark */ | 270 | atomic_t refcnt; /* active things looking at this mark */ |
| 240 | struct inode *inode; /* inode this entry is associated with */ | 271 | struct fsnotify_group *group; /* group this mark is for */ |
| 241 | struct fsnotify_group *group; /* group this mark entry is for */ | 272 | struct list_head g_list; /* list of marks by group->i_fsnotify_marks */ |
| 242 | struct hlist_node i_list; /* list of mark_entries by inode->i_fsnotify_mark_entries */ | 273 | spinlock_t lock; /* protect group and inode */ |
| 243 | struct list_head g_list; /* list of mark_entries by group->i_fsnotify_mark_entries */ | 274 | union { |
| 244 | spinlock_t lock; /* protect group, inode, and killme */ | 275 | struct fsnotify_inode_mark i; |
| 245 | struct list_head free_i_list; /* tmp list used when freeing this mark */ | 276 | struct fsnotify_vfsmount_mark m; |
| 277 | }; | ||
| 278 | __u32 ignored_mask; /* events types to ignore */ | ||
| 246 | struct list_head free_g_list; /* tmp list used when freeing this mark */ | 279 | struct list_head free_g_list; /* tmp list used when freeing this mark */ |
| 247 | void (*free_mark)(struct fsnotify_mark_entry *entry); /* called on final put+free */ | 280 | #define FSNOTIFY_MARK_FLAG_INODE 0x01 |
| 281 | #define FSNOTIFY_MARK_FLAG_VFSMOUNT 0x02 | ||
| 282 | #define FSNOTIFY_MARK_FLAG_OBJECT_PINNED 0x04 | ||
| 283 | #define FSNOTIFY_MARK_FLAG_IGNORED_SURV_MODIFY 0x08 | ||
| 284 | #define FSNOTIFY_MARK_FLAG_ALIVE 0x10 | ||
| 285 | unsigned int flags; /* vfsmount or inode mark? */ | ||
| 286 | struct list_head destroy_list; | ||
| 287 | void (*free_mark)(struct fsnotify_mark *mark); /* called on final put+free */ | ||
| 248 | }; | 288 | }; |
| 249 | 289 | ||
| 250 | #ifdef CONFIG_FSNOTIFY | 290 | #ifdef CONFIG_FSNOTIFY |
| @@ -252,10 +292,11 @@ struct fsnotify_mark_entry { | |||
| 252 | /* called from the vfs helpers */ | 292 | /* called from the vfs helpers */ |
| 253 | 293 | ||
| 254 | /* main fsnotify call to send events */ | 294 | /* main fsnotify call to send events */ |
| 255 | extern void fsnotify(struct inode *to_tell, __u32 mask, void *data, int data_is, | 295 | extern int fsnotify(struct inode *to_tell, __u32 mask, void *data, int data_is, |
| 256 | const char *name, u32 cookie); | 296 | const unsigned char *name, u32 cookie); |
| 257 | extern void __fsnotify_parent(struct dentry *dentry, __u32 mask); | 297 | extern void __fsnotify_parent(struct path *path, struct dentry *dentry, __u32 mask); |
| 258 | extern void __fsnotify_inode_delete(struct inode *inode); | 298 | extern void __fsnotify_inode_delete(struct inode *inode); |
| 299 | extern void __fsnotify_vfsmount_delete(struct vfsmount *mnt); | ||
| 259 | extern u32 fsnotify_get_cookie(void); | 300 | extern u32 fsnotify_get_cookie(void); |
| 260 | 301 | ||
| 261 | static inline int fsnotify_inode_watches_children(struct inode *inode) | 302 | static inline int fsnotify_inode_watches_children(struct inode *inode) |
| @@ -304,15 +345,9 @@ static inline void __fsnotify_d_instantiate(struct dentry *dentry, struct inode | |||
| 304 | 345 | ||
| 305 | /* called from fsnotify listeners, such as fanotify or dnotify */ | 346 | /* called from fsnotify listeners, such as fanotify or dnotify */ |
| 306 | 347 | ||
| 307 | /* must call when a group changes its ->mask */ | ||
| 308 | extern void fsnotify_recalc_global_mask(void); | ||
| 309 | /* get a reference to an existing or create a new group */ | 348 | /* get a reference to an existing or create a new group */ |
| 310 | extern struct fsnotify_group *fsnotify_obtain_group(unsigned int group_num, | 349 | extern struct fsnotify_group *fsnotify_alloc_group(const struct fsnotify_ops *ops); |
| 311 | __u32 mask, | 350 | /* drop reference on a group from fsnotify_alloc_group */ |
| 312 | const struct fsnotify_ops *ops); | ||
| 313 | /* run all marks associated with this group and update group->mask */ | ||
| 314 | extern void fsnotify_recalc_group_mask(struct fsnotify_group *group); | ||
| 315 | /* drop reference on a group from fsnotify_obtain_group */ | ||
| 316 | extern void fsnotify_put_group(struct fsnotify_group *group); | 351 | extern void fsnotify_put_group(struct fsnotify_group *group); |
| 317 | 352 | ||
| 318 | /* take a reference to an event */ | 353 | /* take a reference to an event */ |
| @@ -323,8 +358,11 @@ extern struct fsnotify_event_private_data *fsnotify_remove_priv_from_event(struc | |||
| 323 | struct fsnotify_event *event); | 358 | struct fsnotify_event *event); |
| 324 | 359 | ||
| 325 | /* attach the event to the group notification queue */ | 360 | /* attach the event to the group notification queue */ |
| 326 | extern int fsnotify_add_notify_event(struct fsnotify_group *group, struct fsnotify_event *event, | 361 | extern struct fsnotify_event *fsnotify_add_notify_event(struct fsnotify_group *group, |
| 327 | struct fsnotify_event_private_data *priv); | 362 | struct fsnotify_event *event, |
| 363 | struct fsnotify_event_private_data *priv, | ||
| 364 | struct fsnotify_event *(*merge)(struct list_head *, | ||
| 365 | struct fsnotify_event *)); | ||
| 328 | /* true if the group notification queue is empty */ | 366 | /* true if the group notification queue is empty */ |
| 329 | extern bool fsnotify_notify_queue_is_empty(struct fsnotify_group *group); | 367 | extern bool fsnotify_notify_queue_is_empty(struct fsnotify_group *group); |
| 330 | /* return, but do not dequeue the first event on the notification queue */ | 368 | /* return, but do not dequeue the first event on the notification queue */ |
| @@ -334,38 +372,66 @@ extern struct fsnotify_event *fsnotify_remove_notify_event(struct fsnotify_group | |||
| 334 | 372 | ||
| 335 | /* functions used to manipulate the marks attached to inodes */ | 373 | /* functions used to manipulate the marks attached to inodes */ |
| 336 | 374 | ||
| 375 | /* run all marks associated with a vfsmount and update mnt->mnt_fsnotify_mask */ | ||
| 376 | extern void fsnotify_recalc_vfsmount_mask(struct vfsmount *mnt); | ||
| 337 | /* run all marks associated with an inode and update inode->i_fsnotify_mask */ | 377 | /* run all marks associated with an inode and update inode->i_fsnotify_mask */ |
| 338 | extern void fsnotify_recalc_inode_mask(struct inode *inode); | 378 | extern void fsnotify_recalc_inode_mask(struct inode *inode); |
| 339 | extern void fsnotify_init_mark(struct fsnotify_mark_entry *entry, void (*free_mark)(struct fsnotify_mark_entry *entry)); | 379 | extern void fsnotify_init_mark(struct fsnotify_mark *mark, void (*free_mark)(struct fsnotify_mark *mark)); |
| 340 | /* find (and take a reference) to a mark associated with group and inode */ | 380 | /* find (and take a reference) to a mark associated with group and inode */ |
| 341 | extern struct fsnotify_mark_entry *fsnotify_find_mark_entry(struct fsnotify_group *group, struct inode *inode); | 381 | extern struct fsnotify_mark *fsnotify_find_inode_mark(struct fsnotify_group *group, struct inode *inode); |
| 382 | /* find (and take a reference) to a mark associated with group and vfsmount */ | ||
| 383 | extern struct fsnotify_mark *fsnotify_find_vfsmount_mark(struct fsnotify_group *group, struct vfsmount *mnt); | ||
| 384 | /* copy the values from old into new */ | ||
| 385 | extern void fsnotify_duplicate_mark(struct fsnotify_mark *new, struct fsnotify_mark *old); | ||
| 386 | /* set the ignored_mask of a mark */ | ||
| 387 | extern void fsnotify_set_mark_ignored_mask_locked(struct fsnotify_mark *mark, __u32 mask); | ||
| 388 | /* set the mask of a mark (might pin the object into memory */ | ||
| 389 | extern void fsnotify_set_mark_mask_locked(struct fsnotify_mark *mark, __u32 mask); | ||
| 342 | /* attach the mark to both the group and the inode */ | 390 | /* attach the mark to both the group and the inode */ |
| 343 | extern int fsnotify_add_mark(struct fsnotify_mark_entry *entry, struct fsnotify_group *group, struct inode *inode); | 391 | extern int fsnotify_add_mark(struct fsnotify_mark *mark, struct fsnotify_group *group, |
| 392 | struct inode *inode, struct vfsmount *mnt, int allow_dups); | ||
| 344 | /* given a mark, flag it to be freed when all references are dropped */ | 393 | /* given a mark, flag it to be freed when all references are dropped */ |
| 345 | extern void fsnotify_destroy_mark_by_entry(struct fsnotify_mark_entry *entry); | 394 | extern void fsnotify_destroy_mark(struct fsnotify_mark *mark); |
| 395 | /* run all the marks in a group, and clear all of the vfsmount marks */ | ||
| 396 | extern void fsnotify_clear_vfsmount_marks_by_group(struct fsnotify_group *group); | ||
| 397 | /* run all the marks in a group, and clear all of the inode marks */ | ||
| 398 | extern void fsnotify_clear_inode_marks_by_group(struct fsnotify_group *group); | ||
| 399 | /* run all the marks in a group, and clear all of the marks where mark->flags & flags is true*/ | ||
| 400 | extern void fsnotify_clear_marks_by_group_flags(struct fsnotify_group *group, unsigned int flags); | ||
| 346 | /* run all the marks in a group, and flag them to be freed */ | 401 | /* run all the marks in a group, and flag them to be freed */ |
| 347 | extern void fsnotify_clear_marks_by_group(struct fsnotify_group *group); | 402 | extern void fsnotify_clear_marks_by_group(struct fsnotify_group *group); |
| 348 | extern void fsnotify_get_mark(struct fsnotify_mark_entry *entry); | 403 | extern void fsnotify_get_mark(struct fsnotify_mark *mark); |
| 349 | extern void fsnotify_put_mark(struct fsnotify_mark_entry *entry); | 404 | extern void fsnotify_put_mark(struct fsnotify_mark *mark); |
| 350 | extern void fsnotify_unmount_inodes(struct list_head *list); | 405 | extern void fsnotify_unmount_inodes(struct list_head *list); |
| 351 | 406 | ||
| 352 | /* put here because inotify does some weird stuff when destroying watches */ | 407 | /* put here because inotify does some weird stuff when destroying watches */ |
| 353 | extern struct fsnotify_event *fsnotify_create_event(struct inode *to_tell, __u32 mask, | 408 | extern struct fsnotify_event *fsnotify_create_event(struct inode *to_tell, __u32 mask, |
| 354 | void *data, int data_is, const char *name, | 409 | void *data, int data_is, |
| 410 | const unsigned char *name, | ||
| 355 | u32 cookie, gfp_t gfp); | 411 | u32 cookie, gfp_t gfp); |
| 356 | 412 | ||
| 413 | /* fanotify likes to change events after they are on lists... */ | ||
| 414 | extern struct fsnotify_event *fsnotify_clone_event(struct fsnotify_event *old_event); | ||
| 415 | extern int fsnotify_replace_event(struct fsnotify_event_holder *old_holder, | ||
| 416 | struct fsnotify_event *new_event); | ||
| 417 | |||
| 357 | #else | 418 | #else |
| 358 | 419 | ||
| 359 | static inline void fsnotify(struct inode *to_tell, __u32 mask, void *data, int data_is, | 420 | static inline int fsnotify(struct inode *to_tell, __u32 mask, void *data, int data_is, |
| 360 | const char *name, u32 cookie) | 421 | const unsigned char *name, u32 cookie) |
| 361 | {} | 422 | { |
| 423 | return 0; | ||
| 424 | } | ||
| 362 | 425 | ||
| 363 | static inline void __fsnotify_parent(struct dentry *dentry, __u32 mask) | 426 | static inline void __fsnotify_parent(struct path *path, struct dentry *dentry, __u32 mask) |
| 364 | {} | 427 | {} |
| 365 | 428 | ||
| 366 | static inline void __fsnotify_inode_delete(struct inode *inode) | 429 | static inline void __fsnotify_inode_delete(struct inode *inode) |
| 367 | {} | 430 | {} |
| 368 | 431 | ||
| 432 | static inline void __fsnotify_vfsmount_delete(struct vfsmount *mnt) | ||
| 433 | {} | ||
| 434 | |||
| 369 | static inline void __fsnotify_update_dcache_flags(struct dentry *dentry) | 435 | static inline void __fsnotify_update_dcache_flags(struct dentry *dentry) |
| 370 | {} | 436 | {} |
| 371 | 437 | ||
diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h index 41e46330d9be..dcd6a7c3a435 100644 --- a/include/linux/ftrace.h +++ b/include/linux/ftrace.h | |||
| @@ -1,3 +1,8 @@ | |||
| 1 | /* | ||
| 2 | * Ftrace header. For implementation details beyond the random comments | ||
| 3 | * scattered below, see: Documentation/trace/ftrace-design.txt | ||
| 4 | */ | ||
| 5 | |||
| 1 | #ifndef _LINUX_FTRACE_H | 6 | #ifndef _LINUX_FTRACE_H |
| 2 | #define _LINUX_FTRACE_H | 7 | #define _LINUX_FTRACE_H |
| 3 | 8 | ||
diff --git a/include/linux/ftrace_event.h b/include/linux/ftrace_event.h index 3167f2df4126..8beabb958f61 100644 --- a/include/linux/ftrace_event.h +++ b/include/linux/ftrace_event.h | |||
| @@ -11,8 +11,6 @@ struct trace_array; | |||
| 11 | struct tracer; | 11 | struct tracer; |
| 12 | struct dentry; | 12 | struct dentry; |
| 13 | 13 | ||
| 14 | DECLARE_PER_CPU(struct trace_seq, ftrace_event_seq); | ||
| 15 | |||
| 16 | struct trace_print_flags { | 14 | struct trace_print_flags { |
| 17 | unsigned long mask; | 15 | unsigned long mask; |
| 18 | const char *name; | 16 | const char *name; |
| @@ -58,6 +56,9 @@ struct trace_iterator { | |||
| 58 | struct ring_buffer_iter *buffer_iter[NR_CPUS]; | 56 | struct ring_buffer_iter *buffer_iter[NR_CPUS]; |
| 59 | unsigned long iter_flags; | 57 | unsigned long iter_flags; |
| 60 | 58 | ||
| 59 | /* trace_seq for __print_flags() and __print_symbolic() etc. */ | ||
| 60 | struct trace_seq tmp_seq; | ||
| 61 | |||
| 61 | /* The below is zeroed out in pipe_read */ | 62 | /* The below is zeroed out in pipe_read */ |
| 62 | struct trace_seq seq; | 63 | struct trace_seq seq; |
| 63 | struct trace_entry *ent; | 64 | struct trace_entry *ent; |
| @@ -146,14 +147,19 @@ struct ftrace_event_class { | |||
| 146 | int (*raw_init)(struct ftrace_event_call *); | 147 | int (*raw_init)(struct ftrace_event_call *); |
| 147 | }; | 148 | }; |
| 148 | 149 | ||
| 150 | extern int ftrace_event_reg(struct ftrace_event_call *event, | ||
| 151 | enum trace_reg type); | ||
| 152 | |||
| 149 | enum { | 153 | enum { |
| 150 | TRACE_EVENT_FL_ENABLED_BIT, | 154 | TRACE_EVENT_FL_ENABLED_BIT, |
| 151 | TRACE_EVENT_FL_FILTERED_BIT, | 155 | TRACE_EVENT_FL_FILTERED_BIT, |
| 156 | TRACE_EVENT_FL_RECORDED_CMD_BIT, | ||
| 152 | }; | 157 | }; |
| 153 | 158 | ||
| 154 | enum { | 159 | enum { |
| 155 | TRACE_EVENT_FL_ENABLED = (1 << TRACE_EVENT_FL_ENABLED_BIT), | 160 | TRACE_EVENT_FL_ENABLED = (1 << TRACE_EVENT_FL_ENABLED_BIT), |
| 156 | TRACE_EVENT_FL_FILTERED = (1 << TRACE_EVENT_FL_FILTERED_BIT), | 161 | TRACE_EVENT_FL_FILTERED = (1 << TRACE_EVENT_FL_FILTERED_BIT), |
| 162 | TRACE_EVENT_FL_RECORDED_CMD = (1 << TRACE_EVENT_FL_RECORDED_CMD_BIT), | ||
| 157 | }; | 163 | }; |
| 158 | 164 | ||
| 159 | struct ftrace_event_call { | 165 | struct ftrace_event_call { |
| @@ -171,6 +177,7 @@ struct ftrace_event_call { | |||
| 171 | * 32 bit flags: | 177 | * 32 bit flags: |
| 172 | * bit 1: enabled | 178 | * bit 1: enabled |
| 173 | * bit 2: filter_active | 179 | * bit 2: filter_active |
| 180 | * bit 3: enabled cmd record | ||
| 174 | * | 181 | * |
| 175 | * Changes to flags must hold the event_mutex. | 182 | * Changes to flags must hold the event_mutex. |
| 176 | * | 183 | * |
| @@ -184,8 +191,8 @@ struct ftrace_event_call { | |||
| 184 | unsigned int flags; | 191 | unsigned int flags; |
| 185 | 192 | ||
| 186 | #ifdef CONFIG_PERF_EVENTS | 193 | #ifdef CONFIG_PERF_EVENTS |
| 187 | int perf_refcount; | 194 | int perf_refcount; |
| 188 | struct hlist_head *perf_events; | 195 | struct hlist_head __percpu *perf_events; |
| 189 | #endif | 196 | #endif |
| 190 | }; | 197 | }; |
| 191 | 198 | ||
| @@ -245,8 +252,8 @@ DECLARE_PER_CPU(struct pt_regs, perf_trace_regs); | |||
| 245 | 252 | ||
| 246 | extern int perf_trace_init(struct perf_event *event); | 253 | extern int perf_trace_init(struct perf_event *event); |
| 247 | extern void perf_trace_destroy(struct perf_event *event); | 254 | extern void perf_trace_destroy(struct perf_event *event); |
| 248 | extern int perf_trace_enable(struct perf_event *event); | 255 | extern int perf_trace_add(struct perf_event *event, int flags); |
| 249 | extern void perf_trace_disable(struct perf_event *event); | 256 | extern void perf_trace_del(struct perf_event *event, int flags); |
| 250 | extern int ftrace_profile_set_filter(struct perf_event *event, int event_id, | 257 | extern int ftrace_profile_set_filter(struct perf_event *event, int event_id, |
| 251 | char *filter_str); | 258 | char *filter_str); |
| 252 | extern void ftrace_profile_free_filter(struct perf_event *event); | 259 | extern void ftrace_profile_free_filter(struct perf_event *event); |
| @@ -257,8 +264,7 @@ static inline void | |||
| 257 | perf_trace_buf_submit(void *raw_data, int size, int rctx, u64 addr, | 264 | perf_trace_buf_submit(void *raw_data, int size, int rctx, u64 addr, |
| 258 | u64 count, struct pt_regs *regs, void *head) | 265 | u64 count, struct pt_regs *regs, void *head) |
| 259 | { | 266 | { |
| 260 | perf_tp_event(addr, count, raw_data, size, regs, head); | 267 | perf_tp_event(addr, count, raw_data, size, regs, head, rctx); |
| 261 | perf_swevent_put_recursion_context(rctx); | ||
| 262 | } | 268 | } |
| 263 | #endif | 269 | #endif |
| 264 | 270 | ||
diff --git a/include/linux/fuse.h b/include/linux/fuse.h index 88e0eb596919..c3c578e09833 100644 --- a/include/linux/fuse.h +++ b/include/linux/fuse.h | |||
| @@ -37,6 +37,10 @@ | |||
| 37 | * | 37 | * |
| 38 | * 7.14 | 38 | * 7.14 |
| 39 | * - add splice support to fuse device | 39 | * - add splice support to fuse device |
| 40 | * | ||
| 41 | * 7.15 | ||
| 42 | * - add store notify | ||
| 43 | * - add retrieve notify | ||
| 40 | */ | 44 | */ |
| 41 | 45 | ||
| 42 | #ifndef _LINUX_FUSE_H | 46 | #ifndef _LINUX_FUSE_H |
| @@ -68,7 +72,7 @@ | |||
| 68 | #define FUSE_KERNEL_VERSION 7 | 72 | #define FUSE_KERNEL_VERSION 7 |
| 69 | 73 | ||
| 70 | /** Minor version number of this interface */ | 74 | /** Minor version number of this interface */ |
| 71 | #define FUSE_KERNEL_MINOR_VERSION 14 | 75 | #define FUSE_KERNEL_MINOR_VERSION 15 |
| 72 | 76 | ||
| 73 | /** The node ID of the root inode */ | 77 | /** The node ID of the root inode */ |
| 74 | #define FUSE_ROOT_ID 1 | 78 | #define FUSE_ROOT_ID 1 |
| @@ -251,6 +255,7 @@ enum fuse_opcode { | |||
| 251 | FUSE_DESTROY = 38, | 255 | FUSE_DESTROY = 38, |
| 252 | FUSE_IOCTL = 39, | 256 | FUSE_IOCTL = 39, |
| 253 | FUSE_POLL = 40, | 257 | FUSE_POLL = 40, |
| 258 | FUSE_NOTIFY_REPLY = 41, | ||
| 254 | 259 | ||
| 255 | /* CUSE specific operations */ | 260 | /* CUSE specific operations */ |
| 256 | CUSE_INIT = 4096, | 261 | CUSE_INIT = 4096, |
| @@ -260,6 +265,8 @@ enum fuse_notify_code { | |||
| 260 | FUSE_NOTIFY_POLL = 1, | 265 | FUSE_NOTIFY_POLL = 1, |
| 261 | FUSE_NOTIFY_INVAL_INODE = 2, | 266 | FUSE_NOTIFY_INVAL_INODE = 2, |
| 262 | FUSE_NOTIFY_INVAL_ENTRY = 3, | 267 | FUSE_NOTIFY_INVAL_ENTRY = 3, |
| 268 | FUSE_NOTIFY_STORE = 4, | ||
| 269 | FUSE_NOTIFY_RETRIEVE = 5, | ||
| 263 | FUSE_NOTIFY_CODE_MAX, | 270 | FUSE_NOTIFY_CODE_MAX, |
| 264 | }; | 271 | }; |
| 265 | 272 | ||
| @@ -568,4 +575,29 @@ struct fuse_notify_inval_entry_out { | |||
| 568 | __u32 padding; | 575 | __u32 padding; |
| 569 | }; | 576 | }; |
| 570 | 577 | ||
| 578 | struct fuse_notify_store_out { | ||
| 579 | __u64 nodeid; | ||
| 580 | __u64 offset; | ||
| 581 | __u32 size; | ||
| 582 | __u32 padding; | ||
| 583 | }; | ||
| 584 | |||
| 585 | struct fuse_notify_retrieve_out { | ||
| 586 | __u64 notify_unique; | ||
| 587 | __u64 nodeid; | ||
| 588 | __u64 offset; | ||
| 589 | __u32 size; | ||
| 590 | __u32 padding; | ||
| 591 | }; | ||
| 592 | |||
| 593 | /* Matches the size of fuse_write_in */ | ||
| 594 | struct fuse_notify_retrieve_in { | ||
| 595 | __u64 dummy1; | ||
| 596 | __u64 offset; | ||
| 597 | __u32 size; | ||
| 598 | __u32 dummy2; | ||
| 599 | __u64 dummy3; | ||
| 600 | __u64 dummy4; | ||
| 601 | }; | ||
| 602 | |||
| 571 | #endif /* _LINUX_FUSE_H */ | 603 | #endif /* _LINUX_FUSE_H */ |
diff --git a/include/linux/gameport.h b/include/linux/gameport.h index 361d1cc288d0..b65a6f472775 100644 --- a/include/linux/gameport.h +++ b/include/linux/gameport.h | |||
| @@ -53,9 +53,7 @@ struct gameport { | |||
| 53 | #define to_gameport_port(d) container_of(d, struct gameport, dev) | 53 | #define to_gameport_port(d) container_of(d, struct gameport, dev) |
| 54 | 54 | ||
| 55 | struct gameport_driver { | 55 | struct gameport_driver { |
| 56 | 56 | const char *description; | |
| 57 | void *private; | ||
| 58 | char *description; | ||
| 59 | 57 | ||
| 60 | int (*connect)(struct gameport *, struct gameport_driver *drv); | 58 | int (*connect)(struct gameport *, struct gameport_driver *drv); |
| 61 | int (*reconnect)(struct gameport *); | 59 | int (*reconnect)(struct gameport *); |
diff --git a/include/linux/genhd.h b/include/linux/genhd.h index 5f2f4c4d8fb0..7a7b9c1644e4 100644 --- a/include/linux/genhd.h +++ b/include/linux/genhd.h | |||
| @@ -12,6 +12,7 @@ | |||
| 12 | #include <linux/types.h> | 12 | #include <linux/types.h> |
| 13 | #include <linux/kdev_t.h> | 13 | #include <linux/kdev_t.h> |
| 14 | #include <linux/rcupdate.h> | 14 | #include <linux/rcupdate.h> |
| 15 | #include <linux/slab.h> | ||
| 15 | 16 | ||
| 16 | #ifdef CONFIG_BLOCK | 17 | #ifdef CONFIG_BLOCK |
| 17 | 18 | ||
| @@ -86,7 +87,15 @@ struct disk_stats { | |||
| 86 | unsigned long io_ticks; | 87 | unsigned long io_ticks; |
| 87 | unsigned long time_in_queue; | 88 | unsigned long time_in_queue; |
| 88 | }; | 89 | }; |
| 89 | 90 | ||
| 91 | #define PARTITION_META_INFO_VOLNAMELTH 64 | ||
| 92 | #define PARTITION_META_INFO_UUIDLTH 16 | ||
| 93 | |||
| 94 | struct partition_meta_info { | ||
| 95 | u8 uuid[PARTITION_META_INFO_UUIDLTH]; /* always big endian */ | ||
| 96 | u8 volname[PARTITION_META_INFO_VOLNAMELTH]; | ||
| 97 | }; | ||
| 98 | |||
| 90 | struct hd_struct { | 99 | struct hd_struct { |
| 91 | sector_t start_sect; | 100 | sector_t start_sect; |
| 92 | sector_t nr_sects; | 101 | sector_t nr_sects; |
| @@ -95,6 +104,7 @@ struct hd_struct { | |||
| 95 | struct device __dev; | 104 | struct device __dev; |
| 96 | struct kobject *holder_dir; | 105 | struct kobject *holder_dir; |
| 97 | int policy, partno; | 106 | int policy, partno; |
| 107 | struct partition_meta_info *info; | ||
| 98 | #ifdef CONFIG_FAIL_MAKE_REQUEST | 108 | #ifdef CONFIG_FAIL_MAKE_REQUEST |
| 99 | int make_it_fail; | 109 | int make_it_fail; |
| 100 | #endif | 110 | #endif |
| @@ -129,8 +139,8 @@ struct blk_scsi_cmd_filter { | |||
| 129 | struct disk_part_tbl { | 139 | struct disk_part_tbl { |
| 130 | struct rcu_head rcu_head; | 140 | struct rcu_head rcu_head; |
| 131 | int len; | 141 | int len; |
| 132 | struct hd_struct *last_lookup; | 142 | struct hd_struct __rcu *last_lookup; |
| 133 | struct hd_struct *part[]; | 143 | struct hd_struct __rcu *part[]; |
| 134 | }; | 144 | }; |
| 135 | 145 | ||
| 136 | struct gendisk { | 146 | struct gendisk { |
| @@ -149,7 +159,7 @@ struct gendisk { | |||
| 149 | * non-critical accesses use RCU. Always access through | 159 | * non-critical accesses use RCU. Always access through |
| 150 | * helpers. | 160 | * helpers. |
| 151 | */ | 161 | */ |
| 152 | struct disk_part_tbl *part_tbl; | 162 | struct disk_part_tbl __rcu *part_tbl; |
| 153 | struct hd_struct part0; | 163 | struct hd_struct part0; |
| 154 | 164 | ||
| 155 | const struct block_device_operations *fops; | 165 | const struct block_device_operations *fops; |
| @@ -181,6 +191,30 @@ static inline struct gendisk *part_to_disk(struct hd_struct *part) | |||
| 181 | return NULL; | 191 | return NULL; |
| 182 | } | 192 | } |
| 183 | 193 | ||
| 194 | static inline void part_pack_uuid(const u8 *uuid_str, u8 *to) | ||
| 195 | { | ||
| 196 | int i; | ||
| 197 | for (i = 0; i < 16; ++i) { | ||
| 198 | *to++ = (hex_to_bin(*uuid_str) << 4) | | ||
| 199 | (hex_to_bin(*(uuid_str + 1))); | ||
| 200 | uuid_str += 2; | ||
| 201 | switch (i) { | ||
| 202 | case 3: | ||
| 203 | case 5: | ||
| 204 | case 7: | ||
| 205 | case 9: | ||
| 206 | uuid_str++; | ||
| 207 | continue; | ||
| 208 | } | ||
| 209 | } | ||
| 210 | } | ||
| 211 | |||
| 212 | static inline char *part_unpack_uuid(const u8 *uuid, char *out) | ||
| 213 | { | ||
| 214 | sprintf(out, "%pU", uuid); | ||
| 215 | return out; | ||
| 216 | } | ||
| 217 | |||
| 184 | static inline int disk_max_parts(struct gendisk *disk) | 218 | static inline int disk_max_parts(struct gendisk *disk) |
| 185 | { | 219 | { |
| 186 | if (disk->flags & GENHD_FL_EXT_DEVT) | 220 | if (disk->flags & GENHD_FL_EXT_DEVT) |
| @@ -342,6 +376,19 @@ static inline int part_in_flight(struct hd_struct *part) | |||
| 342 | return part->in_flight[0] + part->in_flight[1]; | 376 | return part->in_flight[0] + part->in_flight[1]; |
| 343 | } | 377 | } |
| 344 | 378 | ||
| 379 | static inline struct partition_meta_info *alloc_part_info(struct gendisk *disk) | ||
| 380 | { | ||
| 381 | if (disk) | ||
| 382 | return kzalloc_node(sizeof(struct partition_meta_info), | ||
| 383 | GFP_KERNEL, disk->node_id); | ||
| 384 | return kzalloc(sizeof(struct partition_meta_info), GFP_KERNEL); | ||
| 385 | } | ||
| 386 | |||
| 387 | static inline void free_part_info(struct hd_struct *part) | ||
| 388 | { | ||
| 389 | kfree(part->info); | ||
| 390 | } | ||
| 391 | |||
| 345 | /* block/blk-core.c */ | 392 | /* block/blk-core.c */ |
| 346 | extern void part_round_stats(int cpu, struct hd_struct *part); | 393 | extern void part_round_stats(int cpu, struct hd_struct *part); |
| 347 | 394 | ||
| @@ -533,7 +580,9 @@ extern int disk_expand_part_tbl(struct gendisk *disk, int target); | |||
| 533 | extern int rescan_partitions(struct gendisk *disk, struct block_device *bdev); | 580 | extern int rescan_partitions(struct gendisk *disk, struct block_device *bdev); |
| 534 | extern struct hd_struct * __must_check add_partition(struct gendisk *disk, | 581 | extern struct hd_struct * __must_check add_partition(struct gendisk *disk, |
| 535 | int partno, sector_t start, | 582 | int partno, sector_t start, |
| 536 | sector_t len, int flags); | 583 | sector_t len, int flags, |
| 584 | struct partition_meta_info | ||
| 585 | *info); | ||
| 537 | extern void delete_partition(struct gendisk *, int); | 586 | extern void delete_partition(struct gendisk *, int); |
| 538 | extern void printk_all_partitions(void); | 587 | extern void printk_all_partitions(void); |
| 539 | 588 | ||
diff --git a/include/linux/gfp.h b/include/linux/gfp.h index 975609cb8548..e8713d55360a 100644 --- a/include/linux/gfp.h +++ b/include/linux/gfp.h | |||
| @@ -9,6 +9,32 @@ | |||
| 9 | 9 | ||
| 10 | struct vm_area_struct; | 10 | struct vm_area_struct; |
| 11 | 11 | ||
| 12 | /* Plain integer GFP bitmasks. Do not use this directly. */ | ||
| 13 | #define ___GFP_DMA 0x01u | ||
| 14 | #define ___GFP_HIGHMEM 0x02u | ||
| 15 | #define ___GFP_DMA32 0x04u | ||
| 16 | #define ___GFP_MOVABLE 0x08u | ||
| 17 | #define ___GFP_WAIT 0x10u | ||
| 18 | #define ___GFP_HIGH 0x20u | ||
| 19 | #define ___GFP_IO 0x40u | ||
| 20 | #define ___GFP_FS 0x80u | ||
| 21 | #define ___GFP_COLD 0x100u | ||
| 22 | #define ___GFP_NOWARN 0x200u | ||
| 23 | #define ___GFP_REPEAT 0x400u | ||
| 24 | #define ___GFP_NOFAIL 0x800u | ||
| 25 | #define ___GFP_NORETRY 0x1000u | ||
| 26 | #define ___GFP_COMP 0x4000u | ||
| 27 | #define ___GFP_ZERO 0x8000u | ||
| 28 | #define ___GFP_NOMEMALLOC 0x10000u | ||
| 29 | #define ___GFP_HARDWALL 0x20000u | ||
| 30 | #define ___GFP_THISNODE 0x40000u | ||
| 31 | #define ___GFP_RECLAIMABLE 0x80000u | ||
| 32 | #ifdef CONFIG_KMEMCHECK | ||
| 33 | #define ___GFP_NOTRACK 0x200000u | ||
| 34 | #else | ||
| 35 | #define ___GFP_NOTRACK 0 | ||
| 36 | #endif | ||
| 37 | |||
| 12 | /* | 38 | /* |
| 13 | * GFP bitmasks.. | 39 | * GFP bitmasks.. |
| 14 | * | 40 | * |
| @@ -18,10 +44,10 @@ struct vm_area_struct; | |||
| 18 | * without the underscores and use them consistently. The definitions here may | 44 | * without the underscores and use them consistently. The definitions here may |
| 19 | * be used in bit comparisons. | 45 | * be used in bit comparisons. |
| 20 | */ | 46 | */ |
| 21 | #define __GFP_DMA ((__force gfp_t)0x01u) | 47 | #define __GFP_DMA ((__force gfp_t)___GFP_DMA) |
| 22 | #define __GFP_HIGHMEM ((__force gfp_t)0x02u) | 48 | #define __GFP_HIGHMEM ((__force gfp_t)___GFP_HIGHMEM) |
| 23 | #define __GFP_DMA32 ((__force gfp_t)0x04u) | 49 | #define __GFP_DMA32 ((__force gfp_t)___GFP_DMA32) |
| 24 | #define __GFP_MOVABLE ((__force gfp_t)0x08u) /* Page is movable */ | 50 | #define __GFP_MOVABLE ((__force gfp_t)___GFP_MOVABLE) /* Page is movable */ |
| 25 | #define GFP_ZONEMASK (__GFP_DMA|__GFP_HIGHMEM|__GFP_DMA32|__GFP_MOVABLE) | 51 | #define GFP_ZONEMASK (__GFP_DMA|__GFP_HIGHMEM|__GFP_DMA32|__GFP_MOVABLE) |
| 26 | /* | 52 | /* |
| 27 | * Action modifiers - doesn't change the zoning | 53 | * Action modifiers - doesn't change the zoning |
| @@ -38,27 +64,22 @@ struct vm_area_struct; | |||
| 38 | * __GFP_MOVABLE: Flag that this page will be movable by the page migration | 64 | * __GFP_MOVABLE: Flag that this page will be movable by the page migration |
| 39 | * mechanism or reclaimed | 65 | * mechanism or reclaimed |
| 40 | */ | 66 | */ |
| 41 | #define __GFP_WAIT ((__force gfp_t)0x10u) /* Can wait and reschedule? */ | 67 | #define __GFP_WAIT ((__force gfp_t)___GFP_WAIT) /* Can wait and reschedule? */ |
| 42 | #define __GFP_HIGH ((__force gfp_t)0x20u) /* Should access emergency pools? */ | 68 | #define __GFP_HIGH ((__force gfp_t)___GFP_HIGH) /* Should access emergency pools? */ |
| 43 | #define __GFP_IO ((__force gfp_t)0x40u) /* Can start physical IO? */ | 69 | #define __GFP_IO ((__force gfp_t)___GFP_IO) /* Can start physical IO? */ |
| 44 | #define __GFP_FS ((__force gfp_t)0x80u) /* Can call down to low-level FS? */ | 70 | #define __GFP_FS ((__force gfp_t)___GFP_FS) /* Can call down to low-level FS? */ |
| 45 | #define __GFP_COLD ((__force gfp_t)0x100u) /* Cache-cold page required */ | 71 | #define __GFP_COLD ((__force gfp_t)___GFP_COLD) /* Cache-cold page required */ |
| 46 | #define __GFP_NOWARN ((__force gfp_t)0x200u) /* Suppress page allocation failure warning */ | 72 | #define __GFP_NOWARN ((__force gfp_t)___GFP_NOWARN) /* Suppress page allocation failure warning */ |
| 47 | #define __GFP_REPEAT ((__force gfp_t)0x400u) /* See above */ | 73 | #define __GFP_REPEAT ((__force gfp_t)___GFP_REPEAT) /* See above */ |
| 48 | #define __GFP_NOFAIL ((__force gfp_t)0x800u) /* See above */ | 74 | #define __GFP_NOFAIL ((__force gfp_t)___GFP_NOFAIL) /* See above */ |
| 49 | #define __GFP_NORETRY ((__force gfp_t)0x1000u)/* See above */ | 75 | #define __GFP_NORETRY ((__force gfp_t)___GFP_NORETRY) /* See above */ |
| 50 | #define __GFP_COMP ((__force gfp_t)0x4000u)/* Add compound page metadata */ | 76 | #define __GFP_COMP ((__force gfp_t)___GFP_COMP) /* Add compound page metadata */ |
| 51 | #define __GFP_ZERO ((__force gfp_t)0x8000u)/* Return zeroed page on success */ | 77 | #define __GFP_ZERO ((__force gfp_t)___GFP_ZERO) /* Return zeroed page on success */ |
| 52 | #define __GFP_NOMEMALLOC ((__force gfp_t)0x10000u) /* Don't use emergency reserves */ | 78 | #define __GFP_NOMEMALLOC ((__force gfp_t)___GFP_NOMEMALLOC) /* Don't use emergency reserves */ |
| 53 | #define __GFP_HARDWALL ((__force gfp_t)0x20000u) /* Enforce hardwall cpuset memory allocs */ | 79 | #define __GFP_HARDWALL ((__force gfp_t)___GFP_HARDWALL) /* Enforce hardwall cpuset memory allocs */ |
| 54 | #define __GFP_THISNODE ((__force gfp_t)0x40000u)/* No fallback, no policies */ | 80 | #define __GFP_THISNODE ((__force gfp_t)___GFP_THISNODE)/* No fallback, no policies */ |
| 55 | #define __GFP_RECLAIMABLE ((__force gfp_t)0x80000u) /* Page is reclaimable */ | 81 | #define __GFP_RECLAIMABLE ((__force gfp_t)___GFP_RECLAIMABLE) /* Page is reclaimable */ |
| 56 | 82 | #define __GFP_NOTRACK ((__force gfp_t)___GFP_NOTRACK) /* Don't track with kmemcheck */ | |
| 57 | #ifdef CONFIG_KMEMCHECK | ||
| 58 | #define __GFP_NOTRACK ((__force gfp_t)0x200000u) /* Don't track with kmemcheck */ | ||
| 59 | #else | ||
| 60 | #define __GFP_NOTRACK ((__force gfp_t)0) | ||
| 61 | #endif | ||
| 62 | 83 | ||
| 63 | /* | 84 | /* |
| 64 | * This may seem redundant, but it's a way of annotating false positives vs. | 85 | * This may seem redundant, but it's a way of annotating false positives vs. |
| @@ -186,14 +207,14 @@ static inline int allocflags_to_migratetype(gfp_t gfp_flags) | |||
| 186 | #endif | 207 | #endif |
| 187 | 208 | ||
| 188 | #define GFP_ZONE_TABLE ( \ | 209 | #define GFP_ZONE_TABLE ( \ |
| 189 | (ZONE_NORMAL << 0 * ZONES_SHIFT) \ | 210 | (ZONE_NORMAL << 0 * ZONES_SHIFT) \ |
| 190 | | (OPT_ZONE_DMA << __GFP_DMA * ZONES_SHIFT) \ | 211 | | (OPT_ZONE_DMA << ___GFP_DMA * ZONES_SHIFT) \ |
| 191 | | (OPT_ZONE_HIGHMEM << __GFP_HIGHMEM * ZONES_SHIFT) \ | 212 | | (OPT_ZONE_HIGHMEM << ___GFP_HIGHMEM * ZONES_SHIFT) \ |
| 192 | | (OPT_ZONE_DMA32 << __GFP_DMA32 * ZONES_SHIFT) \ | 213 | | (OPT_ZONE_DMA32 << ___GFP_DMA32 * ZONES_SHIFT) \ |
| 193 | | (ZONE_NORMAL << __GFP_MOVABLE * ZONES_SHIFT) \ | 214 | | (ZONE_NORMAL << ___GFP_MOVABLE * ZONES_SHIFT) \ |
| 194 | | (OPT_ZONE_DMA << (__GFP_MOVABLE | __GFP_DMA) * ZONES_SHIFT) \ | 215 | | (OPT_ZONE_DMA << (___GFP_MOVABLE | ___GFP_DMA) * ZONES_SHIFT) \ |
| 195 | | (ZONE_MOVABLE << (__GFP_MOVABLE | __GFP_HIGHMEM) * ZONES_SHIFT)\ | 216 | | (ZONE_MOVABLE << (___GFP_MOVABLE | ___GFP_HIGHMEM) * ZONES_SHIFT) \ |
| 196 | | (OPT_ZONE_DMA32 << (__GFP_MOVABLE | __GFP_DMA32) * ZONES_SHIFT)\ | 217 | | (OPT_ZONE_DMA32 << (___GFP_MOVABLE | ___GFP_DMA32) * ZONES_SHIFT) \ |
| 197 | ) | 218 | ) |
| 198 | 219 | ||
| 199 | /* | 220 | /* |
| @@ -203,20 +224,20 @@ static inline int allocflags_to_migratetype(gfp_t gfp_flags) | |||
| 203 | * allowed. | 224 | * allowed. |
| 204 | */ | 225 | */ |
| 205 | #define GFP_ZONE_BAD ( \ | 226 | #define GFP_ZONE_BAD ( \ |
| 206 | 1 << (__GFP_DMA | __GFP_HIGHMEM) \ | 227 | 1 << (___GFP_DMA | ___GFP_HIGHMEM) \ |
| 207 | | 1 << (__GFP_DMA | __GFP_DMA32) \ | 228 | | 1 << (___GFP_DMA | ___GFP_DMA32) \ |
| 208 | | 1 << (__GFP_DMA32 | __GFP_HIGHMEM) \ | 229 | | 1 << (___GFP_DMA32 | ___GFP_HIGHMEM) \ |
| 209 | | 1 << (__GFP_DMA | __GFP_DMA32 | __GFP_HIGHMEM) \ | 230 | | 1 << (___GFP_DMA | ___GFP_DMA32 | ___GFP_HIGHMEM) \ |
| 210 | | 1 << (__GFP_MOVABLE | __GFP_HIGHMEM | __GFP_DMA) \ | 231 | | 1 << (___GFP_MOVABLE | ___GFP_HIGHMEM | ___GFP_DMA) \ |
| 211 | | 1 << (__GFP_MOVABLE | __GFP_DMA32 | __GFP_DMA) \ | 232 | | 1 << (___GFP_MOVABLE | ___GFP_DMA32 | ___GFP_DMA) \ |
| 212 | | 1 << (__GFP_MOVABLE | __GFP_DMA32 | __GFP_HIGHMEM) \ | 233 | | 1 << (___GFP_MOVABLE | ___GFP_DMA32 | ___GFP_HIGHMEM) \ |
| 213 | | 1 << (__GFP_MOVABLE | __GFP_DMA32 | __GFP_DMA | __GFP_HIGHMEM)\ | 234 | | 1 << (___GFP_MOVABLE | ___GFP_DMA32 | ___GFP_DMA | ___GFP_HIGHMEM) \ |
| 214 | ) | 235 | ) |
| 215 | 236 | ||
| 216 | static inline enum zone_type gfp_zone(gfp_t flags) | 237 | static inline enum zone_type gfp_zone(gfp_t flags) |
| 217 | { | 238 | { |
| 218 | enum zone_type z; | 239 | enum zone_type z; |
| 219 | int bit = flags & GFP_ZONEMASK; | 240 | int bit = (__force int) (flags & GFP_ZONEMASK); |
| 220 | 241 | ||
| 221 | z = (GFP_ZONE_TABLE >> (bit * ZONES_SHIFT)) & | 242 | z = (GFP_ZONE_TABLE >> (bit * ZONES_SHIFT)) & |
| 222 | ((1 << ZONES_SHIFT) - 1); | 243 | ((1 << ZONES_SHIFT) - 1); |
diff --git a/include/linux/gpio-fan.h b/include/linux/gpio-fan.h new file mode 100644 index 000000000000..096659169215 --- /dev/null +++ b/include/linux/gpio-fan.h | |||
| @@ -0,0 +1,36 @@ | |||
| 1 | /* | ||
| 2 | * include/linux/gpio-fan.h | ||
| 3 | * | ||
| 4 | * Platform data structure for GPIO fan driver | ||
| 5 | * | ||
| 6 | * This file is licensed under the terms of the GNU General Public | ||
| 7 | * License version 2. This program is licensed "as is" without any | ||
| 8 | * warranty of any kind, whether express or implied. | ||
| 9 | */ | ||
| 10 | |||
| 11 | #ifndef __LINUX_GPIO_FAN_H | ||
| 12 | #define __LINUX_GPIO_FAN_H | ||
| 13 | |||
| 14 | struct gpio_fan_alarm { | ||
| 15 | unsigned gpio; | ||
| 16 | unsigned active_low; | ||
| 17 | }; | ||
| 18 | |||
| 19 | struct gpio_fan_speed { | ||
| 20 | int rpm; | ||
| 21 | int ctrl_val; | ||
| 22 | }; | ||
| 23 | |||
| 24 | struct gpio_fan_platform_data { | ||
| 25 | int num_ctrl; | ||
| 26 | unsigned *ctrl; /* fan control GPIOs. */ | ||
| 27 | struct gpio_fan_alarm *alarm; /* fan alarm GPIO. */ | ||
| 28 | /* | ||
| 29 | * Speed conversion array: rpm from/to GPIO bit field. | ||
| 30 | * This array _must_ be sorted in ascending rpm order. | ||
| 31 | */ | ||
| 32 | int num_speed; | ||
| 33 | struct gpio_fan_speed *speed; | ||
| 34 | }; | ||
| 35 | |||
| 36 | #endif /* __LINUX_GPIO_FAN_H */ | ||
diff --git a/include/linux/gpio.h b/include/linux/gpio.h index 03f616b78cfa..e41f7dd1ae67 100644 --- a/include/linux/gpio.h +++ b/include/linux/gpio.h | |||
| @@ -13,6 +13,7 @@ | |||
| 13 | #include <linux/errno.h> | 13 | #include <linux/errno.h> |
| 14 | 14 | ||
| 15 | struct device; | 15 | struct device; |
| 16 | struct gpio_chip; | ||
| 16 | 17 | ||
| 17 | /* | 18 | /* |
| 18 | * Some platforms don't support the GPIO programming interface. | 19 | * Some platforms don't support the GPIO programming interface. |
diff --git a/include/linux/gpio_keys.h b/include/linux/gpio_keys.h index cd0b3f30f48e..ce73a30113b4 100644 --- a/include/linux/gpio_keys.h +++ b/include/linux/gpio_keys.h | |||
| @@ -17,6 +17,8 @@ struct gpio_keys_platform_data { | |||
| 17 | struct gpio_keys_button *buttons; | 17 | struct gpio_keys_button *buttons; |
| 18 | int nbuttons; | 18 | int nbuttons; |
| 19 | unsigned int rep:1; /* enable input subsystem auto repeat */ | 19 | unsigned int rep:1; /* enable input subsystem auto repeat */ |
| 20 | int (*enable)(struct device *dev); | ||
| 21 | void (*disable)(struct device *dev); | ||
| 20 | }; | 22 | }; |
| 21 | 23 | ||
| 22 | #endif | 24 | #endif |
diff --git a/include/linux/hardirq.h b/include/linux/hardirq.h index d5b387669dab..8a389b608ce3 100644 --- a/include/linux/hardirq.h +++ b/include/linux/hardirq.h | |||
| @@ -8,7 +8,6 @@ | |||
| 8 | #include <linux/lockdep.h> | 8 | #include <linux/lockdep.h> |
| 9 | #include <linux/ftrace_irq.h> | 9 | #include <linux/ftrace_irq.h> |
| 10 | #include <asm/hardirq.h> | 10 | #include <asm/hardirq.h> |
| 11 | #include <asm/system.h> | ||
| 12 | 11 | ||
| 13 | /* | 12 | /* |
| 14 | * We put the hardirq and softirq counter into the preemption | 13 | * We put the hardirq and softirq counter into the preemption |
| @@ -64,6 +63,8 @@ | |||
| 64 | #define HARDIRQ_OFFSET (1UL << HARDIRQ_SHIFT) | 63 | #define HARDIRQ_OFFSET (1UL << HARDIRQ_SHIFT) |
| 65 | #define NMI_OFFSET (1UL << NMI_SHIFT) | 64 | #define NMI_OFFSET (1UL << NMI_SHIFT) |
| 66 | 65 | ||
| 66 | #define SOFTIRQ_DISABLE_OFFSET (2 * SOFTIRQ_OFFSET) | ||
| 67 | |||
| 67 | #ifndef PREEMPT_ACTIVE | 68 | #ifndef PREEMPT_ACTIVE |
| 68 | #define PREEMPT_ACTIVE_BITS 1 | 69 | #define PREEMPT_ACTIVE_BITS 1 |
| 69 | #define PREEMPT_ACTIVE_SHIFT (NMI_SHIFT + NMI_BITS) | 70 | #define PREEMPT_ACTIVE_SHIFT (NMI_SHIFT + NMI_BITS) |
| @@ -82,10 +83,13 @@ | |||
| 82 | /* | 83 | /* |
| 83 | * Are we doing bottom half or hardware interrupt processing? | 84 | * Are we doing bottom half or hardware interrupt processing? |
| 84 | * Are we in a softirq context? Interrupt context? | 85 | * Are we in a softirq context? Interrupt context? |
| 86 | * in_softirq - Are we currently processing softirq or have bh disabled? | ||
| 87 | * in_serving_softirq - Are we currently processing softirq? | ||
| 85 | */ | 88 | */ |
| 86 | #define in_irq() (hardirq_count()) | 89 | #define in_irq() (hardirq_count()) |
| 87 | #define in_softirq() (softirq_count()) | 90 | #define in_softirq() (softirq_count()) |
| 88 | #define in_interrupt() (irq_count()) | 91 | #define in_interrupt() (irq_count()) |
| 92 | #define in_serving_softirq() (softirq_count() & SOFTIRQ_OFFSET) | ||
| 89 | 93 | ||
| 90 | /* | 94 | /* |
| 91 | * Are we in NMI context? | 95 | * Are we in NMI context? |
| @@ -132,14 +136,16 @@ extern void synchronize_irq(unsigned int irq); | |||
| 132 | 136 | ||
| 133 | struct task_struct; | 137 | struct task_struct; |
| 134 | 138 | ||
| 135 | #ifndef CONFIG_VIRT_CPU_ACCOUNTING | 139 | #if !defined(CONFIG_VIRT_CPU_ACCOUNTING) && !defined(CONFIG_IRQ_TIME_ACCOUNTING) |
| 136 | static inline void account_system_vtime(struct task_struct *tsk) | 140 | static inline void account_system_vtime(struct task_struct *tsk) |
| 137 | { | 141 | { |
| 138 | } | 142 | } |
| 143 | #else | ||
| 144 | extern void account_system_vtime(struct task_struct *tsk); | ||
| 139 | #endif | 145 | #endif |
| 140 | 146 | ||
| 141 | #if defined(CONFIG_NO_HZ) | 147 | #if defined(CONFIG_NO_HZ) |
| 142 | #if defined(CONFIG_TINY_RCU) | 148 | #if defined(CONFIG_TINY_RCU) || defined(CONFIG_TINY_PREEMPT_RCU) |
| 143 | extern void rcu_enter_nohz(void); | 149 | extern void rcu_enter_nohz(void); |
| 144 | extern void rcu_exit_nohz(void); | 150 | extern void rcu_exit_nohz(void); |
| 145 | 151 | ||
diff --git a/include/linux/hid.h b/include/linux/hid.h index 895001f7f4b2..bb0f56f5c01e 100644 --- a/include/linux/hid.h +++ b/include/linux/hid.h | |||
| @@ -311,10 +311,12 @@ struct hid_item { | |||
| 311 | #define HID_QUIRK_HIDDEV_FORCE 0x00000010 | 311 | #define HID_QUIRK_HIDDEV_FORCE 0x00000010 |
| 312 | #define HID_QUIRK_BADPAD 0x00000020 | 312 | #define HID_QUIRK_BADPAD 0x00000020 |
| 313 | #define HID_QUIRK_MULTI_INPUT 0x00000040 | 313 | #define HID_QUIRK_MULTI_INPUT 0x00000040 |
| 314 | #define HID_QUIRK_HIDINPUT_FORCE 0x00000080 | ||
| 314 | #define HID_QUIRK_SKIP_OUTPUT_REPORTS 0x00010000 | 315 | #define HID_QUIRK_SKIP_OUTPUT_REPORTS 0x00010000 |
| 315 | #define HID_QUIRK_FULLSPEED_INTERVAL 0x10000000 | 316 | #define HID_QUIRK_FULLSPEED_INTERVAL 0x10000000 |
| 316 | #define HID_QUIRK_NO_INIT_REPORTS 0x20000000 | 317 | #define HID_QUIRK_NO_INIT_REPORTS 0x20000000 |
| 317 | #define HID_QUIRK_NO_IGNORE 0x40000000 | 318 | #define HID_QUIRK_NO_IGNORE 0x40000000 |
| 319 | #define HID_QUIRK_NO_INPUT_SYNC 0x80000000 | ||
| 318 | 320 | ||
| 319 | /* | 321 | /* |
| 320 | * This is the global environment of the parser. This information is | 322 | * This is the global environment of the parser. This information is |
| @@ -625,8 +627,8 @@ struct hid_driver { | |||
| 625 | int (*event)(struct hid_device *hdev, struct hid_field *field, | 627 | int (*event)(struct hid_device *hdev, struct hid_field *field, |
| 626 | struct hid_usage *usage, __s32 value); | 628 | struct hid_usage *usage, __s32 value); |
| 627 | 629 | ||
| 628 | void (*report_fixup)(struct hid_device *hdev, __u8 *buf, | 630 | __u8 *(*report_fixup)(struct hid_device *hdev, __u8 *buf, |
| 629 | unsigned int size); | 631 | unsigned int *size); |
| 630 | 632 | ||
| 631 | int (*input_mapping)(struct hid_device *hdev, | 633 | int (*input_mapping)(struct hid_device *hdev, |
| 632 | struct hid_input *hidinput, struct hid_field *field, | 634 | struct hid_input *hidinput, struct hid_field *field, |
diff --git a/include/linux/hiddev.h b/include/linux/hiddev.h index bb6f58baf319..a3f481a3063b 100644 --- a/include/linux/hiddev.h +++ b/include/linux/hiddev.h | |||
| @@ -226,8 +226,6 @@ void hiddev_disconnect(struct hid_device *); | |||
| 226 | void hiddev_hid_event(struct hid_device *hid, struct hid_field *field, | 226 | void hiddev_hid_event(struct hid_device *hid, struct hid_field *field, |
| 227 | struct hid_usage *usage, __s32 value); | 227 | struct hid_usage *usage, __s32 value); |
| 228 | void hiddev_report_event(struct hid_device *hid, struct hid_report *report); | 228 | void hiddev_report_event(struct hid_device *hid, struct hid_report *report); |
| 229 | int __init hiddev_init(void); | ||
| 230 | void hiddev_exit(void); | ||
| 231 | #else | 229 | #else |
| 232 | static inline int hiddev_connect(struct hid_device *hid, | 230 | static inline int hiddev_connect(struct hid_device *hid, |
| 233 | unsigned int force) | 231 | unsigned int force) |
| @@ -236,8 +234,6 @@ static inline void hiddev_disconnect(struct hid_device *hid) { } | |||
| 236 | static inline void hiddev_hid_event(struct hid_device *hid, struct hid_field *field, | 234 | static inline void hiddev_hid_event(struct hid_device *hid, struct hid_field *field, |
| 237 | struct hid_usage *usage, __s32 value) { } | 235 | struct hid_usage *usage, __s32 value) { } |
| 238 | static inline void hiddev_report_event(struct hid_device *hid, struct hid_report *report) { } | 236 | static inline void hiddev_report_event(struct hid_device *hid, struct hid_report *report) { } |
| 239 | static inline int hiddev_init(void) { return 0; } | ||
| 240 | static inline void hiddev_exit(void) { } | ||
| 241 | #endif | 237 | #endif |
| 242 | 238 | ||
| 243 | #endif | 239 | #endif |
diff --git a/include/linux/highmem.h b/include/linux/highmem.h index caafd0561aa1..e9138198e823 100644 --- a/include/linux/highmem.h +++ b/include/linux/highmem.h | |||
| @@ -2,6 +2,7 @@ | |||
| 2 | #define _LINUX_HIGHMEM_H | 2 | #define _LINUX_HIGHMEM_H |
| 3 | 3 | ||
| 4 | #include <linux/fs.h> | 4 | #include <linux/fs.h> |
| 5 | #include <linux/kernel.h> | ||
| 5 | #include <linux/mm.h> | 6 | #include <linux/mm.h> |
| 6 | #include <linux/uaccess.h> | 7 | #include <linux/uaccess.h> |
| 7 | 8 | ||
| @@ -27,18 +28,6 @@ static inline void invalidate_kernel_vmap_range(void *vaddr, int size) | |||
| 27 | 28 | ||
| 28 | #include <asm/kmap_types.h> | 29 | #include <asm/kmap_types.h> |
| 29 | 30 | ||
| 30 | #ifdef CONFIG_DEBUG_HIGHMEM | ||
| 31 | |||
| 32 | void debug_kmap_atomic(enum km_type type); | ||
| 33 | |||
| 34 | #else | ||
| 35 | |||
| 36 | static inline void debug_kmap_atomic(enum km_type type) | ||
| 37 | { | ||
| 38 | } | ||
| 39 | |||
| 40 | #endif | ||
| 41 | |||
| 42 | #ifdef CONFIG_HIGHMEM | 31 | #ifdef CONFIG_HIGHMEM |
| 43 | #include <asm/highmem.h> | 32 | #include <asm/highmem.h> |
| 44 | 33 | ||
| @@ -65,15 +54,19 @@ static inline void kunmap(struct page *page) | |||
| 65 | { | 54 | { |
| 66 | } | 55 | } |
| 67 | 56 | ||
| 68 | static inline void *kmap_atomic(struct page *page, enum km_type idx) | 57 | static inline void *__kmap_atomic(struct page *page) |
| 69 | { | 58 | { |
| 70 | pagefault_disable(); | 59 | pagefault_disable(); |
| 71 | return page_address(page); | 60 | return page_address(page); |
| 72 | } | 61 | } |
| 73 | #define kmap_atomic_prot(page, idx, prot) kmap_atomic(page, idx) | 62 | #define kmap_atomic_prot(page, prot) __kmap_atomic(page) |
| 74 | 63 | ||
| 75 | #define kunmap_atomic(addr, idx) do { pagefault_enable(); } while (0) | 64 | static inline void __kunmap_atomic(void *addr) |
| 76 | #define kmap_atomic_pfn(pfn, idx) kmap_atomic(pfn_to_page(pfn), (idx)) | 65 | { |
| 66 | pagefault_enable(); | ||
| 67 | } | ||
| 68 | |||
| 69 | #define kmap_atomic_pfn(pfn) kmap_atomic(pfn_to_page(pfn)) | ||
| 77 | #define kmap_atomic_to_page(ptr) virt_to_page(ptr) | 70 | #define kmap_atomic_to_page(ptr) virt_to_page(ptr) |
| 78 | 71 | ||
| 79 | #define kmap_flush_unused() do {} while(0) | 72 | #define kmap_flush_unused() do {} while(0) |
| @@ -81,6 +74,51 @@ static inline void *kmap_atomic(struct page *page, enum km_type idx) | |||
| 81 | 74 | ||
| 82 | #endif /* CONFIG_HIGHMEM */ | 75 | #endif /* CONFIG_HIGHMEM */ |
| 83 | 76 | ||
| 77 | #if defined(CONFIG_HIGHMEM) || defined(CONFIG_X86_32) | ||
| 78 | |||
| 79 | DECLARE_PER_CPU(int, __kmap_atomic_idx); | ||
| 80 | |||
| 81 | static inline int kmap_atomic_idx_push(void) | ||
| 82 | { | ||
| 83 | int idx = __get_cpu_var(__kmap_atomic_idx)++; | ||
| 84 | #ifdef CONFIG_DEBUG_HIGHMEM | ||
| 85 | WARN_ON_ONCE(in_irq() && !irqs_disabled()); | ||
| 86 | BUG_ON(idx > KM_TYPE_NR); | ||
| 87 | #endif | ||
| 88 | return idx; | ||
| 89 | } | ||
| 90 | |||
| 91 | static inline int kmap_atomic_idx(void) | ||
| 92 | { | ||
| 93 | return __get_cpu_var(__kmap_atomic_idx) - 1; | ||
| 94 | } | ||
| 95 | |||
| 96 | static inline int kmap_atomic_idx_pop(void) | ||
| 97 | { | ||
| 98 | int idx = --__get_cpu_var(__kmap_atomic_idx); | ||
| 99 | #ifdef CONFIG_DEBUG_HIGHMEM | ||
| 100 | BUG_ON(idx < 0); | ||
| 101 | #endif | ||
| 102 | return idx; | ||
| 103 | } | ||
| 104 | |||
| 105 | #endif | ||
| 106 | |||
| 107 | /* | ||
| 108 | * Make both: kmap_atomic(page, idx) and kmap_atomic(page) work. | ||
| 109 | */ | ||
| 110 | #define kmap_atomic(page, args...) __kmap_atomic(page) | ||
| 111 | |||
| 112 | /* | ||
| 113 | * Prevent people trying to call kunmap_atomic() as if it were kunmap() | ||
| 114 | * kunmap_atomic() should get the return value of kmap_atomic, not the page. | ||
| 115 | */ | ||
| 116 | #define kunmap_atomic(addr, args...) \ | ||
| 117 | do { \ | ||
| 118 | BUILD_BUG_ON(__same_type((addr), struct page *)); \ | ||
| 119 | __kunmap_atomic(addr); \ | ||
| 120 | } while (0) | ||
| 121 | |||
| 84 | /* when CONFIG_HIGHMEM is not set these will be plain clear/copy_page */ | 122 | /* when CONFIG_HIGHMEM is not set these will be plain clear/copy_page */ |
| 85 | #ifndef clear_user_highpage | 123 | #ifndef clear_user_highpage |
| 86 | static inline void clear_user_highpage(struct page *page, unsigned long vaddr) | 124 | static inline void clear_user_highpage(struct page *page, unsigned long vaddr) |
| @@ -189,8 +227,8 @@ static inline void copy_user_highpage(struct page *to, struct page *from, | |||
| 189 | vfrom = kmap_atomic(from, KM_USER0); | 227 | vfrom = kmap_atomic(from, KM_USER0); |
| 190 | vto = kmap_atomic(to, KM_USER1); | 228 | vto = kmap_atomic(to, KM_USER1); |
| 191 | copy_user_page(vto, vfrom, vaddr, to); | 229 | copy_user_page(vto, vfrom, vaddr, to); |
| 192 | kunmap_atomic(vfrom, KM_USER0); | ||
| 193 | kunmap_atomic(vto, KM_USER1); | 230 | kunmap_atomic(vto, KM_USER1); |
| 231 | kunmap_atomic(vfrom, KM_USER0); | ||
| 194 | } | 232 | } |
| 195 | 233 | ||
| 196 | #endif | 234 | #endif |
| @@ -202,8 +240,8 @@ static inline void copy_highpage(struct page *to, struct page *from) | |||
| 202 | vfrom = kmap_atomic(from, KM_USER0); | 240 | vfrom = kmap_atomic(from, KM_USER0); |
| 203 | vto = kmap_atomic(to, KM_USER1); | 241 | vto = kmap_atomic(to, KM_USER1); |
| 204 | copy_page(vto, vfrom); | 242 | copy_page(vto, vfrom); |
| 205 | kunmap_atomic(vfrom, KM_USER0); | ||
| 206 | kunmap_atomic(vto, KM_USER1); | 243 | kunmap_atomic(vto, KM_USER1); |
| 244 | kunmap_atomic(vfrom, KM_USER0); | ||
| 207 | } | 245 | } |
| 208 | 246 | ||
| 209 | #endif /* _LINUX_HIGHMEM_H */ | 247 | #endif /* _LINUX_HIGHMEM_H */ |
diff --git a/include/linux/htirq.h b/include/linux/htirq.h index c96ea46737d0..70a1dbbf2093 100644 --- a/include/linux/htirq.h +++ b/include/linux/htirq.h | |||
| @@ -9,8 +9,9 @@ struct ht_irq_msg { | |||
| 9 | /* Helper functions.. */ | 9 | /* Helper functions.. */ |
| 10 | void fetch_ht_irq_msg(unsigned int irq, struct ht_irq_msg *msg); | 10 | void fetch_ht_irq_msg(unsigned int irq, struct ht_irq_msg *msg); |
| 11 | void write_ht_irq_msg(unsigned int irq, struct ht_irq_msg *msg); | 11 | void write_ht_irq_msg(unsigned int irq, struct ht_irq_msg *msg); |
| 12 | void mask_ht_irq(unsigned int irq); | 12 | struct irq_data; |
| 13 | void unmask_ht_irq(unsigned int irq); | 13 | void mask_ht_irq(struct irq_data *data); |
| 14 | void unmask_ht_irq(struct irq_data *data); | ||
| 14 | 15 | ||
| 15 | /* The arch hook for getting things started */ | 16 | /* The arch hook for getting things started */ |
| 16 | int arch_setup_ht_irq(unsigned int irq, struct pci_dev *dev); | 17 | int arch_setup_ht_irq(unsigned int irq, struct pci_dev *dev); |
diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h index 78b4bc64c006..943c76b3d4bb 100644 --- a/include/linux/hugetlb.h +++ b/include/linux/hugetlb.h | |||
| @@ -2,6 +2,7 @@ | |||
| 2 | #define _LINUX_HUGETLB_H | 2 | #define _LINUX_HUGETLB_H |
| 3 | 3 | ||
| 4 | #include <linux/fs.h> | 4 | #include <linux/fs.h> |
| 5 | #include <linux/hugetlb_inline.h> | ||
| 5 | 6 | ||
| 6 | struct ctl_table; | 7 | struct ctl_table; |
| 7 | struct user_struct; | 8 | struct user_struct; |
| @@ -14,11 +15,6 @@ struct user_struct; | |||
| 14 | 15 | ||
| 15 | int PageHuge(struct page *page); | 16 | int PageHuge(struct page *page); |
| 16 | 17 | ||
| 17 | static inline int is_vm_hugetlb_page(struct vm_area_struct *vma) | ||
| 18 | { | ||
| 19 | return vma->vm_flags & VM_HUGETLB; | ||
| 20 | } | ||
| 21 | |||
| 22 | void reset_vma_resv_huge_pages(struct vm_area_struct *vma); | 18 | void reset_vma_resv_huge_pages(struct vm_area_struct *vma); |
| 23 | int hugetlb_sysctl_handler(struct ctl_table *, int, void __user *, size_t *, loff_t *); | 19 | int hugetlb_sysctl_handler(struct ctl_table *, int, void __user *, size_t *, loff_t *); |
| 24 | int hugetlb_overcommit_handler(struct ctl_table *, int, void __user *, size_t *, loff_t *); | 20 | int hugetlb_overcommit_handler(struct ctl_table *, int, void __user *, size_t *, loff_t *); |
| @@ -47,6 +43,8 @@ int hugetlb_reserve_pages(struct inode *inode, long from, long to, | |||
| 47 | struct vm_area_struct *vma, | 43 | struct vm_area_struct *vma, |
| 48 | int acctflags); | 44 | int acctflags); |
| 49 | void hugetlb_unreserve_pages(struct inode *inode, long offset, long freed); | 45 | void hugetlb_unreserve_pages(struct inode *inode, long offset, long freed); |
| 46 | int dequeue_hwpoisoned_huge_page(struct page *page); | ||
| 47 | void copy_huge_page(struct page *dst, struct page *src); | ||
| 50 | 48 | ||
| 51 | extern unsigned long hugepages_treat_as_movable; | 49 | extern unsigned long hugepages_treat_as_movable; |
| 52 | extern const unsigned long hugetlb_zero, hugetlb_infinity; | 50 | extern const unsigned long hugetlb_zero, hugetlb_infinity; |
| @@ -77,11 +75,6 @@ static inline int PageHuge(struct page *page) | |||
| 77 | return 0; | 75 | return 0; |
| 78 | } | 76 | } |
| 79 | 77 | ||
| 80 | static inline int is_vm_hugetlb_page(struct vm_area_struct *vma) | ||
| 81 | { | ||
| 82 | return 0; | ||
| 83 | } | ||
| 84 | |||
| 85 | static inline void reset_vma_resv_huge_pages(struct vm_area_struct *vma) | 78 | static inline void reset_vma_resv_huge_pages(struct vm_area_struct *vma) |
| 86 | { | 79 | { |
| 87 | } | 80 | } |
| @@ -108,6 +101,11 @@ static inline void hugetlb_report_meminfo(struct seq_file *m) | |||
| 108 | #define is_hugepage_only_range(mm, addr, len) 0 | 101 | #define is_hugepage_only_range(mm, addr, len) 0 |
| 109 | #define hugetlb_free_pgd_range(tlb, addr, end, floor, ceiling) ({BUG(); 0; }) | 102 | #define hugetlb_free_pgd_range(tlb, addr, end, floor, ceiling) ({BUG(); 0; }) |
| 110 | #define hugetlb_fault(mm, vma, addr, flags) ({ BUG(); 0; }) | 103 | #define hugetlb_fault(mm, vma, addr, flags) ({ BUG(); 0; }) |
| 104 | #define huge_pte_offset(mm, address) 0 | ||
| 105 | #define dequeue_hwpoisoned_huge_page(page) 0 | ||
| 106 | static inline void copy_huge_page(struct page *dst, struct page *src) | ||
| 107 | { | ||
| 108 | } | ||
| 111 | 109 | ||
| 112 | #define hugetlb_change_protection(vma, address, end, newprot) | 110 | #define hugetlb_change_protection(vma, address, end, newprot) |
| 113 | 111 | ||
| @@ -234,6 +232,8 @@ struct huge_bootmem_page { | |||
| 234 | struct hstate *hstate; | 232 | struct hstate *hstate; |
| 235 | }; | 233 | }; |
| 236 | 234 | ||
| 235 | struct page *alloc_huge_page_node(struct hstate *h, int nid); | ||
| 236 | |||
| 237 | /* arch callback */ | 237 | /* arch callback */ |
| 238 | int __init alloc_bootmem_huge_page(struct hstate *h); | 238 | int __init alloc_bootmem_huge_page(struct hstate *h); |
| 239 | 239 | ||
| @@ -307,8 +307,14 @@ static inline struct hstate *page_hstate(struct page *page) | |||
| 307 | return size_to_hstate(PAGE_SIZE << compound_order(page)); | 307 | return size_to_hstate(PAGE_SIZE << compound_order(page)); |
| 308 | } | 308 | } |
| 309 | 309 | ||
| 310 | static inline unsigned hstate_index_to_shift(unsigned index) | ||
| 311 | { | ||
| 312 | return hstates[index].order + PAGE_SHIFT; | ||
| 313 | } | ||
| 314 | |||
| 310 | #else | 315 | #else |
| 311 | struct hstate {}; | 316 | struct hstate {}; |
| 317 | #define alloc_huge_page_node(h, nid) NULL | ||
| 312 | #define alloc_bootmem_huge_page(h) NULL | 318 | #define alloc_bootmem_huge_page(h) NULL |
| 313 | #define hstate_file(f) NULL | 319 | #define hstate_file(f) NULL |
| 314 | #define hstate_vma(v) NULL | 320 | #define hstate_vma(v) NULL |
| @@ -323,6 +329,7 @@ static inline unsigned int pages_per_huge_page(struct hstate *h) | |||
| 323 | { | 329 | { |
| 324 | return 1; | 330 | return 1; |
| 325 | } | 331 | } |
| 332 | #define hstate_index_to_shift(index) 0 | ||
| 326 | #endif | 333 | #endif |
| 327 | 334 | ||
| 328 | #endif /* _LINUX_HUGETLB_H */ | 335 | #endif /* _LINUX_HUGETLB_H */ |
diff --git a/include/linux/hugetlb_inline.h b/include/linux/hugetlb_inline.h new file mode 100644 index 000000000000..6931489a5c14 --- /dev/null +++ b/include/linux/hugetlb_inline.h | |||
| @@ -0,0 +1,22 @@ | |||
| 1 | #ifndef _LINUX_HUGETLB_INLINE_H | ||
| 2 | #define _LINUX_HUGETLB_INLINE_H | ||
| 3 | |||
| 4 | #ifdef CONFIG_HUGETLB_PAGE | ||
| 5 | |||
| 6 | #include <linux/mm.h> | ||
| 7 | |||
| 8 | static inline int is_vm_hugetlb_page(struct vm_area_struct *vma) | ||
| 9 | { | ||
| 10 | return vma->vm_flags & VM_HUGETLB; | ||
| 11 | } | ||
| 12 | |||
| 13 | #else | ||
| 14 | |||
| 15 | static inline int is_vm_hugetlb_page(struct vm_area_struct *vma) | ||
| 16 | { | ||
| 17 | return 0; | ||
| 18 | } | ||
| 19 | |||
| 20 | #endif | ||
| 21 | |||
| 22 | #endif | ||
diff --git a/include/linux/i2c-mux.h b/include/linux/i2c-mux.h new file mode 100644 index 000000000000..34536effd652 --- /dev/null +++ b/include/linux/i2c-mux.h | |||
| @@ -0,0 +1,46 @@ | |||
| 1 | /* | ||
| 2 | * | ||
| 3 | * i2c-mux.h - functions for the i2c-bus mux support | ||
| 4 | * | ||
| 5 | * Copyright (c) 2008-2009 Rodolfo Giometti <giometti@linux.it> | ||
| 6 | * Copyright (c) 2008-2009 Eurotech S.p.A. <info@eurotech.it> | ||
| 7 | * Michael Lawnick <michael.lawnick.ext@nsn.com> | ||
| 8 | * | ||
| 9 | * This program is free software; you can redistribute it and/or modify | ||
| 10 | * it under the terms of the GNU General Public License as published by | ||
| 11 | * the Free Software Foundation; either version 2 of the License, or | ||
| 12 | * (at your option) any later version. | ||
| 13 | * | ||
| 14 | * This program is distributed in the hope that it will be useful, | ||
| 15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 17 | * GNU General Public License for more details. | ||
| 18 | * | ||
| 19 | * You should have received a copy of the GNU General Public License | ||
| 20 | * along with this program; if not, write to the Free Software | ||
| 21 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
| 22 | */ | ||
| 23 | |||
| 24 | #ifndef _LINUX_I2C_MUX_H | ||
| 25 | #define _LINUX_I2C_MUX_H | ||
| 26 | |||
| 27 | #ifdef __KERNEL__ | ||
| 28 | |||
| 29 | /* | ||
| 30 | * Called to create a i2c bus on a multiplexed bus segment. | ||
| 31 | * The mux_dev and chan_id parameters are passed to the select | ||
| 32 | * and deselect callback functions to perform hardware-specific | ||
| 33 | * mux control. | ||
| 34 | */ | ||
| 35 | struct i2c_adapter *i2c_add_mux_adapter(struct i2c_adapter *parent, | ||
| 36 | void *mux_dev, u32 force_nr, u32 chan_id, | ||
| 37 | int (*select) (struct i2c_adapter *, | ||
| 38 | void *mux_dev, u32 chan_id), | ||
| 39 | int (*deselect) (struct i2c_adapter *, | ||
| 40 | void *mux_dev, u32 chan_id)); | ||
| 41 | |||
| 42 | int i2c_del_mux_adapter(struct i2c_adapter *adap); | ||
| 43 | |||
| 44 | #endif /* __KERNEL__ */ | ||
| 45 | |||
| 46 | #endif /* _LINUX_I2C_MUX_H */ | ||
diff --git a/include/linux/i2c.h b/include/linux/i2c.h index 21067b418536..1f66fa06a97c 100644 --- a/include/linux/i2c.h +++ b/include/linux/i2c.h | |||
| @@ -37,6 +37,7 @@ | |||
| 37 | #include <linux/of.h> /* for struct device_node */ | 37 | #include <linux/of.h> /* for struct device_node */ |
| 38 | 38 | ||
| 39 | extern struct bus_type i2c_bus_type; | 39 | extern struct bus_type i2c_bus_type; |
| 40 | extern struct device_type i2c_adapter_type; | ||
| 40 | 41 | ||
| 41 | /* --- General options ------------------------------------------------ */ | 42 | /* --- General options ------------------------------------------------ */ |
| 42 | 43 | ||
| @@ -108,6 +109,7 @@ extern s32 i2c_smbus_write_i2c_block_data(struct i2c_client *client, | |||
| 108 | * @shutdown: Callback for device shutdown | 109 | * @shutdown: Callback for device shutdown |
| 109 | * @suspend: Callback for device suspend | 110 | * @suspend: Callback for device suspend |
| 110 | * @resume: Callback for device resume | 111 | * @resume: Callback for device resume |
| 112 | * @alert: Alert callback, for example for the SMBus alert protocol | ||
| 111 | * @command: Callback for bus-wide signaling (optional) | 113 | * @command: Callback for bus-wide signaling (optional) |
| 112 | * @driver: Device driver model driver | 114 | * @driver: Device driver model driver |
| 113 | * @id_table: List of I2C devices supported by this driver | 115 | * @id_table: List of I2C devices supported by this driver |
| @@ -233,6 +235,7 @@ static inline void i2c_set_clientdata(struct i2c_client *dev, void *data) | |||
| 233 | * @addr: stored in i2c_client.addr | 235 | * @addr: stored in i2c_client.addr |
| 234 | * @platform_data: stored in i2c_client.dev.platform_data | 236 | * @platform_data: stored in i2c_client.dev.platform_data |
| 235 | * @archdata: copied into i2c_client.dev.archdata | 237 | * @archdata: copied into i2c_client.dev.archdata |
| 238 | * @of_node: pointer to OpenFirmware device node | ||
| 236 | * @irq: stored in i2c_client.irq | 239 | * @irq: stored in i2c_client.irq |
| 237 | * | 240 | * |
| 238 | * I2C doesn't actually support hardware probing, although controllers and | 241 | * I2C doesn't actually support hardware probing, although controllers and |
| @@ -282,12 +285,18 @@ i2c_new_device(struct i2c_adapter *adap, struct i2c_board_info const *info); | |||
| 282 | 285 | ||
| 283 | /* If you don't know the exact address of an I2C device, use this variant | 286 | /* If you don't know the exact address of an I2C device, use this variant |
| 284 | * instead, which can probe for device presence in a list of possible | 287 | * instead, which can probe for device presence in a list of possible |
| 285 | * addresses. | 288 | * addresses. The "probe" callback function is optional. If it is provided, |
| 289 | * it must return 1 on successful probe, 0 otherwise. If it is not provided, | ||
| 290 | * a default probing method is used. | ||
| 286 | */ | 291 | */ |
| 287 | extern struct i2c_client * | 292 | extern struct i2c_client * |
| 288 | i2c_new_probed_device(struct i2c_adapter *adap, | 293 | i2c_new_probed_device(struct i2c_adapter *adap, |
| 289 | struct i2c_board_info *info, | 294 | struct i2c_board_info *info, |
| 290 | unsigned short const *addr_list); | 295 | unsigned short const *addr_list, |
| 296 | int (*probe)(struct i2c_adapter *, unsigned short addr)); | ||
| 297 | |||
| 298 | /* Common custom probe functions */ | ||
| 299 | extern int i2c_probe_func_quick_read(struct i2c_adapter *, unsigned short addr); | ||
| 291 | 300 | ||
| 292 | /* For devices that use several addresses, use i2c_new_dummy() to make | 301 | /* For devices that use several addresses, use i2c_new_dummy() to make |
| 293 | * client handles for the extra addresses. | 302 | * client handles for the extra addresses. |
| @@ -360,6 +369,7 @@ struct i2c_adapter { | |||
| 360 | char name[48]; | 369 | char name[48]; |
| 361 | struct completion dev_released; | 370 | struct completion dev_released; |
| 362 | 371 | ||
| 372 | struct mutex userspace_clients_lock; | ||
| 363 | struct list_head userspace_clients; | 373 | struct list_head userspace_clients; |
| 364 | }; | 374 | }; |
| 365 | #define to_i2c_adapter(d) container_of(d, struct i2c_adapter, dev) | 375 | #define to_i2c_adapter(d) container_of(d, struct i2c_adapter, dev) |
| @@ -374,24 +384,21 @@ static inline void i2c_set_adapdata(struct i2c_adapter *dev, void *data) | |||
| 374 | dev_set_drvdata(&dev->dev, data); | 384 | dev_set_drvdata(&dev->dev, data); |
| 375 | } | 385 | } |
| 376 | 386 | ||
| 377 | /** | 387 | static inline struct i2c_adapter * |
| 378 | * i2c_lock_adapter - Prevent access to an I2C bus segment | 388 | i2c_parent_is_i2c_adapter(const struct i2c_adapter *adapter) |
| 379 | * @adapter: Target I2C bus segment | ||
| 380 | */ | ||
| 381 | static inline void i2c_lock_adapter(struct i2c_adapter *adapter) | ||
| 382 | { | 389 | { |
| 383 | rt_mutex_lock(&adapter->bus_lock); | 390 | struct device *parent = adapter->dev.parent; |
| 384 | } | ||
| 385 | 391 | ||
| 386 | /** | 392 | if (parent != NULL && parent->type == &i2c_adapter_type) |
| 387 | * i2c_unlock_adapter - Reauthorize access to an I2C bus segment | 393 | return to_i2c_adapter(parent); |
| 388 | * @adapter: Target I2C bus segment | 394 | else |
| 389 | */ | 395 | return NULL; |
| 390 | static inline void i2c_unlock_adapter(struct i2c_adapter *adapter) | ||
| 391 | { | ||
| 392 | rt_mutex_unlock(&adapter->bus_lock); | ||
| 393 | } | 396 | } |
| 394 | 397 | ||
| 398 | /* Adapter locking functions, exported for shared pin cases */ | ||
| 399 | void i2c_lock_adapter(struct i2c_adapter *); | ||
| 400 | void i2c_unlock_adapter(struct i2c_adapter *); | ||
| 401 | |||
| 395 | /*flags for the client struct: */ | 402 | /*flags for the client struct: */ |
| 396 | #define I2C_CLIENT_PEC 0x04 /* Use Packet Error Checking */ | 403 | #define I2C_CLIENT_PEC 0x04 /* Use Packet Error Checking */ |
| 397 | #define I2C_CLIENT_TEN 0x10 /* we have a ten bit chip address */ | 404 | #define I2C_CLIENT_TEN 0x10 /* we have a ten bit chip address */ |
diff --git a/include/linux/i2c/adp5588.h b/include/linux/i2c/adp5588.h index 02c9af374741..3c5d6b6e765c 100644 --- a/include/linux/i2c/adp5588.h +++ b/include/linux/i2c/adp5588.h | |||
| @@ -74,10 +74,58 @@ | |||
| 74 | 74 | ||
| 75 | #define ADP5588_DEVICE_ID_MASK 0xF | 75 | #define ADP5588_DEVICE_ID_MASK 0xF |
| 76 | 76 | ||
| 77 | /* Configuration Register1 */ | ||
| 78 | #define ADP5588_AUTO_INC (1 << 7) | ||
| 79 | #define ADP5588_GPIEM_CFG (1 << 6) | ||
| 80 | #define ADP5588_INT_CFG (1 << 4) | ||
| 81 | #define ADP5588_GPI_IEN (1 << 1) | ||
| 82 | |||
| 83 | /* Interrupt Status Register */ | ||
| 84 | #define ADP5588_GPI_INT (1 << 1) | ||
| 85 | #define ADP5588_KE_INT (1 << 0) | ||
| 86 | |||
| 87 | #define ADP5588_MAXGPIO 18 | ||
| 88 | #define ADP5588_BANK(offs) ((offs) >> 3) | ||
| 89 | #define ADP5588_BIT(offs) (1u << ((offs) & 0x7)) | ||
| 90 | |||
| 77 | /* Put one of these structures in i2c_board_info platform_data */ | 91 | /* Put one of these structures in i2c_board_info platform_data */ |
| 78 | 92 | ||
| 79 | #define ADP5588_KEYMAPSIZE 80 | 93 | #define ADP5588_KEYMAPSIZE 80 |
| 80 | 94 | ||
| 95 | #define GPI_PIN_ROW0 97 | ||
| 96 | #define GPI_PIN_ROW1 98 | ||
| 97 | #define GPI_PIN_ROW2 99 | ||
| 98 | #define GPI_PIN_ROW3 100 | ||
| 99 | #define GPI_PIN_ROW4 101 | ||
| 100 | #define GPI_PIN_ROW5 102 | ||
| 101 | #define GPI_PIN_ROW6 103 | ||
| 102 | #define GPI_PIN_ROW7 104 | ||
| 103 | #define GPI_PIN_COL0 105 | ||
| 104 | #define GPI_PIN_COL1 106 | ||
| 105 | #define GPI_PIN_COL2 107 | ||
| 106 | #define GPI_PIN_COL3 108 | ||
| 107 | #define GPI_PIN_COL4 109 | ||
| 108 | #define GPI_PIN_COL5 110 | ||
| 109 | #define GPI_PIN_COL6 111 | ||
| 110 | #define GPI_PIN_COL7 112 | ||
| 111 | #define GPI_PIN_COL8 113 | ||
| 112 | #define GPI_PIN_COL9 114 | ||
| 113 | |||
| 114 | #define GPI_PIN_ROW_BASE GPI_PIN_ROW0 | ||
| 115 | #define GPI_PIN_ROW_END GPI_PIN_ROW7 | ||
| 116 | #define GPI_PIN_COL_BASE GPI_PIN_COL0 | ||
| 117 | #define GPI_PIN_COL_END GPI_PIN_COL9 | ||
| 118 | |||
| 119 | #define GPI_PIN_BASE GPI_PIN_ROW_BASE | ||
| 120 | #define GPI_PIN_END GPI_PIN_COL_END | ||
| 121 | |||
| 122 | #define ADP5588_GPIMAPSIZE_MAX (GPI_PIN_END - GPI_PIN_BASE + 1) | ||
| 123 | |||
| 124 | struct adp5588_gpi_map { | ||
| 125 | unsigned short pin; | ||
| 126 | unsigned short sw_evt; | ||
| 127 | }; | ||
| 128 | |||
| 81 | struct adp5588_kpad_platform_data { | 129 | struct adp5588_kpad_platform_data { |
| 82 | int rows; /* Number of rows */ | 130 | int rows; /* Number of rows */ |
| 83 | int cols; /* Number of columns */ | 131 | int cols; /* Number of columns */ |
| @@ -87,11 +135,17 @@ struct adp5588_kpad_platform_data { | |||
| 87 | unsigned en_keylock:1; /* Enable Key Lock feature */ | 135 | unsigned en_keylock:1; /* Enable Key Lock feature */ |
| 88 | unsigned short unlock_key1; /* Unlock Key 1 */ | 136 | unsigned short unlock_key1; /* Unlock Key 1 */ |
| 89 | unsigned short unlock_key2; /* Unlock Key 2 */ | 137 | unsigned short unlock_key2; /* Unlock Key 2 */ |
| 138 | const struct adp5588_gpi_map *gpimap; | ||
| 139 | unsigned short gpimapsize; | ||
| 140 | const struct adp5588_gpio_platform_data *gpio_data; | ||
| 90 | }; | 141 | }; |
| 91 | 142 | ||
| 143 | struct i2c_client; /* forward declaration */ | ||
| 144 | |||
| 92 | struct adp5588_gpio_platform_data { | 145 | struct adp5588_gpio_platform_data { |
| 93 | unsigned gpio_start; /* GPIO Chip base # */ | 146 | int gpio_start; /* GPIO Chip base # */ |
| 94 | unsigned pullup_dis_mask; /* Pull-Up Disable Mask */ | 147 | unsigned irq_base; /* interrupt base # */ |
| 148 | unsigned pullup_dis_mask; /* Pull-Up Disable Mask */ | ||
| 95 | int (*setup)(struct i2c_client *client, | 149 | int (*setup)(struct i2c_client *client, |
| 96 | int gpio, unsigned ngpio, | 150 | int gpio, unsigned ngpio, |
| 97 | void *context); | 151 | void *context); |
diff --git a/include/linux/i2c/apds990x.h b/include/linux/i2c/apds990x.h new file mode 100644 index 000000000000..d186fcc5d257 --- /dev/null +++ b/include/linux/i2c/apds990x.h | |||
| @@ -0,0 +1,79 @@ | |||
| 1 | /* | ||
| 2 | * This file is part of the APDS990x sensor driver. | ||
| 3 | * Chip is combined proximity and ambient light sensor. | ||
| 4 | * | ||
| 5 | * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). | ||
| 6 | * | ||
| 7 | * Contact: Samu Onkalo <samu.p.onkalo@nokia.com> | ||
| 8 | * | ||
| 9 | * This program is free software; you can redistribute it and/or | ||
| 10 | * modify it under the terms of the GNU General Public License | ||
| 11 | * version 2 as published by the Free Software Foundation. | ||
| 12 | * | ||
| 13 | * This program is distributed in the hope that it will be useful, but | ||
| 14 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
| 16 | * General Public License for more details. | ||
| 17 | * | ||
| 18 | * You should have received a copy of the GNU General Public License | ||
| 19 | * along with this program; if not, write to the Free Software | ||
| 20 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA | ||
| 21 | * 02110-1301 USA | ||
| 22 | * | ||
| 23 | */ | ||
| 24 | |||
| 25 | #ifndef __APDS990X_H__ | ||
| 26 | #define __APDS990X_H__ | ||
| 27 | |||
| 28 | |||
| 29 | #define APDS_IRLED_CURR_12mA 0x3 | ||
| 30 | #define APDS_IRLED_CURR_25mA 0x2 | ||
| 31 | #define APDS_IRLED_CURR_50mA 0x1 | ||
| 32 | #define APDS_IRLED_CURR_100mA 0x0 | ||
| 33 | |||
| 34 | /** | ||
| 35 | * struct apds990x_chip_factors - defines effect of the cover window | ||
| 36 | * @ga: Total glass attenuation | ||
| 37 | * @cf1: clear channel factor 1 for raw to lux conversion | ||
| 38 | * @irf1: IR channel factor 1 for raw to lux conversion | ||
| 39 | * @cf2: clear channel factor 2 for raw to lux conversion | ||
| 40 | * @irf2: IR channel factor 2 for raw to lux conversion | ||
| 41 | * @df: device factor for conversion formulas | ||
| 42 | * | ||
| 43 | * Structure for tuning ALS calculation to match with environment. | ||
| 44 | * Values depend on the material above the sensor and the sensor | ||
| 45 | * itself. If the GA is zero, driver will use uncovered sensor default values | ||
| 46 | * format: decimal value * APDS_PARAM_SCALE except df which is plain integer. | ||
| 47 | */ | ||
| 48 | #define APDS_PARAM_SCALE 4096 | ||
| 49 | struct apds990x_chip_factors { | ||
| 50 | int ga; | ||
| 51 | int cf1; | ||
| 52 | int irf1; | ||
| 53 | int cf2; | ||
| 54 | int irf2; | ||
| 55 | int df; | ||
| 56 | }; | ||
| 57 | |||
| 58 | /** | ||
| 59 | * struct apds990x_platform_data - platform data for apsd990x.c driver | ||
| 60 | * @cf: chip factor data | ||
| 61 | * @pddrive: IR-led driving current | ||
| 62 | * @ppcount: number of IR pulses used for proximity estimation | ||
| 63 | * @setup_resources: interrupt line setup call back function | ||
| 64 | * @release_resources: interrupt line release call back function | ||
| 65 | * | ||
| 66 | * Proximity detection result depends heavily on correct ppcount, pdrive | ||
| 67 | * and cover window. | ||
| 68 | * | ||
| 69 | */ | ||
| 70 | |||
| 71 | struct apds990x_platform_data { | ||
| 72 | struct apds990x_chip_factors cf; | ||
| 73 | u8 pdrive; | ||
| 74 | u8 ppcount; | ||
| 75 | int (*setup_resources)(void); | ||
| 76 | int (*release_resources)(void); | ||
| 77 | }; | ||
| 78 | |||
| 79 | #endif | ||
diff --git a/include/linux/i2c/bh1770glc.h b/include/linux/i2c/bh1770glc.h new file mode 100644 index 000000000000..8b5e2df36c72 --- /dev/null +++ b/include/linux/i2c/bh1770glc.h | |||
| @@ -0,0 +1,53 @@ | |||
| 1 | /* | ||
| 2 | * This file is part of the ROHM BH1770GLC / OSRAM SFH7770 sensor driver. | ||
| 3 | * Chip is combined proximity and ambient light sensor. | ||
| 4 | * | ||
| 5 | * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). | ||
| 6 | * | ||
| 7 | * Contact: Samu Onkalo <samu.p.onkalo@nokia.com> | ||
| 8 | * | ||
| 9 | * This program is free software; you can redistribute it and/or | ||
| 10 | * modify it under the terms of the GNU General Public License | ||
| 11 | * version 2 as published by the Free Software Foundation. | ||
| 12 | * | ||
| 13 | * This program is distributed in the hope that it will be useful, but | ||
| 14 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
| 16 | * General Public License for more details. | ||
| 17 | * | ||
| 18 | * You should have received a copy of the GNU General Public License | ||
| 19 | * along with this program; if not, write to the Free Software | ||
| 20 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA | ||
| 21 | * 02110-1301 USA | ||
| 22 | * | ||
| 23 | */ | ||
| 24 | |||
| 25 | #ifndef __BH1770_H__ | ||
| 26 | #define __BH1770_H__ | ||
| 27 | |||
| 28 | /** | ||
| 29 | * struct bh1770_platform_data - platform data for bh1770glc driver | ||
| 30 | * @led_def_curr: IR led driving current. | ||
| 31 | * @glass_attenuation: Attenuation factor for covering window. | ||
| 32 | * @setup_resources: Call back for interrupt line setup function | ||
| 33 | * @release_resources: Call back for interrupte line release function | ||
| 34 | * | ||
| 35 | * Example of glass attenuation: 16384 * 385 / 100 means attenuation factor | ||
| 36 | * of 3.85. i.e. light_above_sensor = light_above_cover_window / 3.85 | ||
| 37 | */ | ||
| 38 | |||
| 39 | struct bh1770_platform_data { | ||
| 40 | #define BH1770_LED_5mA 0 | ||
| 41 | #define BH1770_LED_10mA 1 | ||
| 42 | #define BH1770_LED_20mA 2 | ||
| 43 | #define BH1770_LED_50mA 3 | ||
| 44 | #define BH1770_LED_100mA 4 | ||
| 45 | #define BH1770_LED_150mA 5 | ||
| 46 | #define BH1770_LED_200mA 6 | ||
| 47 | __u8 led_def_curr; | ||
| 48 | #define BH1770_NEUTRAL_GA 16384 /* 16384 / 16384 = 1 */ | ||
| 49 | __u32 glass_attenuation; | ||
| 50 | int (*setup_resources)(void); | ||
| 51 | int (*release_resources)(void); | ||
| 52 | }; | ||
| 53 | #endif | ||
diff --git a/include/linux/i2c/ltc4245.h b/include/linux/i2c/ltc4245.h new file mode 100644 index 000000000000..56bda4be0016 --- /dev/null +++ b/include/linux/i2c/ltc4245.h | |||
| @@ -0,0 +1,21 @@ | |||
| 1 | /* | ||
| 2 | * Platform Data for LTC4245 hardware monitor chip | ||
| 3 | * | ||
| 4 | * Copyright (c) 2010 Ira W. Snyder <iws@ovro.caltech.edu> | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify it | ||
| 7 | * under the terms of the GNU General Public License as published by the | ||
| 8 | * Free Software Foundation; either version 2 of the License, or (at your | ||
| 9 | * option) any later version. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #ifndef LINUX_LTC4245_H | ||
| 13 | #define LINUX_LTC4245_H | ||
| 14 | |||
| 15 | #include <linux/types.h> | ||
| 16 | |||
| 17 | struct ltc4245_platform_data { | ||
| 18 | bool use_extra_gpios; | ||
| 19 | }; | ||
| 20 | |||
| 21 | #endif /* LINUX_LTC4245_H */ | ||
diff --git a/include/linux/i2c/mcs.h b/include/linux/i2c/mcs.h new file mode 100644 index 000000000000..725ae7c313ff --- /dev/null +++ b/include/linux/i2c/mcs.h | |||
| @@ -0,0 +1,34 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2009 - 2010 Samsung Electronics Co.Ltd | ||
| 3 | * Author: Joonyoung Shim <jy0922.shim@samsung.com> | ||
| 4 | * Author: HeungJun Kim <riverful.kim@samsung.com> | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify it | ||
| 7 | * under the terms of the GNU General Public License as published by the | ||
| 8 | * Free Software Foundation; either version 2 of the License, or (at your | ||
| 9 | * option) any later version. | ||
| 10 | * | ||
| 11 | */ | ||
| 12 | |||
| 13 | #ifndef __LINUX_MCS_H | ||
| 14 | #define __LINUX_MCS_H | ||
| 15 | |||
| 16 | #define MCS_KEY_MAP(v, c) ((((v) & 0xff) << 16) | ((c) & 0xffff)) | ||
| 17 | #define MCS_KEY_VAL(v) (((v) >> 16) & 0xff) | ||
| 18 | #define MCS_KEY_CODE(v) ((v) & 0xffff) | ||
| 19 | |||
| 20 | struct mcs_platform_data { | ||
| 21 | void (*cfg_pin)(void); | ||
| 22 | |||
| 23 | /* touchscreen */ | ||
| 24 | unsigned int x_size; | ||
| 25 | unsigned int y_size; | ||
| 26 | |||
| 27 | /* touchkey */ | ||
| 28 | const u32 *keymap; | ||
| 29 | unsigned int keymap_size; | ||
| 30 | unsigned int key_maxval; | ||
| 31 | bool no_autorepeat; | ||
| 32 | }; | ||
| 33 | |||
| 34 | #endif /* __LINUX_MCS_H */ | ||
diff --git a/include/linux/i2c/mcs5000_ts.h b/include/linux/i2c/mcs5000_ts.h deleted file mode 100644 index 5a117b5ca15e..000000000000 --- a/include/linux/i2c/mcs5000_ts.h +++ /dev/null | |||
| @@ -1,24 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * mcs5000_ts.h | ||
| 3 | * | ||
| 4 | * Copyright (C) 2009 Samsung Electronics Co.Ltd | ||
| 5 | * Author: Joonyoung Shim <jy0922.shim@samsung.com> | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify it | ||
| 8 | * under the terms of the GNU General Public License as published by the | ||
| 9 | * Free Software Foundation; either version 2 of the License, or (at your | ||
| 10 | * option) any later version. | ||
| 11 | * | ||
| 12 | */ | ||
| 13 | |||
| 14 | #ifndef __LINUX_MCS5000_TS_H | ||
| 15 | #define __LINUX_MCS5000_TS_H | ||
| 16 | |||
| 17 | /* platform data for the MELFAS MCS-5000 touchscreen driver */ | ||
| 18 | struct mcs5000_ts_platform_data { | ||
| 19 | void (*cfg_pin)(void); | ||
| 20 | int x_size; | ||
| 21 | int y_size; | ||
| 22 | }; | ||
| 23 | |||
| 24 | #endif /* __LINUX_MCS5000_TS_H */ | ||
diff --git a/include/linux/i2c/pca954x.h b/include/linux/i2c/pca954x.h new file mode 100644 index 000000000000..28f1f8d5ab1f --- /dev/null +++ b/include/linux/i2c/pca954x.h | |||
| @@ -0,0 +1,47 @@ | |||
| 1 | /* | ||
| 2 | * | ||
| 3 | * pca954x.h - I2C multiplexer/switch support | ||
| 4 | * | ||
| 5 | * Copyright (c) 2008-2009 Rodolfo Giometti <giometti@linux.it> | ||
| 6 | * Copyright (c) 2008-2009 Eurotech S.p.A. <info@eurotech.it> | ||
| 7 | * Michael Lawnick <michael.lawnick.ext@nsn.com> | ||
| 8 | * | ||
| 9 | * This program is free software; you can redistribute it and/or modify | ||
| 10 | * it under the terms of the GNU General Public License as published by | ||
| 11 | * the Free Software Foundation; either version 2 of the License, or | ||
| 12 | * (at your option) any later version. | ||
| 13 | * | ||
| 14 | * This program is distributed in the hope that it will be useful, | ||
| 15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 17 | * GNU General Public License for more details. | ||
| 18 | * | ||
| 19 | * You should have received a copy of the GNU General Public License | ||
| 20 | * along with this program; if not, write to the Free Software | ||
| 21 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
| 22 | */ | ||
| 23 | |||
| 24 | |||
| 25 | #ifndef _LINUX_I2C_PCA954X_H | ||
| 26 | #define _LINUX_I2C_PCA954X_H | ||
| 27 | |||
| 28 | /* Platform data for the PCA954x I2C multiplexers */ | ||
| 29 | |||
| 30 | /* Per channel initialisation data: | ||
| 31 | * @adap_id: bus number for the adapter. 0 = don't care | ||
| 32 | * @deselect_on_exit: set this entry to 1, if your H/W needs deselection | ||
| 33 | * of this channel after transaction. | ||
| 34 | * | ||
| 35 | */ | ||
| 36 | struct pca954x_platform_mode { | ||
| 37 | int adap_id; | ||
| 38 | unsigned int deselect_on_exit:1; | ||
| 39 | }; | ||
| 40 | |||
| 41 | /* Per mux/switch data, used with i2c_register_board_info */ | ||
| 42 | struct pca954x_platform_data { | ||
| 43 | struct pca954x_platform_mode *modes; | ||
| 44 | int num_modes; | ||
| 45 | }; | ||
| 46 | |||
| 47 | #endif /* _LINUX_I2C_PCA954X_H */ | ||
diff --git a/include/linux/i2c/qt602240_ts.h b/include/linux/i2c/qt602240_ts.h new file mode 100644 index 000000000000..c5033e101094 --- /dev/null +++ b/include/linux/i2c/qt602240_ts.h | |||
| @@ -0,0 +1,38 @@ | |||
| 1 | /* | ||
| 2 | * AT42QT602240/ATMXT224 Touchscreen driver | ||
| 3 | * | ||
| 4 | * Copyright (C) 2010 Samsung Electronics Co.Ltd | ||
| 5 | * Author: Joonyoung Shim <jy0922.shim@samsung.com> | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify it | ||
| 8 | * under the terms of the GNU General Public License as published by the | ||
| 9 | * Free Software Foundation; either version 2 of the License, or (at your | ||
| 10 | * option) any later version. | ||
| 11 | */ | ||
| 12 | |||
| 13 | #ifndef __LINUX_QT602240_TS_H | ||
| 14 | #define __LINUX_QT602240_TS_H | ||
| 15 | |||
| 16 | /* Orient */ | ||
| 17 | #define QT602240_NORMAL 0x0 | ||
| 18 | #define QT602240_DIAGONAL 0x1 | ||
| 19 | #define QT602240_HORIZONTAL_FLIP 0x2 | ||
| 20 | #define QT602240_ROTATED_90_COUNTER 0x3 | ||
| 21 | #define QT602240_VERTICAL_FLIP 0x4 | ||
| 22 | #define QT602240_ROTATED_90 0x5 | ||
| 23 | #define QT602240_ROTATED_180 0x6 | ||
| 24 | #define QT602240_DIAGONAL_COUNTER 0x7 | ||
| 25 | |||
| 26 | /* The platform data for the AT42QT602240/ATMXT224 touchscreen driver */ | ||
| 27 | struct qt602240_platform_data { | ||
| 28 | unsigned int x_line; | ||
| 29 | unsigned int y_line; | ||
| 30 | unsigned int x_size; | ||
| 31 | unsigned int y_size; | ||
| 32 | unsigned int blen; | ||
| 33 | unsigned int threshold; | ||
| 34 | unsigned int voltage; | ||
| 35 | unsigned char orient; | ||
| 36 | }; | ||
| 37 | |||
| 38 | #endif /* __LINUX_QT602240_TS_H */ | ||
diff --git a/include/linux/i2c/sx150x.h b/include/linux/i2c/sx150x.h new file mode 100644 index 000000000000..52baa79d69a7 --- /dev/null +++ b/include/linux/i2c/sx150x.h | |||
| @@ -0,0 +1,82 @@ | |||
| 1 | /* | ||
| 2 | * Driver for the Semtech SX150x I2C GPIO Expanders | ||
| 3 | * | ||
| 4 | * Copyright (c) 2010, Code Aurora Forum. All rights reserved. | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify | ||
| 7 | * it under the terms of the GNU General Public License version 2 and | ||
| 8 | * only version 2 as published by the Free Software Foundation. | ||
| 9 | * | ||
| 10 | * This program is distributed in the hope that it will be useful, | ||
| 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 13 | * GNU General Public License for more details. | ||
| 14 | * | ||
| 15 | * You should have received a copy of the GNU General Public License | ||
| 16 | * along with this program; if not, write to the Free Software | ||
| 17 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA | ||
| 18 | * 02110-1301, USA. | ||
| 19 | */ | ||
| 20 | #ifndef __LINUX_I2C_SX150X_H | ||
| 21 | #define __LINUX_I2C_SX150X_H | ||
| 22 | |||
| 23 | /** | ||
| 24 | * struct sx150x_platform_data - config data for SX150x driver | ||
| 25 | * @gpio_base: The index number of the first GPIO assigned to this | ||
| 26 | * GPIO expander. The expander will create a block of | ||
| 27 | * consecutively numbered gpios beginning at the given base, | ||
| 28 | * with the size of the block depending on the model of the | ||
| 29 | * expander chip. | ||
| 30 | * @oscio_is_gpo: If set to true, the driver will configure OSCIO as a GPO | ||
| 31 | * instead of as an oscillator, increasing the size of the | ||
| 32 | * GP(I)O pool created by this expander by one. The | ||
| 33 | * output-only GPO pin will be added at the end of the block. | ||
| 34 | * @io_pullup_ena: A bit-mask which enables or disables the pull-up resistor | ||
| 35 | * for each IO line in the expander. Setting the bit at | ||
| 36 | * position n will enable the pull-up for the IO at | ||
| 37 | * the corresponding offset. For chips with fewer than | ||
| 38 | * 16 IO pins, high-end bits are ignored. | ||
| 39 | * @io_pulldn_ena: A bit-mask which enables-or disables the pull-down | ||
| 40 | * resistor for each IO line in the expander. Setting the | ||
| 41 | * bit at position n will enable the pull-down for the IO at | ||
| 42 | * the corresponding offset. For chips with fewer than | ||
| 43 | * 16 IO pins, high-end bits are ignored. | ||
| 44 | * @io_open_drain_ena: A bit-mask which enables-or disables open-drain | ||
| 45 | * operation for each IO line in the expander. Setting the | ||
| 46 | * bit at position n enables open-drain operation for | ||
| 47 | * the IO at the corresponding offset. Clearing the bit | ||
| 48 | * enables regular push-pull operation for that IO. | ||
| 49 | * For chips with fewer than 16 IO pins, high-end bits | ||
| 50 | * are ignored. | ||
| 51 | * @io_polarity: A bit-mask which enables polarity inversion for each IO line | ||
| 52 | * in the expander. Setting the bit at position n inverts | ||
| 53 | * the polarity of that IO line, while clearing it results | ||
| 54 | * in normal polarity. For chips with fewer than 16 IO pins, | ||
| 55 | * high-end bits are ignored. | ||
| 56 | * @irq_summary: The 'summary IRQ' line to which the GPIO expander's INT line | ||
| 57 | * is connected, via which it reports interrupt events | ||
| 58 | * across all GPIO lines. This must be a real, | ||
| 59 | * pre-existing IRQ line. | ||
| 60 | * Setting this value < 0 disables the irq_chip functionality | ||
| 61 | * of the driver. | ||
| 62 | * @irq_base: The first 'virtual IRQ' line at which our block of GPIO-based | ||
| 63 | * IRQ lines will appear. Similarly to gpio_base, the expander | ||
| 64 | * will create a block of irqs beginning at this number. | ||
| 65 | * This value is ignored if irq_summary is < 0. | ||
| 66 | * @reset_during_probe: If set to true, the driver will trigger a full | ||
| 67 | * reset of the chip at the beginning of the probe | ||
| 68 | * in order to place it in a known state. | ||
| 69 | */ | ||
| 70 | struct sx150x_platform_data { | ||
| 71 | unsigned gpio_base; | ||
| 72 | bool oscio_is_gpo; | ||
| 73 | u16 io_pullup_ena; | ||
| 74 | u16 io_pulldn_ena; | ||
| 75 | u16 io_open_drain_ena; | ||
| 76 | u16 io_polarity; | ||
| 77 | int irq_summary; | ||
| 78 | unsigned irq_base; | ||
| 79 | bool reset_during_probe; | ||
| 80 | }; | ||
| 81 | |||
| 82 | #endif /* __LINUX_I2C_SX150X_H */ | ||
diff --git a/include/linux/i2c/twl.h b/include/linux/i2c/twl.h index 6de90bfc6acd..4793d8a7f480 100644 --- a/include/linux/i2c/twl.h +++ b/include/linux/i2c/twl.h | |||
| @@ -553,8 +553,12 @@ extern void twl4030_power_init(struct twl4030_power_data *triton2_scripts); | |||
| 553 | extern int twl4030_remove_script(u8 flags); | 553 | extern int twl4030_remove_script(u8 flags); |
| 554 | 554 | ||
| 555 | struct twl4030_codec_audio_data { | 555 | struct twl4030_codec_audio_data { |
| 556 | unsigned int audio_mclk; | 556 | unsigned int audio_mclk; /* not used, will be removed */ |
| 557 | unsigned int digimic_delay; /* in ms */ | ||
| 557 | unsigned int ramp_delay_value; | 558 | unsigned int ramp_delay_value; |
| 559 | unsigned int offset_cncl_path; | ||
| 560 | unsigned int check_defaults:1; | ||
| 561 | unsigned int reset_registers:1; | ||
| 558 | unsigned int hs_extmute:1; | 562 | unsigned int hs_extmute:1; |
| 559 | void (*set_hs_extmute)(int mute); | 563 | void (*set_hs_extmute)(int mute); |
| 560 | }; | 564 | }; |
diff --git a/include/linux/ide.h b/include/linux/ide.h index 7b02aa5ce9b4..072fe8c93e6f 100644 --- a/include/linux/ide.h +++ b/include/linux/ide.h | |||
| @@ -458,7 +458,7 @@ enum { | |||
| 458 | IDE_DFLAG_DOORLOCKING = (1 << 15), | 458 | IDE_DFLAG_DOORLOCKING = (1 << 15), |
| 459 | /* disallow DMA */ | 459 | /* disallow DMA */ |
| 460 | IDE_DFLAG_NODMA = (1 << 16), | 460 | IDE_DFLAG_NODMA = (1 << 16), |
| 461 | /* powermanagment told us not to do anything, so sleep nicely */ | 461 | /* powermanagement told us not to do anything, so sleep nicely */ |
| 462 | IDE_DFLAG_BLOCKED = (1 << 17), | 462 | IDE_DFLAG_BLOCKED = (1 << 17), |
| 463 | /* sleeping & sleep field valid */ | 463 | /* sleeping & sleep field valid */ |
| 464 | IDE_DFLAG_SLEEPING = (1 << 18), | 464 | IDE_DFLAG_SLEEPING = (1 << 18), |
diff --git a/include/linux/idr.h b/include/linux/idr.h index e968db71e33a..13a801f3d028 100644 --- a/include/linux/idr.h +++ b/include/linux/idr.h | |||
| @@ -50,14 +50,14 @@ | |||
| 50 | 50 | ||
| 51 | struct idr_layer { | 51 | struct idr_layer { |
| 52 | unsigned long bitmap; /* A zero bit means "space here" */ | 52 | unsigned long bitmap; /* A zero bit means "space here" */ |
| 53 | struct idr_layer *ary[1<<IDR_BITS]; | 53 | struct idr_layer __rcu *ary[1<<IDR_BITS]; |
| 54 | int count; /* When zero, we can release it */ | 54 | int count; /* When zero, we can release it */ |
| 55 | int layer; /* distance from leaf */ | 55 | int layer; /* distance from leaf */ |
| 56 | struct rcu_head rcu_head; | 56 | struct rcu_head rcu_head; |
| 57 | }; | 57 | }; |
| 58 | 58 | ||
| 59 | struct idr { | 59 | struct idr { |
| 60 | struct idr_layer *top; | 60 | struct idr_layer __rcu *top; |
| 61 | struct idr_layer *id_free; | 61 | struct idr_layer *id_free; |
| 62 | int layers; /* only valid without concurrent changes */ | 62 | int layers; /* only valid without concurrent changes */ |
| 63 | int id_free_cnt; | 63 | int id_free_cnt; |
| @@ -81,6 +81,7 @@ struct idr { | |||
| 81 | #define _idr_rc_to_errno(rc) ((rc) == -1 ? -EAGAIN : -ENOSPC) | 81 | #define _idr_rc_to_errno(rc) ((rc) == -1 ? -EAGAIN : -ENOSPC) |
| 82 | 82 | ||
| 83 | /** | 83 | /** |
| 84 | * DOC: idr sync | ||
| 84 | * idr synchronization (stolen from radix-tree.h) | 85 | * idr synchronization (stolen from radix-tree.h) |
| 85 | * | 86 | * |
| 86 | * idr_find() is able to be called locklessly, using RCU. The caller must | 87 | * idr_find() is able to be called locklessly, using RCU. The caller must |
| @@ -117,10 +118,13 @@ void idr_init(struct idr *idp); | |||
| 117 | /* | 118 | /* |
| 118 | * IDA - IDR based id allocator, use when translation from id to | 119 | * IDA - IDR based id allocator, use when translation from id to |
| 119 | * pointer isn't necessary. | 120 | * pointer isn't necessary. |
| 121 | * | ||
| 122 | * IDA_BITMAP_LONGS is calculated to be one less to accommodate | ||
| 123 | * ida_bitmap->nr_busy so that the whole struct fits in 128 bytes. | ||
| 120 | */ | 124 | */ |
| 121 | #define IDA_CHUNK_SIZE 128 /* 128 bytes per chunk */ | 125 | #define IDA_CHUNK_SIZE 128 /* 128 bytes per chunk */ |
| 122 | #define IDA_BITMAP_LONGS (128 / sizeof(long) - 1) | 126 | #define IDA_BITMAP_LONGS (IDA_CHUNK_SIZE / sizeof(long) - 1) |
| 123 | #define IDA_BITMAP_BITS (IDA_BITMAP_LONGS * sizeof(long) * 8) | 127 | #define IDA_BITMAP_BITS (IDA_BITMAP_LONGS * sizeof(long) * 8) |
| 124 | 128 | ||
| 125 | struct ida_bitmap { | 129 | struct ida_bitmap { |
| 126 | long nr_busy; | 130 | long nr_busy; |
diff --git a/include/linux/ieee80211.h b/include/linux/ieee80211.h index 97b2eae6a22c..ed5a03cbe184 100644 --- a/include/linux/ieee80211.h +++ b/include/linux/ieee80211.h | |||
| @@ -986,6 +986,7 @@ struct ieee80211_ht_info { | |||
| 986 | #define WLAN_AUTH_OPEN 0 | 986 | #define WLAN_AUTH_OPEN 0 |
| 987 | #define WLAN_AUTH_SHARED_KEY 1 | 987 | #define WLAN_AUTH_SHARED_KEY 1 |
| 988 | #define WLAN_AUTH_FT 2 | 988 | #define WLAN_AUTH_FT 2 |
| 989 | #define WLAN_AUTH_SAE 3 | ||
| 989 | #define WLAN_AUTH_LEAP 128 | 990 | #define WLAN_AUTH_LEAP 128 |
| 990 | 991 | ||
| 991 | #define WLAN_AUTH_CHALLENGE_LEN 128 | 992 | #define WLAN_AUTH_CHALLENGE_LEN 128 |
| @@ -1072,6 +1073,10 @@ enum ieee80211_statuscode { | |||
| 1072 | WLAN_STATUS_NO_DIRECT_LINK = 48, | 1073 | WLAN_STATUS_NO_DIRECT_LINK = 48, |
| 1073 | WLAN_STATUS_STA_NOT_PRESENT = 49, | 1074 | WLAN_STATUS_STA_NOT_PRESENT = 49, |
| 1074 | WLAN_STATUS_STA_NOT_QSTA = 50, | 1075 | WLAN_STATUS_STA_NOT_QSTA = 50, |
| 1076 | /* 802.11s */ | ||
| 1077 | WLAN_STATUS_ANTI_CLOG_REQUIRED = 76, | ||
| 1078 | WLAN_STATUS_FCG_NOT_SUPP = 78, | ||
| 1079 | WLAN_STATUS_STA_NO_TBTT = 78, | ||
| 1075 | }; | 1080 | }; |
| 1076 | 1081 | ||
| 1077 | 1082 | ||
| @@ -1112,6 +1117,22 @@ enum ieee80211_reasoncode { | |||
| 1112 | WLAN_REASON_QSTA_REQUIRE_SETUP = 38, | 1117 | WLAN_REASON_QSTA_REQUIRE_SETUP = 38, |
| 1113 | WLAN_REASON_QSTA_TIMEOUT = 39, | 1118 | WLAN_REASON_QSTA_TIMEOUT = 39, |
| 1114 | WLAN_REASON_QSTA_CIPHER_NOT_SUPP = 45, | 1119 | WLAN_REASON_QSTA_CIPHER_NOT_SUPP = 45, |
| 1120 | /* 802.11s */ | ||
| 1121 | WLAN_REASON_MESH_PEER_CANCELED = 52, | ||
| 1122 | WLAN_REASON_MESH_MAX_PEERS = 53, | ||
| 1123 | WLAN_REASON_MESH_CONFIG = 54, | ||
| 1124 | WLAN_REASON_MESH_CLOSE = 55, | ||
| 1125 | WLAN_REASON_MESH_MAX_RETRIES = 56, | ||
| 1126 | WLAN_REASON_MESH_CONFIRM_TIMEOUT = 57, | ||
| 1127 | WLAN_REASON_MESH_INVALID_GTK = 58, | ||
| 1128 | WLAN_REASON_MESH_INCONSISTENT_PARAM = 59, | ||
| 1129 | WLAN_REASON_MESH_INVALID_SECURITY = 60, | ||
| 1130 | WLAN_REASON_MESH_PATH_ERROR = 61, | ||
| 1131 | WLAN_REASON_MESH_PATH_NOFORWARD = 62, | ||
| 1132 | WLAN_REASON_MESH_PATH_DEST_UNREACHABLE = 63, | ||
| 1133 | WLAN_REASON_MAC_EXISTS_IN_MBSS = 64, | ||
| 1134 | WLAN_REASON_MESH_CHAN_REGULATORY = 65, | ||
| 1135 | WLAN_REASON_MESH_CHAN = 66, | ||
| 1115 | }; | 1136 | }; |
| 1116 | 1137 | ||
| 1117 | 1138 | ||
| @@ -1139,20 +1160,33 @@ enum ieee80211_eid { | |||
| 1139 | WLAN_EID_TS_DELAY = 43, | 1160 | WLAN_EID_TS_DELAY = 43, |
| 1140 | WLAN_EID_TCLAS_PROCESSING = 44, | 1161 | WLAN_EID_TCLAS_PROCESSING = 44, |
| 1141 | WLAN_EID_QOS_CAPA = 46, | 1162 | WLAN_EID_QOS_CAPA = 46, |
| 1142 | /* 802.11s | 1163 | /* 802.11s */ |
| 1143 | * | 1164 | WLAN_EID_MESH_CONFIG = 113, |
| 1144 | * All mesh EID numbers are pending IEEE 802.11 ANA approval. | 1165 | WLAN_EID_MESH_ID = 114, |
| 1145 | * The numbers have been incremented from those suggested in | 1166 | WLAN_EID_LINK_METRIC_REPORT = 115, |
| 1146 | * 802.11s/D2.0 so that MESH_CONFIG does not conflict with | 1167 | WLAN_EID_CONGESTION_NOTIFICATION = 116, |
| 1147 | * EXT_SUPP_RATES. | 1168 | /* Note that the Peer Link IE has been replaced with the similar |
| 1169 | * Peer Management IE. We will keep the former definition until mesh | ||
| 1170 | * code is changed to comply with latest 802.11s drafts. | ||
| 1148 | */ | 1171 | */ |
| 1149 | WLAN_EID_MESH_CONFIG = 51, | 1172 | WLAN_EID_PEER_LINK = 55, /* no longer in 802.11s drafts */ |
| 1150 | WLAN_EID_MESH_ID = 52, | 1173 | WLAN_EID_PEER_MGMT = 117, |
| 1151 | WLAN_EID_PEER_LINK = 55, | 1174 | WLAN_EID_CHAN_SWITCH_PARAM = 118, |
| 1152 | WLAN_EID_PREQ = 68, | 1175 | WLAN_EID_MESH_AWAKE_WINDOW = 119, |
| 1153 | WLAN_EID_PREP = 69, | 1176 | WLAN_EID_BEACON_TIMING = 120, |
| 1154 | WLAN_EID_PERR = 70, | 1177 | WLAN_EID_MCCAOP_SETUP_REQ = 121, |
| 1155 | WLAN_EID_RANN = 49, /* compatible with FreeBSD */ | 1178 | WLAN_EID_MCCAOP_SETUP_RESP = 122, |
| 1179 | WLAN_EID_MCCAOP_ADVERT = 123, | ||
| 1180 | WLAN_EID_MCCAOP_TEARDOWN = 124, | ||
| 1181 | WLAN_EID_GANN = 125, | ||
| 1182 | WLAN_EID_RANN = 126, | ||
| 1183 | WLAN_EID_PREQ = 130, | ||
| 1184 | WLAN_EID_PREP = 131, | ||
| 1185 | WLAN_EID_PERR = 132, | ||
| 1186 | WLAN_EID_PXU = 137, | ||
| 1187 | WLAN_EID_PXUC = 138, | ||
| 1188 | WLAN_EID_AUTH_MESH_PEER_EXCH = 139, | ||
| 1189 | WLAN_EID_MIC = 140, | ||
| 1156 | 1190 | ||
| 1157 | WLAN_EID_PWR_CONSTRAINT = 32, | 1191 | WLAN_EID_PWR_CONSTRAINT = 32, |
| 1158 | WLAN_EID_PWR_CAPABILITY = 33, | 1192 | WLAN_EID_PWR_CAPABILITY = 33, |
| @@ -1211,9 +1245,14 @@ enum ieee80211_category { | |||
| 1211 | WLAN_CATEGORY_HT = 7, | 1245 | WLAN_CATEGORY_HT = 7, |
| 1212 | WLAN_CATEGORY_SA_QUERY = 8, | 1246 | WLAN_CATEGORY_SA_QUERY = 8, |
| 1213 | WLAN_CATEGORY_PROTECTED_DUAL_OF_ACTION = 9, | 1247 | WLAN_CATEGORY_PROTECTED_DUAL_OF_ACTION = 9, |
| 1248 | WLAN_CATEGORY_MESH_ACTION = 13, | ||
| 1249 | WLAN_CATEGORY_MULTIHOP_ACTION = 14, | ||
| 1250 | WLAN_CATEGORY_SELF_PROTECTED = 15, | ||
| 1214 | WLAN_CATEGORY_WMM = 17, | 1251 | WLAN_CATEGORY_WMM = 17, |
| 1215 | WLAN_CATEGORY_MESH_PLINK = 30, /* Pending ANA approval */ | 1252 | /* TODO: remove MESH_PLINK and MESH_PATH_SEL after */ |
| 1216 | WLAN_CATEGORY_MESH_PATH_SEL = 32, /* Pending ANA approval */ | 1253 | /* mesh is updated to current 802.11s draft */ |
| 1254 | WLAN_CATEGORY_MESH_PLINK = 30, | ||
| 1255 | WLAN_CATEGORY_MESH_PATH_SEL = 32, | ||
| 1217 | WLAN_CATEGORY_VENDOR_SPECIFIC_PROTECTED = 126, | 1256 | WLAN_CATEGORY_VENDOR_SPECIFIC_PROTECTED = 126, |
| 1218 | WLAN_CATEGORY_VENDOR_SPECIFIC = 127, | 1257 | WLAN_CATEGORY_VENDOR_SPECIFIC = 127, |
| 1219 | }; | 1258 | }; |
| @@ -1351,6 +1390,8 @@ enum ieee80211_sa_query_action { | |||
| 1351 | /* AKM suite selectors */ | 1390 | /* AKM suite selectors */ |
| 1352 | #define WLAN_AKM_SUITE_8021X 0x000FAC01 | 1391 | #define WLAN_AKM_SUITE_8021X 0x000FAC01 |
| 1353 | #define WLAN_AKM_SUITE_PSK 0x000FAC02 | 1392 | #define WLAN_AKM_SUITE_PSK 0x000FAC02 |
| 1393 | #define WLAN_AKM_SUITE_SAE 0x000FAC08 | ||
| 1394 | #define WLAN_AKM_SUITE_FT_OVER_SAE 0x000FAC09 | ||
| 1354 | 1395 | ||
| 1355 | #define WLAN_MAX_KEY_LEN 32 | 1396 | #define WLAN_MAX_KEY_LEN 32 |
| 1356 | 1397 | ||
diff --git a/include/linux/if.h b/include/linux/if.h index be350e62a905..123959927745 100644 --- a/include/linux/if.h +++ b/include/linux/if.h | |||
| @@ -73,6 +73,10 @@ | |||
| 73 | #define IFF_DONT_BRIDGE 0x800 /* disallow bridging this ether dev */ | 73 | #define IFF_DONT_BRIDGE 0x800 /* disallow bridging this ether dev */ |
| 74 | #define IFF_IN_NETPOLL 0x1000 /* whether we are processing netpoll */ | 74 | #define IFF_IN_NETPOLL 0x1000 /* whether we are processing netpoll */ |
| 75 | #define IFF_DISABLE_NETPOLL 0x2000 /* disable netpoll at run-time */ | 75 | #define IFF_DISABLE_NETPOLL 0x2000 /* disable netpoll at run-time */ |
| 76 | #define IFF_MACVLAN_PORT 0x4000 /* device used as macvlan port */ | ||
| 77 | #define IFF_BRIDGE_PORT 0x8000 /* device used as bridge port */ | ||
| 78 | #define IFF_OVS_DATAPATH 0x10000 /* device used as Open vSwitch | ||
| 79 | * datapath port */ | ||
| 76 | 80 | ||
| 77 | #define IF_GET_IFACE 0x0001 /* for querying only */ | 81 | #define IF_GET_IFACE 0x0001 /* for querying only */ |
| 78 | #define IF_GET_PROTO 0x0002 | 82 | #define IF_GET_PROTO 0x0002 |
diff --git a/include/linux/if_bonding.h b/include/linux/if_bonding.h index cd525fae3c98..a17edda8a781 100644 --- a/include/linux/if_bonding.h +++ b/include/linux/if_bonding.h | |||
| @@ -83,6 +83,10 @@ | |||
| 83 | 83 | ||
| 84 | #define BOND_DEFAULT_MAX_BONDS 1 /* Default maximum number of devices to support */ | 84 | #define BOND_DEFAULT_MAX_BONDS 1 /* Default maximum number of devices to support */ |
| 85 | 85 | ||
| 86 | #define BOND_DEFAULT_TX_QUEUES 16 /* Default number of tx queues per device */ | ||
| 87 | |||
| 88 | #define BOND_DEFAULT_RESEND_IGMP 1 /* Default number of IGMP membership reports */ | ||
| 89 | |||
| 86 | /* hashing types */ | 90 | /* hashing types */ |
| 87 | #define BOND_XMIT_POLICY_LAYER2 0 /* layer 2 (MAC only), default */ | 91 | #define BOND_XMIT_POLICY_LAYER2 0 /* layer 2 (MAC only), default */ |
| 88 | #define BOND_XMIT_POLICY_LAYER34 1 /* layer 3+4 (IP ^ (TCP || UDP)) */ | 92 | #define BOND_XMIT_POLICY_LAYER34 1 /* layer 3+4 (IP ^ (TCP || UDP)) */ |
diff --git a/include/linux/if_bridge.h b/include/linux/if_bridge.h index 938b7e81df95..0d241a5c4909 100644 --- a/include/linux/if_bridge.h +++ b/include/linux/if_bridge.h | |||
| @@ -102,8 +102,6 @@ struct __fdb_entry { | |||
| 102 | #include <linux/netdevice.h> | 102 | #include <linux/netdevice.h> |
| 103 | 103 | ||
| 104 | extern void brioctl_set(int (*ioctl_hook)(struct net *, unsigned int, void __user *)); | 104 | extern void brioctl_set(int (*ioctl_hook)(struct net *, unsigned int, void __user *)); |
| 105 | extern struct sk_buff *(*br_handle_frame_hook)(struct net_bridge_port *p, | ||
| 106 | struct sk_buff *skb); | ||
| 107 | extern int (*br_should_route_hook)(struct sk_buff *skb); | 105 | extern int (*br_should_route_hook)(struct sk_buff *skb); |
| 108 | 106 | ||
| 109 | #endif | 107 | #endif |
diff --git a/include/linux/if_ether.h b/include/linux/if_ether.h index bed7a4682b90..f9c3df03db0f 100644 --- a/include/linux/if_ether.h +++ b/include/linux/if_ether.h | |||
| @@ -137,8 +137,6 @@ extern struct ctl_table ether_table[]; | |||
| 137 | 137 | ||
| 138 | extern ssize_t sysfs_format_mac(char *buf, const unsigned char *addr, int len); | 138 | extern ssize_t sysfs_format_mac(char *buf, const unsigned char *addr, int len); |
| 139 | 139 | ||
| 140 | #define MAC_FMT "%02x:%02x:%02x:%02x:%02x:%02x" | ||
| 141 | |||
| 142 | #endif | 140 | #endif |
| 143 | 141 | ||
| 144 | #endif /* _LINUX_IF_ETHER_H */ | 142 | #endif /* _LINUX_IF_ETHER_H */ |
diff --git a/include/linux/if_fddi.h b/include/linux/if_fddi.h index 5459c5c09930..e6dc11e7f9a5 100644 --- a/include/linux/if_fddi.h +++ b/include/linux/if_fddi.h | |||
| @@ -67,7 +67,7 @@ struct fddi_8022_1_hdr { | |||
| 67 | __u8 dsap; /* destination service access point */ | 67 | __u8 dsap; /* destination service access point */ |
| 68 | __u8 ssap; /* source service access point */ | 68 | __u8 ssap; /* source service access point */ |
| 69 | __u8 ctrl; /* control byte #1 */ | 69 | __u8 ctrl; /* control byte #1 */ |
| 70 | } __attribute__ ((packed)); | 70 | } __attribute__((packed)); |
| 71 | 71 | ||
| 72 | /* Define 802.2 Type 2 header */ | 72 | /* Define 802.2 Type 2 header */ |
| 73 | struct fddi_8022_2_hdr { | 73 | struct fddi_8022_2_hdr { |
| @@ -75,7 +75,7 @@ struct fddi_8022_2_hdr { | |||
| 75 | __u8 ssap; /* source service access point */ | 75 | __u8 ssap; /* source service access point */ |
| 76 | __u8 ctrl_1; /* control byte #1 */ | 76 | __u8 ctrl_1; /* control byte #1 */ |
| 77 | __u8 ctrl_2; /* control byte #2 */ | 77 | __u8 ctrl_2; /* control byte #2 */ |
| 78 | } __attribute__ ((packed)); | 78 | } __attribute__((packed)); |
| 79 | 79 | ||
| 80 | /* Define 802.2 SNAP header */ | 80 | /* Define 802.2 SNAP header */ |
| 81 | #define FDDI_K_OUI_LEN 3 | 81 | #define FDDI_K_OUI_LEN 3 |
| @@ -85,7 +85,7 @@ struct fddi_snap_hdr { | |||
| 85 | __u8 ctrl; /* always 0x03 */ | 85 | __u8 ctrl; /* always 0x03 */ |
| 86 | __u8 oui[FDDI_K_OUI_LEN]; /* organizational universal id */ | 86 | __u8 oui[FDDI_K_OUI_LEN]; /* organizational universal id */ |
| 87 | __be16 ethertype; /* packet type ID field */ | 87 | __be16 ethertype; /* packet type ID field */ |
| 88 | } __attribute__ ((packed)); | 88 | } __attribute__((packed)); |
| 89 | 89 | ||
| 90 | /* Define FDDI LLC frame header */ | 90 | /* Define FDDI LLC frame header */ |
| 91 | struct fddihdr { | 91 | struct fddihdr { |
| @@ -98,7 +98,7 @@ struct fddihdr { | |||
| 98 | struct fddi_8022_2_hdr llc_8022_2; | 98 | struct fddi_8022_2_hdr llc_8022_2; |
| 99 | struct fddi_snap_hdr llc_snap; | 99 | struct fddi_snap_hdr llc_snap; |
| 100 | } hdr; | 100 | } hdr; |
| 101 | } __attribute__ ((packed)); | 101 | } __attribute__((packed)); |
| 102 | 102 | ||
| 103 | #ifdef __KERNEL__ | 103 | #ifdef __KERNEL__ |
| 104 | #include <linux/netdevice.h> | 104 | #include <linux/netdevice.h> |
diff --git a/include/linux/if_frad.h b/include/linux/if_frad.h index 80b3a1056a5f..191ee0869bc1 100644 --- a/include/linux/if_frad.h +++ b/include/linux/if_frad.h | |||
| @@ -135,7 +135,7 @@ struct frhdr | |||
| 135 | __be16 PID; | 135 | __be16 PID; |
| 136 | 136 | ||
| 137 | #define IP_NLPID pad | 137 | #define IP_NLPID pad |
| 138 | } __attribute__((packed)); | 138 | } __packed; |
| 139 | 139 | ||
| 140 | /* see RFC 1490 for the definition of the following */ | 140 | /* see RFC 1490 for the definition of the following */ |
| 141 | #define FRAD_I_UI 0x03 | 141 | #define FRAD_I_UI 0x03 |
diff --git a/include/linux/if_hippi.h b/include/linux/if_hippi.h index 8d038eb8db5c..cdc049f1829a 100644 --- a/include/linux/if_hippi.h +++ b/include/linux/if_hippi.h | |||
| @@ -104,7 +104,7 @@ struct hippi_fp_hdr { | |||
| 104 | __be32 fixed; | 104 | __be32 fixed; |
| 105 | #endif | 105 | #endif |
| 106 | __be32 d2_size; | 106 | __be32 d2_size; |
| 107 | } __attribute__ ((packed)); | 107 | } __attribute__((packed)); |
| 108 | 108 | ||
| 109 | struct hippi_le_hdr { | 109 | struct hippi_le_hdr { |
| 110 | #if defined (__BIG_ENDIAN_BITFIELD) | 110 | #if defined (__BIG_ENDIAN_BITFIELD) |
| @@ -129,7 +129,7 @@ struct hippi_le_hdr { | |||
| 129 | __u8 daddr[HIPPI_ALEN]; | 129 | __u8 daddr[HIPPI_ALEN]; |
| 130 | __u16 locally_administered; | 130 | __u16 locally_administered; |
| 131 | __u8 saddr[HIPPI_ALEN]; | 131 | __u8 saddr[HIPPI_ALEN]; |
| 132 | } __attribute__ ((packed)); | 132 | } __attribute__((packed)); |
| 133 | 133 | ||
| 134 | #define HIPPI_OUI_LEN 3 | 134 | #define HIPPI_OUI_LEN 3 |
| 135 | /* | 135 | /* |
| @@ -142,12 +142,12 @@ struct hippi_snap_hdr { | |||
| 142 | __u8 ctrl; /* always 0x03 */ | 142 | __u8 ctrl; /* always 0x03 */ |
| 143 | __u8 oui[HIPPI_OUI_LEN]; /* organizational universal id (zero)*/ | 143 | __u8 oui[HIPPI_OUI_LEN]; /* organizational universal id (zero)*/ |
| 144 | __be16 ethertype; /* packet type ID field */ | 144 | __be16 ethertype; /* packet type ID field */ |
| 145 | } __attribute__ ((packed)); | 145 | } __attribute__((packed)); |
| 146 | 146 | ||
| 147 | struct hippi_hdr { | 147 | struct hippi_hdr { |
| 148 | struct hippi_fp_hdr fp; | 148 | struct hippi_fp_hdr fp; |
| 149 | struct hippi_le_hdr le; | 149 | struct hippi_le_hdr le; |
| 150 | struct hippi_snap_hdr snap; | 150 | struct hippi_snap_hdr snap; |
| 151 | } __attribute__ ((packed)); | 151 | } __attribute__((packed)); |
| 152 | 152 | ||
| 153 | #endif /* _LINUX_IF_HIPPI_H */ | 153 | #endif /* _LINUX_IF_HIPPI_H */ |
diff --git a/include/linux/if_infiniband.h b/include/linux/if_infiniband.h index 3e659ec7dfdd..7d958475d4ac 100644 --- a/include/linux/if_infiniband.h +++ b/include/linux/if_infiniband.h | |||
| @@ -5,7 +5,7 @@ | |||
| 5 | * <http://www.fsf.org/copyleft/gpl.html>, or the OpenIB.org BSD | 5 | * <http://www.fsf.org/copyleft/gpl.html>, or the OpenIB.org BSD |
| 6 | * license, available in the LICENSE.TXT file accompanying this | 6 | * license, available in the LICENSE.TXT file accompanying this |
| 7 | * software. These details are also available at | 7 | * software. These details are also available at |
| 8 | * <http://openib.org/license.html>. | 8 | * <http://www.openfabrics.org/software_license.htm>. |
| 9 | * | 9 | * |
| 10 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | 10 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
| 11 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | 11 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
diff --git a/include/linux/if_link.h b/include/linux/if_link.h index 85c812db5a3f..2fc66dd783ee 100644 --- a/include/linux/if_link.h +++ b/include/linux/if_link.h | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | #include <linux/types.h> | 4 | #include <linux/types.h> |
| 5 | #include <linux/netlink.h> | 5 | #include <linux/netlink.h> |
| 6 | 6 | ||
| 7 | /* The struct should be in sync with struct net_device_stats */ | 7 | /* This struct should be in sync with struct rtnl_link_stats64 */ |
| 8 | struct rtnl_link_stats { | 8 | struct rtnl_link_stats { |
| 9 | __u32 rx_packets; /* total packets received */ | 9 | __u32 rx_packets; /* total packets received */ |
| 10 | __u32 tx_packets; /* total packets transmitted */ | 10 | __u32 tx_packets; /* total packets transmitted */ |
| @@ -37,6 +37,7 @@ struct rtnl_link_stats { | |||
| 37 | __u32 tx_compressed; | 37 | __u32 tx_compressed; |
| 38 | }; | 38 | }; |
| 39 | 39 | ||
| 40 | /* The main device statistics structure */ | ||
| 40 | struct rtnl_link_stats64 { | 41 | struct rtnl_link_stats64 { |
| 41 | __u64 rx_packets; /* total packets received */ | 42 | __u64 rx_packets; /* total packets received */ |
| 42 | __u64 tx_packets; /* total packets transmitted */ | 43 | __u64 tx_packets; /* total packets transmitted */ |
| @@ -233,7 +234,7 @@ enum macvlan_mode { | |||
| 233 | MACVLAN_MODE_BRIDGE = 4, /* talk to bridge ports directly */ | 234 | MACVLAN_MODE_BRIDGE = 4, /* talk to bridge ports directly */ |
| 234 | }; | 235 | }; |
| 235 | 236 | ||
| 236 | /* SR-IOV virtual function managment section */ | 237 | /* SR-IOV virtual function management section */ |
| 237 | 238 | ||
| 238 | enum { | 239 | enum { |
| 239 | IFLA_VF_INFO_UNSPEC, | 240 | IFLA_VF_INFO_UNSPEC, |
diff --git a/include/linux/if_macvlan.h b/include/linux/if_macvlan.h index 1ffaeffeff74..8a2fd66a8b5f 100644 --- a/include/linux/if_macvlan.h +++ b/include/linux/if_macvlan.h | |||
| @@ -6,6 +6,7 @@ | |||
| 6 | #include <linux/netdevice.h> | 6 | #include <linux/netdevice.h> |
| 7 | #include <linux/netlink.h> | 7 | #include <linux/netlink.h> |
| 8 | #include <net/netlink.h> | 8 | #include <net/netlink.h> |
| 9 | #include <linux/u64_stats_sync.h> | ||
| 9 | 10 | ||
| 10 | #if defined(CONFIG_MACVTAP) || defined(CONFIG_MACVTAP_MODULE) | 11 | #if defined(CONFIG_MACVTAP) || defined(CONFIG_MACVTAP_MODULE) |
| 11 | struct socket *macvtap_get_socket(struct file *); | 12 | struct socket *macvtap_get_socket(struct file *); |
| @@ -27,16 +28,24 @@ struct macvtap_queue; | |||
| 27 | * struct macvlan_rx_stats - MACVLAN percpu rx stats | 28 | * struct macvlan_rx_stats - MACVLAN percpu rx stats |
| 28 | * @rx_packets: number of received packets | 29 | * @rx_packets: number of received packets |
| 29 | * @rx_bytes: number of received bytes | 30 | * @rx_bytes: number of received bytes |
| 30 | * @multicast: number of received multicast packets | 31 | * @rx_multicast: number of received multicast packets |
| 32 | * @syncp: synchronization point for 64bit counters | ||
| 31 | * @rx_errors: number of errors | 33 | * @rx_errors: number of errors |
| 32 | */ | 34 | */ |
| 33 | struct macvlan_rx_stats { | 35 | struct macvlan_rx_stats { |
| 34 | unsigned long rx_packets; | 36 | u64 rx_packets; |
| 35 | unsigned long rx_bytes; | 37 | u64 rx_bytes; |
| 36 | unsigned long multicast; | 38 | u64 rx_multicast; |
| 37 | unsigned long rx_errors; | 39 | struct u64_stats_sync syncp; |
| 40 | unsigned long rx_errors; | ||
| 38 | }; | 41 | }; |
| 39 | 42 | ||
| 43 | /* | ||
| 44 | * Maximum times a macvtap device can be opened. This can be used to | ||
| 45 | * configure the number of receive queue, e.g. for multiqueue virtio. | ||
| 46 | */ | ||
| 47 | #define MAX_MACVTAP_QUEUES (NR_CPUS < 16 ? NR_CPUS : 16) | ||
| 48 | |||
| 40 | struct macvlan_dev { | 49 | struct macvlan_dev { |
| 41 | struct net_device *dev; | 50 | struct net_device *dev; |
| 42 | struct list_head list; | 51 | struct list_head list; |
| @@ -47,7 +56,8 @@ struct macvlan_dev { | |||
| 47 | enum macvlan_mode mode; | 56 | enum macvlan_mode mode; |
| 48 | int (*receive)(struct sk_buff *skb); | 57 | int (*receive)(struct sk_buff *skb); |
| 49 | int (*forward)(struct net_device *dev, struct sk_buff *skb); | 58 | int (*forward)(struct net_device *dev, struct sk_buff *skb); |
| 50 | struct macvtap_queue *tap; | 59 | struct macvtap_queue *taps[MAX_MACVTAP_QUEUES]; |
| 60 | int numvtaps; | ||
| 51 | }; | 61 | }; |
| 52 | 62 | ||
| 53 | static inline void macvlan_count_rx(const struct macvlan_dev *vlan, | 63 | static inline void macvlan_count_rx(const struct macvlan_dev *vlan, |
| @@ -56,12 +66,14 @@ static inline void macvlan_count_rx(const struct macvlan_dev *vlan, | |||
| 56 | { | 66 | { |
| 57 | struct macvlan_rx_stats *rx_stats; | 67 | struct macvlan_rx_stats *rx_stats; |
| 58 | 68 | ||
| 59 | rx_stats = per_cpu_ptr(vlan->rx_stats, smp_processor_id()); | 69 | rx_stats = this_cpu_ptr(vlan->rx_stats); |
| 60 | if (likely(success)) { | 70 | if (likely(success)) { |
| 71 | u64_stats_update_begin(&rx_stats->syncp); | ||
| 61 | rx_stats->rx_packets++;; | 72 | rx_stats->rx_packets++;; |
| 62 | rx_stats->rx_bytes += len; | 73 | rx_stats->rx_bytes += len; |
| 63 | if (multicast) | 74 | if (multicast) |
| 64 | rx_stats->multicast++; | 75 | rx_stats->rx_multicast++; |
| 76 | u64_stats_update_end(&rx_stats->syncp); | ||
| 65 | } else { | 77 | } else { |
| 66 | rx_stats->rx_errors++; | 78 | rx_stats->rx_errors++; |
| 67 | } | 79 | } |
| @@ -86,8 +98,4 @@ extern int macvlan_link_register(struct rtnl_link_ops *ops); | |||
| 86 | extern netdev_tx_t macvlan_start_xmit(struct sk_buff *skb, | 98 | extern netdev_tx_t macvlan_start_xmit(struct sk_buff *skb, |
| 87 | struct net_device *dev); | 99 | struct net_device *dev); |
| 88 | 100 | ||
| 89 | |||
| 90 | extern struct sk_buff *(*macvlan_handle_frame_hook)(struct macvlan_port *, | ||
| 91 | struct sk_buff *); | ||
| 92 | |||
| 93 | #endif /* _LINUX_IF_MACVLAN_H */ | 101 | #endif /* _LINUX_IF_MACVLAN_H */ |
diff --git a/include/linux/if_packet.h b/include/linux/if_packet.h index 6ac23ef1801a..72bfa5a034dd 100644 --- a/include/linux/if_packet.h +++ b/include/linux/if_packet.h | |||
| @@ -48,6 +48,7 @@ struct sockaddr_ll { | |||
| 48 | #define PACKET_LOSS 14 | 48 | #define PACKET_LOSS 14 |
| 49 | #define PACKET_VNET_HDR 15 | 49 | #define PACKET_VNET_HDR 15 |
| 50 | #define PACKET_TX_TIMESTAMP 16 | 50 | #define PACKET_TX_TIMESTAMP 16 |
| 51 | #define PACKET_TIMESTAMP 17 | ||
| 51 | 52 | ||
| 52 | struct tpacket_stats { | 53 | struct tpacket_stats { |
| 53 | unsigned int tp_packets; | 54 | unsigned int tp_packets; |
diff --git a/include/linux/if_pppox.h b/include/linux/if_pppox.h index a6577af0c4e6..397921b09ef9 100644 --- a/include/linux/if_pppox.h +++ b/include/linux/if_pppox.h | |||
| @@ -40,26 +40,36 @@ | |||
| 40 | * PPPoE addressing definition | 40 | * PPPoE addressing definition |
| 41 | */ | 41 | */ |
| 42 | typedef __be16 sid_t; | 42 | typedef __be16 sid_t; |
| 43 | struct pppoe_addr{ | 43 | struct pppoe_addr { |
| 44 | sid_t sid; /* Session identifier */ | 44 | sid_t sid; /* Session identifier */ |
| 45 | unsigned char remote[ETH_ALEN]; /* Remote address */ | 45 | unsigned char remote[ETH_ALEN]; /* Remote address */ |
| 46 | char dev[IFNAMSIZ]; /* Local device to use */ | 46 | char dev[IFNAMSIZ]; /* Local device to use */ |
| 47 | }; | 47 | }; |
| 48 | 48 | ||
| 49 | /************************************************************************ | 49 | /************************************************************************ |
| 50 | * Protocols supported by AF_PPPOX | 50 | * PPTP addressing definition |
| 51 | */ | 51 | */ |
| 52 | struct pptp_addr { | ||
| 53 | __be16 call_id; | ||
| 54 | struct in_addr sin_addr; | ||
| 55 | }; | ||
| 56 | |||
| 57 | /************************************************************************ | ||
| 58 | * Protocols supported by AF_PPPOX | ||
| 59 | */ | ||
| 52 | #define PX_PROTO_OE 0 /* Currently just PPPoE */ | 60 | #define PX_PROTO_OE 0 /* Currently just PPPoE */ |
| 53 | #define PX_PROTO_OL2TP 1 /* Now L2TP also */ | 61 | #define PX_PROTO_OL2TP 1 /* Now L2TP also */ |
| 54 | #define PX_MAX_PROTO 2 | 62 | #define PX_PROTO_PPTP 2 |
| 63 | #define PX_MAX_PROTO 3 | ||
| 55 | 64 | ||
| 56 | struct sockaddr_pppox { | 65 | struct sockaddr_pppox { |
| 57 | sa_family_t sa_family; /* address family, AF_PPPOX */ | 66 | sa_family_t sa_family; /* address family, AF_PPPOX */ |
| 58 | unsigned int sa_protocol; /* protocol identifier */ | 67 | unsigned int sa_protocol; /* protocol identifier */ |
| 59 | union{ | 68 | union { |
| 60 | struct pppoe_addr pppoe; | 69 | struct pppoe_addr pppoe; |
| 61 | }sa_addr; | 70 | struct pptp_addr pptp; |
| 62 | }__attribute__ ((packed)); | 71 | } sa_addr; |
| 72 | } __attribute__((packed)); | ||
| 63 | 73 | ||
| 64 | /* The use of the above union isn't viable because the size of this | 74 | /* The use of the above union isn't viable because the size of this |
| 65 | * struct must stay fixed over time -- applications use sizeof(struct | 75 | * struct must stay fixed over time -- applications use sizeof(struct |
| @@ -70,7 +80,7 @@ struct sockaddr_pppol2tp { | |||
| 70 | sa_family_t sa_family; /* address family, AF_PPPOX */ | 80 | sa_family_t sa_family; /* address family, AF_PPPOX */ |
| 71 | unsigned int sa_protocol; /* protocol identifier */ | 81 | unsigned int sa_protocol; /* protocol identifier */ |
| 72 | struct pppol2tp_addr pppol2tp; | 82 | struct pppol2tp_addr pppol2tp; |
| 73 | }__attribute__ ((packed)); | 83 | } __attribute__((packed)); |
| 74 | 84 | ||
| 75 | /* The L2TPv3 protocol changes tunnel and session ids from 16 to 32 | 85 | /* The L2TPv3 protocol changes tunnel and session ids from 16 to 32 |
| 76 | * bits. So we need a different sockaddr structure. | 86 | * bits. So we need a different sockaddr structure. |
| @@ -79,7 +89,7 @@ struct sockaddr_pppol2tpv3 { | |||
| 79 | sa_family_t sa_family; /* address family, AF_PPPOX */ | 89 | sa_family_t sa_family; /* address family, AF_PPPOX */ |
| 80 | unsigned int sa_protocol; /* protocol identifier */ | 90 | unsigned int sa_protocol; /* protocol identifier */ |
| 81 | struct pppol2tpv3_addr pppol2tp; | 91 | struct pppol2tpv3_addr pppol2tp; |
| 82 | } __attribute__ ((packed)); | 92 | } __attribute__((packed)); |
| 83 | 93 | ||
| 84 | /********************************************************************* | 94 | /********************************************************************* |
| 85 | * | 95 | * |
| @@ -101,7 +111,7 @@ struct pppoe_tag { | |||
| 101 | __be16 tag_type; | 111 | __be16 tag_type; |
| 102 | __be16 tag_len; | 112 | __be16 tag_len; |
| 103 | char tag_data[0]; | 113 | char tag_data[0]; |
| 104 | } __attribute ((packed)); | 114 | } __attribute__ ((packed)); |
| 105 | 115 | ||
| 106 | /* Tag identifiers */ | 116 | /* Tag identifiers */ |
| 107 | #define PTT_EOL __cpu_to_be16(0x0000) | 117 | #define PTT_EOL __cpu_to_be16(0x0000) |
| @@ -129,7 +139,7 @@ struct pppoe_hdr { | |||
| 129 | __be16 sid; | 139 | __be16 sid; |
| 130 | __be16 length; | 140 | __be16 length; |
| 131 | struct pppoe_tag tag[0]; | 141 | struct pppoe_tag tag[0]; |
| 132 | } __attribute__ ((packed)); | 142 | } __attribute__((packed)); |
| 133 | 143 | ||
| 134 | /* Length of entire PPPoE + PPP header */ | 144 | /* Length of entire PPPoE + PPP header */ |
| 135 | #define PPPOE_SES_HLEN 8 | 145 | #define PPPOE_SES_HLEN 8 |
| @@ -150,15 +160,23 @@ struct pppoe_opt { | |||
| 150 | relayed to (PPPoE relaying) */ | 160 | relayed to (PPPoE relaying) */ |
| 151 | }; | 161 | }; |
| 152 | 162 | ||
| 163 | struct pptp_opt { | ||
| 164 | struct pptp_addr src_addr; | ||
| 165 | struct pptp_addr dst_addr; | ||
| 166 | u32 ack_sent, ack_recv; | ||
| 167 | u32 seq_sent, seq_recv; | ||
| 168 | int ppp_flags; | ||
| 169 | }; | ||
| 153 | #include <net/sock.h> | 170 | #include <net/sock.h> |
| 154 | 171 | ||
| 155 | struct pppox_sock { | 172 | struct pppox_sock { |
| 156 | /* struct sock must be the first member of pppox_sock */ | 173 | /* struct sock must be the first member of pppox_sock */ |
| 157 | struct sock sk; | 174 | struct sock sk; |
| 158 | struct ppp_channel chan; | 175 | struct ppp_channel chan; |
| 159 | struct pppox_sock *next; /* for hash table */ | 176 | struct pppox_sock *next; /* for hash table */ |
| 160 | union { | 177 | union { |
| 161 | struct pppoe_opt pppoe; | 178 | struct pppoe_opt pppoe; |
| 179 | struct pptp_opt pptp; | ||
| 162 | } proto; | 180 | } proto; |
| 163 | __be16 num; | 181 | __be16 num; |
| 164 | }; | 182 | }; |
| @@ -186,7 +204,7 @@ struct pppox_proto { | |||
| 186 | struct module *owner; | 204 | struct module *owner; |
| 187 | }; | 205 | }; |
| 188 | 206 | ||
| 189 | extern int register_pppox_proto(int proto_num, struct pppox_proto *pp); | 207 | extern int register_pppox_proto(int proto_num, const struct pppox_proto *pp); |
| 190 | extern void unregister_pppox_proto(int proto_num); | 208 | extern void unregister_pppox_proto(int proto_num); |
| 191 | extern void pppox_unbind_sock(struct sock *sk);/* delete ppp-channel binding */ | 209 | extern void pppox_unbind_sock(struct sock *sk);/* delete ppp-channel binding */ |
| 192 | extern int pppox_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg); | 210 | extern int pppox_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg); |
diff --git a/include/linux/if_vlan.h b/include/linux/if_vlan.h index 3d870fda8c4f..c2f3a72712ce 100644 --- a/include/linux/if_vlan.h +++ b/include/linux/if_vlan.h | |||
| @@ -16,6 +16,7 @@ | |||
| 16 | #ifdef __KERNEL__ | 16 | #ifdef __KERNEL__ |
| 17 | #include <linux/netdevice.h> | 17 | #include <linux/netdevice.h> |
| 18 | #include <linux/etherdevice.h> | 18 | #include <linux/etherdevice.h> |
| 19 | #include <linux/rtnetlink.h> | ||
| 19 | 20 | ||
| 20 | #define VLAN_HLEN 4 /* The additional bytes (on top of the Ethernet header) | 21 | #define VLAN_HLEN 4 /* The additional bytes (on top of the Ethernet header) |
| 21 | * that VLAN requires. | 22 | * that VLAN requires. |
| @@ -68,6 +69,7 @@ static inline struct vlan_ethhdr *vlan_eth_hdr(const struct sk_buff *skb) | |||
| 68 | #define VLAN_CFI_MASK 0x1000 /* Canonical Format Indicator */ | 69 | #define VLAN_CFI_MASK 0x1000 /* Canonical Format Indicator */ |
| 69 | #define VLAN_TAG_PRESENT VLAN_CFI_MASK | 70 | #define VLAN_TAG_PRESENT VLAN_CFI_MASK |
| 70 | #define VLAN_VID_MASK 0x0fff /* VLAN Identifier */ | 71 | #define VLAN_VID_MASK 0x0fff /* VLAN Identifier */ |
| 72 | #define VLAN_N_VID 4096 | ||
| 71 | 73 | ||
| 72 | /* found in socket.c */ | 74 | /* found in socket.c */ |
| 73 | extern void vlan_ioctl_set(int (*hook)(struct net *, void __user *)); | 75 | extern void vlan_ioctl_set(int (*hook)(struct net *, void __user *)); |
| @@ -76,9 +78,8 @@ extern void vlan_ioctl_set(int (*hook)(struct net *, void __user *)); | |||
| 76 | * depends on completely exhausting the VLAN identifier space. Thus | 78 | * depends on completely exhausting the VLAN identifier space. Thus |
| 77 | * it gives constant time look-up, but in many cases it wastes memory. | 79 | * it gives constant time look-up, but in many cases it wastes memory. |
| 78 | */ | 80 | */ |
| 79 | #define VLAN_GROUP_ARRAY_LEN 4096 | ||
| 80 | #define VLAN_GROUP_ARRAY_SPLIT_PARTS 8 | 81 | #define VLAN_GROUP_ARRAY_SPLIT_PARTS 8 |
| 81 | #define VLAN_GROUP_ARRAY_PART_LEN (VLAN_GROUP_ARRAY_LEN/VLAN_GROUP_ARRAY_SPLIT_PARTS) | 82 | #define VLAN_GROUP_ARRAY_PART_LEN (VLAN_N_VID/VLAN_GROUP_ARRAY_SPLIT_PARTS) |
| 82 | 83 | ||
| 83 | struct vlan_group { | 84 | struct vlan_group { |
| 84 | struct net_device *real_dev; /* The ethernet(like) device | 85 | struct net_device *real_dev; /* The ethernet(like) device |
| @@ -114,12 +115,24 @@ static inline void vlan_group_set_device(struct vlan_group *vg, | |||
| 114 | #define vlan_tx_tag_get(__skb) ((__skb)->vlan_tci & ~VLAN_TAG_PRESENT) | 115 | #define vlan_tx_tag_get(__skb) ((__skb)->vlan_tci & ~VLAN_TAG_PRESENT) |
| 115 | 116 | ||
| 116 | #if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) | 117 | #if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) |
| 118 | /* Must be invoked with rcu_read_lock or with RTNL. */ | ||
| 119 | static inline struct net_device *vlan_find_dev(struct net_device *real_dev, | ||
| 120 | u16 vlan_id) | ||
| 121 | { | ||
| 122 | struct vlan_group *grp = rcu_dereference_rtnl(real_dev->vlgrp); | ||
| 123 | |||
| 124 | if (grp) | ||
| 125 | return vlan_group_get_device(grp, vlan_id); | ||
| 126 | |||
| 127 | return NULL; | ||
| 128 | } | ||
| 129 | |||
| 117 | extern struct net_device *vlan_dev_real_dev(const struct net_device *dev); | 130 | extern struct net_device *vlan_dev_real_dev(const struct net_device *dev); |
| 118 | extern u16 vlan_dev_vlan_id(const struct net_device *dev); | 131 | extern u16 vlan_dev_vlan_id(const struct net_device *dev); |
| 119 | 132 | ||
| 120 | extern int __vlan_hwaccel_rx(struct sk_buff *skb, struct vlan_group *grp, | 133 | extern int __vlan_hwaccel_rx(struct sk_buff *skb, struct vlan_group *grp, |
| 121 | u16 vlan_tci, int polling); | 134 | u16 vlan_tci, int polling); |
| 122 | extern int vlan_hwaccel_do_receive(struct sk_buff *skb); | 135 | extern bool vlan_hwaccel_do_receive(struct sk_buff **skb); |
| 123 | extern gro_result_t | 136 | extern gro_result_t |
| 124 | vlan_gro_receive(struct napi_struct *napi, struct vlan_group *grp, | 137 | vlan_gro_receive(struct napi_struct *napi, struct vlan_group *grp, |
| 125 | unsigned int vlan_tci, struct sk_buff *skb); | 138 | unsigned int vlan_tci, struct sk_buff *skb); |
| @@ -128,6 +141,12 @@ vlan_gro_frags(struct napi_struct *napi, struct vlan_group *grp, | |||
| 128 | unsigned int vlan_tci); | 141 | unsigned int vlan_tci); |
| 129 | 142 | ||
| 130 | #else | 143 | #else |
| 144 | static inline struct net_device *vlan_find_dev(struct net_device *real_dev, | ||
| 145 | u16 vlan_id) | ||
| 146 | { | ||
| 147 | return NULL; | ||
| 148 | } | ||
| 149 | |||
| 131 | static inline struct net_device *vlan_dev_real_dev(const struct net_device *dev) | 150 | static inline struct net_device *vlan_dev_real_dev(const struct net_device *dev) |
| 132 | { | 151 | { |
| 133 | BUG(); | 152 | BUG(); |
| @@ -147,9 +166,11 @@ static inline int __vlan_hwaccel_rx(struct sk_buff *skb, struct vlan_group *grp, | |||
| 147 | return NET_XMIT_SUCCESS; | 166 | return NET_XMIT_SUCCESS; |
| 148 | } | 167 | } |
| 149 | 168 | ||
| 150 | static inline int vlan_hwaccel_do_receive(struct sk_buff *skb) | 169 | static inline bool vlan_hwaccel_do_receive(struct sk_buff **skb) |
| 151 | { | 170 | { |
| 152 | return 0; | 171 | if ((*skb)->vlan_tci & VLAN_VID_MASK) |
| 172 | (*skb)->pkt_type = PACKET_OTHERHOST; | ||
| 173 | return false; | ||
| 153 | } | 174 | } |
| 154 | 175 | ||
| 155 | static inline gro_result_t | 176 | static inline gro_result_t |
diff --git a/include/linux/in.h b/include/linux/in.h index 583c76f9c30f..beeb6dee2b49 100644 --- a/include/linux/in.h +++ b/include/linux/in.h | |||
| @@ -85,6 +85,7 @@ struct in_addr { | |||
| 85 | #define IP_RECVORIGDSTADDR IP_ORIGDSTADDR | 85 | #define IP_RECVORIGDSTADDR IP_ORIGDSTADDR |
| 86 | 86 | ||
| 87 | #define IP_MINTTL 21 | 87 | #define IP_MINTTL 21 |
| 88 | #define IP_NODEFRAG 22 | ||
| 88 | 89 | ||
| 89 | /* IP_MTU_DISCOVER values */ | 90 | /* IP_MTU_DISCOVER values */ |
| 90 | #define IP_PMTUDISC_DONT 0 /* Never send DF frames */ | 91 | #define IP_PMTUDISC_DONT 0 /* Never send DF frames */ |
| @@ -249,6 +250,25 @@ struct sockaddr_in { | |||
| 249 | 250 | ||
| 250 | #ifdef __KERNEL__ | 251 | #ifdef __KERNEL__ |
| 251 | 252 | ||
| 253 | #include <linux/errno.h> | ||
| 254 | |||
| 255 | static inline int proto_ports_offset(int proto) | ||
| 256 | { | ||
| 257 | switch (proto) { | ||
| 258 | case IPPROTO_TCP: | ||
| 259 | case IPPROTO_UDP: | ||
| 260 | case IPPROTO_DCCP: | ||
| 261 | case IPPROTO_ESP: /* SPI */ | ||
| 262 | case IPPROTO_SCTP: | ||
| 263 | case IPPROTO_UDPLITE: | ||
| 264 | return 0; | ||
| 265 | case IPPROTO_AH: /* SPI */ | ||
| 266 | return 4; | ||
| 267 | default: | ||
| 268 | return -EINVAL; | ||
| 269 | } | ||
| 270 | } | ||
| 271 | |||
| 252 | static inline bool ipv4_is_loopback(__be32 addr) | 272 | static inline bool ipv4_is_loopback(__be32 addr) |
| 253 | { | 273 | { |
| 254 | return (addr & htonl(0xff000000)) == htonl(0x7f000000); | 274 | return (addr & htonl(0xff000000)) == htonl(0x7f000000); |
diff --git a/include/linux/in6.h b/include/linux/in6.h index c4bf46f764bf..097a34b55560 100644 --- a/include/linux/in6.h +++ b/include/linux/in6.h | |||
| @@ -268,6 +268,10 @@ struct in6_flowlabel_req { | |||
| 268 | /* RFC5082: Generalized Ttl Security Mechanism */ | 268 | /* RFC5082: Generalized Ttl Security Mechanism */ |
| 269 | #define IPV6_MINHOPCOUNT 73 | 269 | #define IPV6_MINHOPCOUNT 73 |
| 270 | 270 | ||
| 271 | #define IPV6_ORIGDSTADDR 74 | ||
| 272 | #define IPV6_RECVORIGDSTADDR IPV6_ORIGDSTADDR | ||
| 273 | #define IPV6_TRANSPARENT 75 | ||
| 274 | |||
| 271 | /* | 275 | /* |
| 272 | * Multicast Routing: | 276 | * Multicast Routing: |
| 273 | * see include/linux/mroute6.h. | 277 | * see include/linux/mroute6.h. |
diff --git a/include/linux/inetdevice.h b/include/linux/inetdevice.h index 2be1a1a2beb9..ccd5b07d678d 100644 --- a/include/linux/inetdevice.h +++ b/include/linux/inetdevice.h | |||
| @@ -9,6 +9,7 @@ | |||
| 9 | #include <linux/rcupdate.h> | 9 | #include <linux/rcupdate.h> |
| 10 | #include <linux/timer.h> | 10 | #include <linux/timer.h> |
| 11 | #include <linux/sysctl.h> | 11 | #include <linux/sysctl.h> |
| 12 | #include <linux/rtnetlink.h> | ||
| 12 | 13 | ||
| 13 | enum | 14 | enum |
| 14 | { | 15 | { |
| @@ -158,7 +159,12 @@ struct in_ifaddr { | |||
| 158 | extern int register_inetaddr_notifier(struct notifier_block *nb); | 159 | extern int register_inetaddr_notifier(struct notifier_block *nb); |
| 159 | extern int unregister_inetaddr_notifier(struct notifier_block *nb); | 160 | extern int unregister_inetaddr_notifier(struct notifier_block *nb); |
| 160 | 161 | ||
| 161 | extern struct net_device *ip_dev_find(struct net *net, __be32 addr); | 162 | extern struct net_device *__ip_dev_find(struct net *net, __be32 addr, bool devref); |
| 163 | static inline struct net_device *ip_dev_find(struct net *net, __be32 addr) | ||
| 164 | { | ||
| 165 | return __ip_dev_find(net, addr, true); | ||
| 166 | } | ||
| 167 | |||
| 162 | extern int inet_addr_onlink(struct in_device *in_dev, __be32 a, __be32 b); | 168 | extern int inet_addr_onlink(struct in_device *in_dev, __be32 a, __be32 b); |
| 163 | extern int devinet_ioctl(struct net *net, unsigned int cmd, void __user *); | 169 | extern int devinet_ioctl(struct net *net, unsigned int cmd, void __user *); |
| 164 | extern void devinet_init(void); | 170 | extern void devinet_init(void); |
| @@ -198,14 +204,10 @@ static __inline__ int bad_mask(__be32 mask, __be32 addr) | |||
| 198 | 204 | ||
| 199 | static inline struct in_device *__in_dev_get_rcu(const struct net_device *dev) | 205 | static inline struct in_device *__in_dev_get_rcu(const struct net_device *dev) |
| 200 | { | 206 | { |
| 201 | struct in_device *in_dev = dev->ip_ptr; | 207 | return rcu_dereference(dev->ip_ptr); |
| 202 | if (in_dev) | ||
| 203 | in_dev = rcu_dereference(in_dev); | ||
| 204 | return in_dev; | ||
| 205 | } | 208 | } |
| 206 | 209 | ||
| 207 | static __inline__ struct in_device * | 210 | static inline struct in_device *in_dev_get(const struct net_device *dev) |
| 208 | in_dev_get(const struct net_device *dev) | ||
| 209 | { | 211 | { |
| 210 | struct in_device *in_dev; | 212 | struct in_device *in_dev; |
| 211 | 213 | ||
| @@ -217,10 +219,9 @@ in_dev_get(const struct net_device *dev) | |||
| 217 | return in_dev; | 219 | return in_dev; |
| 218 | } | 220 | } |
| 219 | 221 | ||
| 220 | static __inline__ struct in_device * | 222 | static inline struct in_device *__in_dev_get_rtnl(const struct net_device *dev) |
| 221 | __in_dev_get_rtnl(const struct net_device *dev) | ||
| 222 | { | 223 | { |
| 223 | return (struct in_device*)dev->ip_ptr; | 224 | return rcu_dereference_check(dev->ip_ptr, lockdep_rtnl_is_held()); |
| 224 | } | 225 | } |
| 225 | 226 | ||
| 226 | extern void in_dev_finish_destroy(struct in_device *idev); | 227 | extern void in_dev_finish_destroy(struct in_device *idev); |
diff --git a/include/linux/init.h b/include/linux/init.h index de994304e0bb..577671c55153 100644 --- a/include/linux/init.h +++ b/include/linux/init.h | |||
| @@ -46,16 +46,23 @@ | |||
| 46 | #define __exitdata __section(.exit.data) | 46 | #define __exitdata __section(.exit.data) |
| 47 | #define __exit_call __used __section(.exitcall.exit) | 47 | #define __exit_call __used __section(.exitcall.exit) |
| 48 | 48 | ||
| 49 | /* modpost check for section mismatches during the kernel build. | 49 | /* |
| 50 | * modpost check for section mismatches during the kernel build. | ||
| 50 | * A section mismatch happens when there are references from a | 51 | * A section mismatch happens when there are references from a |
| 51 | * code or data section to an init section (both code or data). | 52 | * code or data section to an init section (both code or data). |
| 52 | * The init sections are (for most archs) discarded by the kernel | 53 | * The init sections are (for most archs) discarded by the kernel |
| 53 | * when early init has completed so all such references are potential bugs. | 54 | * when early init has completed so all such references are potential bugs. |
| 54 | * For exit sections the same issue exists. | 55 | * For exit sections the same issue exists. |
| 56 | * | ||
| 55 | * The following markers are used for the cases where the reference to | 57 | * The following markers are used for the cases where the reference to |
| 56 | * the *init / *exit section (code or data) is valid and will teach | 58 | * the *init / *exit section (code or data) is valid and will teach |
| 57 | * modpost not to issue a warning. | 59 | * modpost not to issue a warning. Intended semantics is that a code or |
| 58 | * The markers follow same syntax rules as __init / __initdata. */ | 60 | * data tagged __ref* can reference code or data from init section without |
| 61 | * producing a warning (of course, no warning does not mean code is | ||
| 62 | * correct, so optimally document why the __ref is needed and why it's OK). | ||
| 63 | * | ||
| 64 | * The markers follow same syntax rules as __init / __initdata. | ||
| 65 | */ | ||
| 59 | #define __ref __section(.ref.text) noinline | 66 | #define __ref __section(.ref.text) noinline |
| 60 | #define __refdata __section(.ref.data) | 67 | #define __refdata __section(.ref.data) |
| 61 | #define __refconst __section(.ref.rodata) | 68 | #define __refconst __section(.ref.rodata) |
diff --git a/include/linux/init_task.h b/include/linux/init_task.h index 1f43fa56f600..1f8c06ce0fa6 100644 --- a/include/linux/init_task.h +++ b/include/linux/init_task.h | |||
| @@ -29,6 +29,8 @@ extern struct fs_struct init_fs; | |||
| 29 | .running = 0, \ | 29 | .running = 0, \ |
| 30 | .lock = __SPIN_LOCK_UNLOCKED(sig.cputimer.lock), \ | 30 | .lock = __SPIN_LOCK_UNLOCKED(sig.cputimer.lock), \ |
| 31 | }, \ | 31 | }, \ |
| 32 | .cred_guard_mutex = \ | ||
| 33 | __MUTEX_INITIALIZER(sig.cred_guard_mutex), \ | ||
| 32 | } | 34 | } |
| 33 | 35 | ||
| 34 | extern struct nsproxy init_nsproxy; | 36 | extern struct nsproxy init_nsproxy; |
| @@ -82,11 +84,17 @@ extern struct group_info init_groups; | |||
| 82 | # define CAP_INIT_BSET CAP_FULL_SET | 84 | # define CAP_INIT_BSET CAP_FULL_SET |
| 83 | 85 | ||
| 84 | #ifdef CONFIG_TREE_PREEMPT_RCU | 86 | #ifdef CONFIG_TREE_PREEMPT_RCU |
| 87 | #define INIT_TASK_RCU_TREE_PREEMPT() \ | ||
| 88 | .rcu_blocked_node = NULL, | ||
| 89 | #else | ||
| 90 | #define INIT_TASK_RCU_TREE_PREEMPT(tsk) | ||
| 91 | #endif | ||
| 92 | #ifdef CONFIG_PREEMPT_RCU | ||
| 85 | #define INIT_TASK_RCU_PREEMPT(tsk) \ | 93 | #define INIT_TASK_RCU_PREEMPT(tsk) \ |
| 86 | .rcu_read_lock_nesting = 0, \ | 94 | .rcu_read_lock_nesting = 0, \ |
| 87 | .rcu_read_unlock_special = 0, \ | 95 | .rcu_read_unlock_special = 0, \ |
| 88 | .rcu_blocked_node = NULL, \ | 96 | .rcu_node_entry = LIST_HEAD_INIT(tsk.rcu_node_entry), \ |
| 89 | .rcu_node_entry = LIST_HEAD_INIT(tsk.rcu_node_entry), | 97 | INIT_TASK_RCU_TREE_PREEMPT() |
| 90 | #else | 98 | #else |
| 91 | #define INIT_TASK_RCU_PREEMPT(tsk) | 99 | #define INIT_TASK_RCU_PREEMPT(tsk) |
| 92 | #endif | 100 | #endif |
| @@ -137,10 +145,8 @@ extern struct cred init_cred; | |||
| 137 | .children = LIST_HEAD_INIT(tsk.children), \ | 145 | .children = LIST_HEAD_INIT(tsk.children), \ |
| 138 | .sibling = LIST_HEAD_INIT(tsk.sibling), \ | 146 | .sibling = LIST_HEAD_INIT(tsk.sibling), \ |
| 139 | .group_leader = &tsk, \ | 147 | .group_leader = &tsk, \ |
| 140 | .real_cred = &init_cred, \ | 148 | RCU_INIT_POINTER(.real_cred, &init_cred), \ |
| 141 | .cred = &init_cred, \ | 149 | RCU_INIT_POINTER(.cred, &init_cred), \ |
| 142 | .cred_guard_mutex = \ | ||
| 143 | __MUTEX_INITIALIZER(tsk.cred_guard_mutex), \ | ||
| 144 | .comm = "swapper", \ | 150 | .comm = "swapper", \ |
| 145 | .thread = INIT_THREAD, \ | 151 | .thread = INIT_THREAD, \ |
| 146 | .fs = &init_fs, \ | 152 | .fs = &init_fs, \ |
diff --git a/include/linux/inotify.h b/include/linux/inotify.h index 37ea2894b3c0..d33041e2a42a 100644 --- a/include/linux/inotify.h +++ b/include/linux/inotify.h | |||
| @@ -51,6 +51,7 @@ struct inotify_event { | |||
| 51 | /* special flags */ | 51 | /* special flags */ |
| 52 | #define IN_ONLYDIR 0x01000000 /* only watch the path if it is a directory */ | 52 | #define IN_ONLYDIR 0x01000000 /* only watch the path if it is a directory */ |
| 53 | #define IN_DONT_FOLLOW 0x02000000 /* don't follow a sym link */ | 53 | #define IN_DONT_FOLLOW 0x02000000 /* don't follow a sym link */ |
| 54 | #define IN_EXCL_UNLINK 0x04000000 /* exclude events on unlinked objects */ | ||
| 54 | #define IN_MASK_ADD 0x20000000 /* add to the mask of an already existing watch */ | 55 | #define IN_MASK_ADD 0x20000000 /* add to the mask of an already existing watch */ |
| 55 | #define IN_ISDIR 0x40000000 /* event occurred against dir */ | 56 | #define IN_ISDIR 0x40000000 /* event occurred against dir */ |
| 56 | #define IN_ONESHOT 0x80000000 /* only send event once */ | 57 | #define IN_ONESHOT 0x80000000 /* only send event once */ |
| @@ -70,177 +71,17 @@ struct inotify_event { | |||
| 70 | #define IN_NONBLOCK O_NONBLOCK | 71 | #define IN_NONBLOCK O_NONBLOCK |
| 71 | 72 | ||
| 72 | #ifdef __KERNEL__ | 73 | #ifdef __KERNEL__ |
| 73 | 74 | #include <linux/sysctl.h> | |
| 74 | #include <linux/dcache.h> | 75 | extern struct ctl_table inotify_table[]; /* for sysctl */ |
| 75 | #include <linux/fs.h> | 76 | |
| 76 | 77 | #define ALL_INOTIFY_BITS (IN_ACCESS | IN_MODIFY | IN_ATTRIB | IN_CLOSE_WRITE | \ | |
| 77 | /* | 78 | IN_CLOSE_NOWRITE | IN_OPEN | IN_MOVED_FROM | \ |
| 78 | * struct inotify_watch - represents a watch request on a specific inode | 79 | IN_MOVED_TO | IN_CREATE | IN_DELETE | \ |
| 79 | * | 80 | IN_DELETE_SELF | IN_MOVE_SELF | IN_UNMOUNT | \ |
| 80 | * h_list is protected by ih->mutex of the associated inotify_handle. | 81 | IN_Q_OVERFLOW | IN_IGNORED | IN_ONLYDIR | \ |
| 81 | * i_list, mask are protected by inode->inotify_mutex of the associated inode. | 82 | IN_DONT_FOLLOW | IN_EXCL_UNLINK | IN_MASK_ADD | \ |
| 82 | * ih, inode, and wd are never written to once the watch is created. | 83 | IN_ISDIR | IN_ONESHOT) |
| 83 | * | 84 | |
| 84 | * Callers must use the established inotify interfaces to access inotify_watch | 85 | #endif |
| 85 | * contents. The content of this structure is private to the inotify | ||
| 86 | * implementation. | ||
| 87 | */ | ||
| 88 | struct inotify_watch { | ||
| 89 | struct list_head h_list; /* entry in inotify_handle's list */ | ||
| 90 | struct list_head i_list; /* entry in inode's list */ | ||
| 91 | atomic_t count; /* reference count */ | ||
| 92 | struct inotify_handle *ih; /* associated inotify handle */ | ||
| 93 | struct inode *inode; /* associated inode */ | ||
| 94 | __s32 wd; /* watch descriptor */ | ||
| 95 | __u32 mask; /* event mask for this watch */ | ||
| 96 | }; | ||
| 97 | |||
| 98 | struct inotify_operations { | ||
| 99 | void (*handle_event)(struct inotify_watch *, u32, u32, u32, | ||
| 100 | const char *, struct inode *); | ||
| 101 | void (*destroy_watch)(struct inotify_watch *); | ||
| 102 | }; | ||
| 103 | |||
| 104 | #ifdef CONFIG_INOTIFY | ||
| 105 | |||
| 106 | /* Kernel API for producing events */ | ||
| 107 | |||
| 108 | extern void inotify_d_instantiate(struct dentry *, struct inode *); | ||
| 109 | extern void inotify_d_move(struct dentry *); | ||
| 110 | extern void inotify_inode_queue_event(struct inode *, __u32, __u32, | ||
| 111 | const char *, struct inode *); | ||
| 112 | extern void inotify_dentry_parent_queue_event(struct dentry *, __u32, __u32, | ||
| 113 | const char *); | ||
| 114 | extern void inotify_unmount_inodes(struct list_head *); | ||
| 115 | extern void inotify_inode_is_dead(struct inode *); | ||
| 116 | extern u32 inotify_get_cookie(void); | ||
| 117 | |||
| 118 | /* Kernel Consumer API */ | ||
| 119 | |||
| 120 | extern struct inotify_handle *inotify_init(const struct inotify_operations *); | ||
| 121 | extern void inotify_init_watch(struct inotify_watch *); | ||
| 122 | extern void inotify_destroy(struct inotify_handle *); | ||
| 123 | extern __s32 inotify_find_watch(struct inotify_handle *, struct inode *, | ||
| 124 | struct inotify_watch **); | ||
| 125 | extern __s32 inotify_find_update_watch(struct inotify_handle *, struct inode *, | ||
| 126 | u32); | ||
| 127 | extern __s32 inotify_add_watch(struct inotify_handle *, struct inotify_watch *, | ||
| 128 | struct inode *, __u32); | ||
| 129 | extern __s32 inotify_clone_watch(struct inotify_watch *, struct inotify_watch *); | ||
| 130 | extern void inotify_evict_watch(struct inotify_watch *); | ||
| 131 | extern int inotify_rm_watch(struct inotify_handle *, struct inotify_watch *); | ||
| 132 | extern int inotify_rm_wd(struct inotify_handle *, __u32); | ||
| 133 | extern void inotify_remove_watch_locked(struct inotify_handle *, | ||
| 134 | struct inotify_watch *); | ||
| 135 | extern void get_inotify_watch(struct inotify_watch *); | ||
| 136 | extern void put_inotify_watch(struct inotify_watch *); | ||
| 137 | extern int pin_inotify_watch(struct inotify_watch *); | ||
| 138 | extern void unpin_inotify_watch(struct inotify_watch *); | ||
| 139 | |||
| 140 | #else | ||
| 141 | |||
| 142 | static inline void inotify_d_instantiate(struct dentry *dentry, | ||
| 143 | struct inode *inode) | ||
| 144 | { | ||
| 145 | } | ||
| 146 | |||
| 147 | static inline void inotify_d_move(struct dentry *dentry) | ||
| 148 | { | ||
| 149 | } | ||
| 150 | |||
| 151 | static inline void inotify_inode_queue_event(struct inode *inode, | ||
| 152 | __u32 mask, __u32 cookie, | ||
| 153 | const char *filename, | ||
| 154 | struct inode *n_inode) | ||
| 155 | { | ||
| 156 | } | ||
| 157 | |||
| 158 | static inline void inotify_dentry_parent_queue_event(struct dentry *dentry, | ||
| 159 | __u32 mask, __u32 cookie, | ||
| 160 | const char *filename) | ||
| 161 | { | ||
| 162 | } | ||
| 163 | |||
| 164 | static inline void inotify_unmount_inodes(struct list_head *list) | ||
| 165 | { | ||
| 166 | } | ||
| 167 | |||
| 168 | static inline void inotify_inode_is_dead(struct inode *inode) | ||
| 169 | { | ||
| 170 | } | ||
| 171 | |||
| 172 | static inline u32 inotify_get_cookie(void) | ||
| 173 | { | ||
| 174 | return 0; | ||
| 175 | } | ||
| 176 | |||
| 177 | static inline struct inotify_handle *inotify_init(const struct inotify_operations *ops) | ||
| 178 | { | ||
| 179 | return ERR_PTR(-EOPNOTSUPP); | ||
| 180 | } | ||
| 181 | |||
| 182 | static inline void inotify_init_watch(struct inotify_watch *watch) | ||
| 183 | { | ||
| 184 | } | ||
| 185 | |||
| 186 | static inline void inotify_destroy(struct inotify_handle *ih) | ||
| 187 | { | ||
| 188 | } | ||
| 189 | |||
| 190 | static inline __s32 inotify_find_watch(struct inotify_handle *ih, struct inode *inode, | ||
| 191 | struct inotify_watch **watchp) | ||
| 192 | { | ||
| 193 | return -EOPNOTSUPP; | ||
| 194 | } | ||
| 195 | |||
| 196 | static inline __s32 inotify_find_update_watch(struct inotify_handle *ih, | ||
| 197 | struct inode *inode, u32 mask) | ||
| 198 | { | ||
| 199 | return -EOPNOTSUPP; | ||
| 200 | } | ||
| 201 | |||
| 202 | static inline __s32 inotify_add_watch(struct inotify_handle *ih, | ||
| 203 | struct inotify_watch *watch, | ||
| 204 | struct inode *inode, __u32 mask) | ||
| 205 | { | ||
| 206 | return -EOPNOTSUPP; | ||
| 207 | } | ||
| 208 | |||
| 209 | static inline int inotify_rm_watch(struct inotify_handle *ih, | ||
| 210 | struct inotify_watch *watch) | ||
| 211 | { | ||
| 212 | return -EOPNOTSUPP; | ||
| 213 | } | ||
| 214 | |||
| 215 | static inline int inotify_rm_wd(struct inotify_handle *ih, __u32 wd) | ||
| 216 | { | ||
| 217 | return -EOPNOTSUPP; | ||
| 218 | } | ||
| 219 | |||
| 220 | static inline void inotify_remove_watch_locked(struct inotify_handle *ih, | ||
| 221 | struct inotify_watch *watch) | ||
| 222 | { | ||
| 223 | } | ||
| 224 | |||
| 225 | static inline void get_inotify_watch(struct inotify_watch *watch) | ||
| 226 | { | ||
| 227 | } | ||
| 228 | |||
| 229 | static inline void put_inotify_watch(struct inotify_watch *watch) | ||
| 230 | { | ||
| 231 | } | ||
| 232 | |||
| 233 | extern inline int pin_inotify_watch(struct inotify_watch *watch) | ||
| 234 | { | ||
| 235 | return 0; | ||
| 236 | } | ||
| 237 | |||
| 238 | extern inline void unpin_inotify_watch(struct inotify_watch *watch) | ||
| 239 | { | ||
| 240 | } | ||
| 241 | |||
| 242 | #endif /* CONFIG_INOTIFY */ | ||
| 243 | |||
| 244 | #endif /* __KERNEL __ */ | ||
| 245 | 86 | ||
| 246 | #endif /* _LINUX_INOTIFY_H */ | 87 | #endif /* _LINUX_INOTIFY_H */ |
diff --git a/include/linux/input.h b/include/linux/input.h index 6fcc9101beeb..51af441f3a21 100644 --- a/include/linux/input.h +++ b/include/linux/input.h | |||
| @@ -34,7 +34,7 @@ struct input_event { | |||
| 34 | * Protocol version. | 34 | * Protocol version. |
| 35 | */ | 35 | */ |
| 36 | 36 | ||
| 37 | #define EV_VERSION 0x010000 | 37 | #define EV_VERSION 0x010001 |
| 38 | 38 | ||
| 39 | /* | 39 | /* |
| 40 | * IOCTLs (0x00 - 0x7f) | 40 | * IOCTLs (0x00 - 0x7f) |
| @@ -56,25 +56,50 @@ struct input_absinfo { | |||
| 56 | __s32 resolution; | 56 | __s32 resolution; |
| 57 | }; | 57 | }; |
| 58 | 58 | ||
| 59 | /** | ||
| 60 | * struct input_keymap_entry - used by EVIOCGKEYCODE/EVIOCSKEYCODE ioctls | ||
| 61 | * @scancode: scancode represented in machine-endian form. | ||
| 62 | * @len: length of the scancode that resides in @scancode buffer. | ||
| 63 | * @index: index in the keymap, may be used instead of scancode | ||
| 64 | * @flags: allows to specify how kernel should handle the request. For | ||
| 65 | * example, setting INPUT_KEYMAP_BY_INDEX flag indicates that kernel | ||
| 66 | * should perform lookup in keymap by @index instead of @scancode | ||
| 67 | * @keycode: key code assigned to this scancode | ||
| 68 | * | ||
| 69 | * The structure is used to retrieve and modify keymap data. Users have | ||
| 70 | * option of performing lookup either by @scancode itself or by @index | ||
| 71 | * in keymap entry. EVIOCGKEYCODE will also return scancode or index | ||
| 72 | * (depending on which element was used to perform lookup). | ||
| 73 | */ | ||
| 74 | struct input_keymap_entry { | ||
| 75 | #define INPUT_KEYMAP_BY_INDEX (1 << 0) | ||
| 76 | __u8 flags; | ||
| 77 | __u8 len; | ||
| 78 | __u16 index; | ||
| 79 | __u32 keycode; | ||
| 80 | __u8 scancode[32]; | ||
| 81 | }; | ||
| 82 | |||
| 59 | #define EVIOCGVERSION _IOR('E', 0x01, int) /* get driver version */ | 83 | #define EVIOCGVERSION _IOR('E', 0x01, int) /* get driver version */ |
| 60 | #define EVIOCGID _IOR('E', 0x02, struct input_id) /* get device ID */ | 84 | #define EVIOCGID _IOR('E', 0x02, struct input_id) /* get device ID */ |
| 61 | #define EVIOCGREP _IOR('E', 0x03, unsigned int[2]) /* get repeat settings */ | 85 | #define EVIOCGREP _IOR('E', 0x03, unsigned int[2]) /* get repeat settings */ |
| 62 | #define EVIOCSREP _IOW('E', 0x03, unsigned int[2]) /* set repeat settings */ | 86 | #define EVIOCSREP _IOW('E', 0x03, unsigned int[2]) /* set repeat settings */ |
| 63 | #define EVIOCGKEYCODE _IOR('E', 0x04, unsigned int[2]) /* get keycode */ | 87 | |
| 64 | #define EVIOCSKEYCODE _IOW('E', 0x04, unsigned int[2]) /* set keycode */ | 88 | #define EVIOCGKEYCODE _IOR('E', 0x04, struct input_keymap_entry) /* get keycode */ |
| 89 | #define EVIOCSKEYCODE _IOW('E', 0x04, struct input_keymap_entry) /* set keycode */ | ||
| 65 | 90 | ||
| 66 | #define EVIOCGNAME(len) _IOC(_IOC_READ, 'E', 0x06, len) /* get device name */ | 91 | #define EVIOCGNAME(len) _IOC(_IOC_READ, 'E', 0x06, len) /* get device name */ |
| 67 | #define EVIOCGPHYS(len) _IOC(_IOC_READ, 'E', 0x07, len) /* get physical location */ | 92 | #define EVIOCGPHYS(len) _IOC(_IOC_READ, 'E', 0x07, len) /* get physical location */ |
| 68 | #define EVIOCGUNIQ(len) _IOC(_IOC_READ, 'E', 0x08, len) /* get unique identifier */ | 93 | #define EVIOCGUNIQ(len) _IOC(_IOC_READ, 'E', 0x08, len) /* get unique identifier */ |
| 69 | 94 | ||
| 70 | #define EVIOCGKEY(len) _IOC(_IOC_READ, 'E', 0x18, len) /* get global keystate */ | 95 | #define EVIOCGKEY(len) _IOC(_IOC_READ, 'E', 0x18, len) /* get global key state */ |
| 71 | #define EVIOCGLED(len) _IOC(_IOC_READ, 'E', 0x19, len) /* get all LEDs */ | 96 | #define EVIOCGLED(len) _IOC(_IOC_READ, 'E', 0x19, len) /* get all LEDs */ |
| 72 | #define EVIOCGSND(len) _IOC(_IOC_READ, 'E', 0x1a, len) /* get all sounds status */ | 97 | #define EVIOCGSND(len) _IOC(_IOC_READ, 'E', 0x1a, len) /* get all sounds status */ |
| 73 | #define EVIOCGSW(len) _IOC(_IOC_READ, 'E', 0x1b, len) /* get all switch states */ | 98 | #define EVIOCGSW(len) _IOC(_IOC_READ, 'E', 0x1b, len) /* get all switch states */ |
| 74 | 99 | ||
| 75 | #define EVIOCGBIT(ev,len) _IOC(_IOC_READ, 'E', 0x20 + ev, len) /* get event bits */ | 100 | #define EVIOCGBIT(ev,len) _IOC(_IOC_READ, 'E', 0x20 + ev, len) /* get event bits */ |
| 76 | #define EVIOCGABS(abs) _IOR('E', 0x40 + abs, struct input_absinfo) /* get abs value/limits */ | 101 | #define EVIOCGABS(abs) _IOR('E', 0x40 + abs, struct input_absinfo) /* get abs value/limits */ |
| 77 | #define EVIOCSABS(abs) _IOW('E', 0xc0 + abs, struct input_absinfo) /* set abs value/limits */ | 102 | #define EVIOCSABS(abs) _IOW('E', 0xc0 + abs, struct input_absinfo) /* set abs value/limits */ |
| 78 | 103 | ||
| 79 | #define EVIOCSFF _IOC(_IOC_WRITE, 'E', 0x80, sizeof(struct ff_effect)) /* send a force effect to a force feedback device */ | 104 | #define EVIOCSFF _IOC(_IOC_WRITE, 'E', 0x80, sizeof(struct ff_effect)) /* send a force effect to a force feedback device */ |
| 80 | #define EVIOCRMFF _IOW('E', 0x81, int) /* Erase a force effect */ | 105 | #define EVIOCRMFF _IOW('E', 0x81, int) /* Erase a force effect */ |
| @@ -691,9 +716,12 @@ struct input_absinfo { | |||
| 691 | #define ABS_TILT_X 0x1a | 716 | #define ABS_TILT_X 0x1a |
| 692 | #define ABS_TILT_Y 0x1b | 717 | #define ABS_TILT_Y 0x1b |
| 693 | #define ABS_TOOL_WIDTH 0x1c | 718 | #define ABS_TOOL_WIDTH 0x1c |
| 719 | |||
| 694 | #define ABS_VOLUME 0x20 | 720 | #define ABS_VOLUME 0x20 |
| 721 | |||
| 695 | #define ABS_MISC 0x28 | 722 | #define ABS_MISC 0x28 |
| 696 | 723 | ||
| 724 | #define ABS_MT_SLOT 0x2f /* MT slot being modified */ | ||
| 697 | #define ABS_MT_TOUCH_MAJOR 0x30 /* Major axis of touching ellipse */ | 725 | #define ABS_MT_TOUCH_MAJOR 0x30 /* Major axis of touching ellipse */ |
| 698 | #define ABS_MT_TOUCH_MINOR 0x31 /* Minor axis (omit if circular) */ | 726 | #define ABS_MT_TOUCH_MINOR 0x31 /* Minor axis (omit if circular) */ |
| 699 | #define ABS_MT_WIDTH_MAJOR 0x32 /* Major axis of approaching ellipse */ | 727 | #define ABS_MT_WIDTH_MAJOR 0x32 /* Major axis of approaching ellipse */ |
| @@ -706,6 +734,12 @@ struct input_absinfo { | |||
| 706 | #define ABS_MT_TRACKING_ID 0x39 /* Unique ID of initiated contact */ | 734 | #define ABS_MT_TRACKING_ID 0x39 /* Unique ID of initiated contact */ |
| 707 | #define ABS_MT_PRESSURE 0x3a /* Pressure on contact area */ | 735 | #define ABS_MT_PRESSURE 0x3a /* Pressure on contact area */ |
| 708 | 736 | ||
| 737 | #ifdef __KERNEL__ | ||
| 738 | /* Implementation details, userspace should not care about these */ | ||
| 739 | #define ABS_MT_FIRST ABS_MT_TOUCH_MAJOR | ||
| 740 | #define ABS_MT_LAST ABS_MT_PRESSURE | ||
| 741 | #endif | ||
| 742 | |||
| 709 | #define ABS_MAX 0x3f | 743 | #define ABS_MAX 0x3f |
| 710 | #define ABS_CNT (ABS_MAX+1) | 744 | #define ABS_CNT (ABS_MAX+1) |
| 711 | 745 | ||
| @@ -767,6 +801,7 @@ struct input_absinfo { | |||
| 767 | #define REP_DELAY 0x00 | 801 | #define REP_DELAY 0x00 |
| 768 | #define REP_PERIOD 0x01 | 802 | #define REP_PERIOD 0x01 |
| 769 | #define REP_MAX 0x01 | 803 | #define REP_MAX 0x01 |
| 804 | #define REP_CNT (REP_MAX+1) | ||
| 770 | 805 | ||
| 771 | /* | 806 | /* |
| 772 | * Sounds | 807 | * Sounds |
| @@ -1048,6 +1083,14 @@ struct ff_effect { | |||
| 1048 | #include <linux/mod_devicetable.h> | 1083 | #include <linux/mod_devicetable.h> |
| 1049 | 1084 | ||
| 1050 | /** | 1085 | /** |
| 1086 | * struct input_mt_slot - represents the state of an input MT slot | ||
| 1087 | * @abs: holds current values of ABS_MT axes for this slot | ||
| 1088 | */ | ||
| 1089 | struct input_mt_slot { | ||
| 1090 | int abs[ABS_MT_LAST - ABS_MT_FIRST + 1]; | ||
| 1091 | }; | ||
| 1092 | |||
| 1093 | /** | ||
| 1051 | * struct input_dev - represents an input device | 1094 | * struct input_dev - represents an input device |
| 1052 | * @name: name of the device | 1095 | * @name: name of the device |
| 1053 | * @phys: physical path to the device in the system hierarchy | 1096 | * @phys: physical path to the device in the system hierarchy |
| @@ -1063,33 +1106,37 @@ struct ff_effect { | |||
| 1063 | * @sndbit: bitmap of sound effects supported by the device | 1106 | * @sndbit: bitmap of sound effects supported by the device |
| 1064 | * @ffbit: bitmap of force feedback effects supported by the device | 1107 | * @ffbit: bitmap of force feedback effects supported by the device |
| 1065 | * @swbit: bitmap of switches present on the device | 1108 | * @swbit: bitmap of switches present on the device |
| 1109 | * @hint_events_per_packet: average number of events generated by the | ||
| 1110 | * device in a packet (between EV_SYN/SYN_REPORT events). Used by | ||
| 1111 | * event handlers to estimate size of the buffer needed to hold | ||
| 1112 | * events. | ||
| 1066 | * @keycodemax: size of keycode table | 1113 | * @keycodemax: size of keycode table |
| 1067 | * @keycodesize: size of elements in keycode table | 1114 | * @keycodesize: size of elements in keycode table |
| 1068 | * @keycode: map of scancodes to keycodes for this device | 1115 | * @keycode: map of scancodes to keycodes for this device |
| 1116 | * @getkeycode: optional legacy method to retrieve current keymap. | ||
| 1069 | * @setkeycode: optional method to alter current keymap, used to implement | 1117 | * @setkeycode: optional method to alter current keymap, used to implement |
| 1070 | * sparse keymaps. If not supplied default mechanism will be used. | 1118 | * sparse keymaps. If not supplied default mechanism will be used. |
| 1071 | * The method is being called while holding event_lock and thus must | 1119 | * The method is being called while holding event_lock and thus must |
| 1072 | * not sleep | 1120 | * not sleep |
| 1073 | * @getkeycode: optional method to retrieve current keymap. If not supplied | 1121 | * @getkeycode_new: transition method |
| 1074 | * default mechanism will be used. The method is being called while | 1122 | * @setkeycode_new: transition method |
| 1075 | * holding event_lock and thus must not sleep | ||
| 1076 | * @ff: force feedback structure associated with the device if device | 1123 | * @ff: force feedback structure associated with the device if device |
| 1077 | * supports force feedback effects | 1124 | * supports force feedback effects |
| 1078 | * @repeat_key: stores key code of the last key pressed; used to implement | 1125 | * @repeat_key: stores key code of the last key pressed; used to implement |
| 1079 | * software autorepeat | 1126 | * software autorepeat |
| 1080 | * @timer: timer for software autorepeat | 1127 | * @timer: timer for software autorepeat |
| 1081 | * @sync: set to 1 when there were no new events since last EV_SYNC | ||
| 1082 | * @abs: current values for reports from absolute axes | ||
| 1083 | * @rep: current values for autorepeat parameters (delay, rate) | 1128 | * @rep: current values for autorepeat parameters (delay, rate) |
| 1129 | * @mt: pointer to array of struct input_mt_slot holding current values | ||
| 1130 | * of tracked contacts | ||
| 1131 | * @mtsize: number of MT slots the device uses | ||
| 1132 | * @slot: MT slot currently being transmitted | ||
| 1133 | * @absinfo: array of &struct absinfo elements holding information | ||
| 1134 | * about absolute axes (current value, min, max, flat, fuzz, | ||
| 1135 | * resolution) | ||
| 1084 | * @key: reflects current state of device's keys/buttons | 1136 | * @key: reflects current state of device's keys/buttons |
| 1085 | * @led: reflects current state of device's LEDs | 1137 | * @led: reflects current state of device's LEDs |
| 1086 | * @snd: reflects current state of sound effects | 1138 | * @snd: reflects current state of sound effects |
| 1087 | * @sw: reflects current state of device's switches | 1139 | * @sw: reflects current state of device's switches |
| 1088 | * @absmax: maximum values for events coming from absolute axes | ||
| 1089 | * @absmin: minimum values for events coming from absolute axes | ||
| 1090 | * @absfuzz: describes noisiness for axes | ||
| 1091 | * @absflat: size of the center flat position (used by joydev) | ||
| 1092 | * @absres: resolution used for events coming form absolute axes | ||
| 1093 | * @open: this method is called when the very first user calls | 1140 | * @open: this method is called when the very first user calls |
| 1094 | * input_open_device(). The driver must prepare the device | 1141 | * input_open_device(). The driver must prepare the device |
| 1095 | * to start generating events (start polling thread, | 1142 | * to start generating events (start polling thread, |
| @@ -1119,6 +1166,7 @@ struct ff_effect { | |||
| 1119 | * last user closes the device | 1166 | * last user closes the device |
| 1120 | * @going_away: marks devices that are in a middle of unregistering and | 1167 | * @going_away: marks devices that are in a middle of unregistering and |
| 1121 | * causes input_open_device*() fail with -ENODEV. | 1168 | * causes input_open_device*() fail with -ENODEV. |
| 1169 | * @sync: set to %true when there were no new events since last EV_SYN | ||
| 1122 | * @dev: driver model's view of this device | 1170 | * @dev: driver model's view of this device |
| 1123 | * @h_list: list of input handles associated with the device. When | 1171 | * @h_list: list of input handles associated with the device. When |
| 1124 | * accessing the list dev->mutex must be held | 1172 | * accessing the list dev->mutex must be held |
| @@ -1140,41 +1188,46 @@ struct input_dev { | |||
| 1140 | unsigned long ffbit[BITS_TO_LONGS(FF_CNT)]; | 1188 | unsigned long ffbit[BITS_TO_LONGS(FF_CNT)]; |
| 1141 | unsigned long swbit[BITS_TO_LONGS(SW_CNT)]; | 1189 | unsigned long swbit[BITS_TO_LONGS(SW_CNT)]; |
| 1142 | 1190 | ||
| 1191 | unsigned int hint_events_per_packet; | ||
| 1192 | |||
| 1143 | unsigned int keycodemax; | 1193 | unsigned int keycodemax; |
| 1144 | unsigned int keycodesize; | 1194 | unsigned int keycodesize; |
| 1145 | void *keycode; | 1195 | void *keycode; |
| 1196 | |||
| 1146 | int (*setkeycode)(struct input_dev *dev, | 1197 | int (*setkeycode)(struct input_dev *dev, |
| 1147 | unsigned int scancode, unsigned int keycode); | 1198 | unsigned int scancode, unsigned int keycode); |
| 1148 | int (*getkeycode)(struct input_dev *dev, | 1199 | int (*getkeycode)(struct input_dev *dev, |
| 1149 | unsigned int scancode, unsigned int *keycode); | 1200 | unsigned int scancode, unsigned int *keycode); |
| 1201 | int (*setkeycode_new)(struct input_dev *dev, | ||
| 1202 | const struct input_keymap_entry *ke, | ||
| 1203 | unsigned int *old_keycode); | ||
| 1204 | int (*getkeycode_new)(struct input_dev *dev, | ||
| 1205 | struct input_keymap_entry *ke); | ||
| 1150 | 1206 | ||
| 1151 | struct ff_device *ff; | 1207 | struct ff_device *ff; |
| 1152 | 1208 | ||
| 1153 | unsigned int repeat_key; | 1209 | unsigned int repeat_key; |
| 1154 | struct timer_list timer; | 1210 | struct timer_list timer; |
| 1155 | 1211 | ||
| 1156 | int sync; | 1212 | int rep[REP_CNT]; |
| 1157 | 1213 | ||
| 1158 | int abs[ABS_CNT]; | 1214 | struct input_mt_slot *mt; |
| 1159 | int rep[REP_MAX + 1]; | 1215 | int mtsize; |
| 1216 | int slot; | ||
| 1217 | |||
| 1218 | struct input_absinfo *absinfo; | ||
| 1160 | 1219 | ||
| 1161 | unsigned long key[BITS_TO_LONGS(KEY_CNT)]; | 1220 | unsigned long key[BITS_TO_LONGS(KEY_CNT)]; |
| 1162 | unsigned long led[BITS_TO_LONGS(LED_CNT)]; | 1221 | unsigned long led[BITS_TO_LONGS(LED_CNT)]; |
| 1163 | unsigned long snd[BITS_TO_LONGS(SND_CNT)]; | 1222 | unsigned long snd[BITS_TO_LONGS(SND_CNT)]; |
| 1164 | unsigned long sw[BITS_TO_LONGS(SW_CNT)]; | 1223 | unsigned long sw[BITS_TO_LONGS(SW_CNT)]; |
| 1165 | 1224 | ||
| 1166 | int absmax[ABS_CNT]; | ||
| 1167 | int absmin[ABS_CNT]; | ||
| 1168 | int absfuzz[ABS_CNT]; | ||
| 1169 | int absflat[ABS_CNT]; | ||
| 1170 | int absres[ABS_CNT]; | ||
| 1171 | |||
| 1172 | int (*open)(struct input_dev *dev); | 1225 | int (*open)(struct input_dev *dev); |
| 1173 | void (*close)(struct input_dev *dev); | 1226 | void (*close)(struct input_dev *dev); |
| 1174 | int (*flush)(struct input_dev *dev, struct file *file); | 1227 | int (*flush)(struct input_dev *dev, struct file *file); |
| 1175 | int (*event)(struct input_dev *dev, unsigned int type, unsigned int code, int value); | 1228 | int (*event)(struct input_dev *dev, unsigned int type, unsigned int code, int value); |
| 1176 | 1229 | ||
| 1177 | struct input_handle *grab; | 1230 | struct input_handle __rcu *grab; |
| 1178 | 1231 | ||
| 1179 | spinlock_t event_lock; | 1232 | spinlock_t event_lock; |
| 1180 | struct mutex mutex; | 1233 | struct mutex mutex; |
| @@ -1182,6 +1235,8 @@ struct input_dev { | |||
| 1182 | unsigned int users; | 1235 | unsigned int users; |
| 1183 | bool going_away; | 1236 | bool going_away; |
| 1184 | 1237 | ||
| 1238 | bool sync; | ||
| 1239 | |||
| 1185 | struct device dev; | 1240 | struct device dev; |
| 1186 | 1241 | ||
| 1187 | struct list_head h_list; | 1242 | struct list_head h_list; |
| @@ -1406,22 +1461,60 @@ static inline void input_mt_sync(struct input_dev *dev) | |||
| 1406 | input_event(dev, EV_SYN, SYN_MT_REPORT, 0); | 1461 | input_event(dev, EV_SYN, SYN_MT_REPORT, 0); |
| 1407 | } | 1462 | } |
| 1408 | 1463 | ||
| 1464 | static inline void input_mt_slot(struct input_dev *dev, int slot) | ||
| 1465 | { | ||
| 1466 | input_event(dev, EV_ABS, ABS_MT_SLOT, slot); | ||
| 1467 | } | ||
| 1468 | |||
| 1409 | void input_set_capability(struct input_dev *dev, unsigned int type, unsigned int code); | 1469 | void input_set_capability(struct input_dev *dev, unsigned int type, unsigned int code); |
| 1410 | 1470 | ||
| 1411 | static inline void input_set_abs_params(struct input_dev *dev, int axis, int min, int max, int fuzz, int flat) | 1471 | /** |
| 1472 | * input_set_events_per_packet - tell handlers about the driver event rate | ||
| 1473 | * @dev: the input device used by the driver | ||
| 1474 | * @n_events: the average number of events between calls to input_sync() | ||
| 1475 | * | ||
| 1476 | * If the event rate sent from a device is unusually large, use this | ||
| 1477 | * function to set the expected event rate. This will allow handlers | ||
| 1478 | * to set up an appropriate buffer size for the event stream, in order | ||
| 1479 | * to minimize information loss. | ||
| 1480 | */ | ||
| 1481 | static inline void input_set_events_per_packet(struct input_dev *dev, int n_events) | ||
| 1412 | { | 1482 | { |
| 1413 | dev->absmin[axis] = min; | 1483 | dev->hint_events_per_packet = n_events; |
| 1414 | dev->absmax[axis] = max; | 1484 | } |
| 1415 | dev->absfuzz[axis] = fuzz; | ||
| 1416 | dev->absflat[axis] = flat; | ||
| 1417 | 1485 | ||
| 1418 | dev->absbit[BIT_WORD(axis)] |= BIT_MASK(axis); | 1486 | void input_alloc_absinfo(struct input_dev *dev); |
| 1487 | void input_set_abs_params(struct input_dev *dev, unsigned int axis, | ||
| 1488 | int min, int max, int fuzz, int flat); | ||
| 1489 | |||
| 1490 | #define INPUT_GENERATE_ABS_ACCESSORS(_suffix, _item) \ | ||
| 1491 | static inline int input_abs_get_##_suffix(struct input_dev *dev, \ | ||
| 1492 | unsigned int axis) \ | ||
| 1493 | { \ | ||
| 1494 | return dev->absinfo ? dev->absinfo[axis]._item : 0; \ | ||
| 1495 | } \ | ||
| 1496 | \ | ||
| 1497 | static inline void input_abs_set_##_suffix(struct input_dev *dev, \ | ||
| 1498 | unsigned int axis, int val) \ | ||
| 1499 | { \ | ||
| 1500 | input_alloc_absinfo(dev); \ | ||
| 1501 | if (dev->absinfo) \ | ||
| 1502 | dev->absinfo[axis]._item = val; \ | ||
| 1419 | } | 1503 | } |
| 1420 | 1504 | ||
| 1421 | int input_get_keycode(struct input_dev *dev, | 1505 | INPUT_GENERATE_ABS_ACCESSORS(val, value) |
| 1422 | unsigned int scancode, unsigned int *keycode); | 1506 | INPUT_GENERATE_ABS_ACCESSORS(min, minimum) |
| 1507 | INPUT_GENERATE_ABS_ACCESSORS(max, maximum) | ||
| 1508 | INPUT_GENERATE_ABS_ACCESSORS(fuzz, fuzz) | ||
| 1509 | INPUT_GENERATE_ABS_ACCESSORS(flat, flat) | ||
| 1510 | INPUT_GENERATE_ABS_ACCESSORS(res, resolution) | ||
| 1511 | |||
| 1512 | int input_scancode_to_scalar(const struct input_keymap_entry *ke, | ||
| 1513 | unsigned int *scancode); | ||
| 1514 | |||
| 1515 | int input_get_keycode(struct input_dev *dev, struct input_keymap_entry *ke); | ||
| 1423 | int input_set_keycode(struct input_dev *dev, | 1516 | int input_set_keycode(struct input_dev *dev, |
| 1424 | unsigned int scancode, unsigned int keycode); | 1517 | const struct input_keymap_entry *ke); |
| 1425 | 1518 | ||
| 1426 | extern struct class input_class; | 1519 | extern struct class input_class; |
| 1427 | 1520 | ||
| @@ -1485,5 +1578,8 @@ int input_ff_erase(struct input_dev *dev, int effect_id, struct file *file); | |||
| 1485 | int input_ff_create_memless(struct input_dev *dev, void *data, | 1578 | int input_ff_create_memless(struct input_dev *dev, void *data, |
| 1486 | int (*play_effect)(struct input_dev *, void *, struct ff_effect *)); | 1579 | int (*play_effect)(struct input_dev *, void *, struct ff_effect *)); |
| 1487 | 1580 | ||
| 1581 | int input_mt_create_slots(struct input_dev *dev, unsigned int num_slots); | ||
| 1582 | void input_mt_destroy_slots(struct input_dev *dev); | ||
| 1583 | |||
| 1488 | #endif | 1584 | #endif |
| 1489 | #endif | 1585 | #endif |
diff --git a/include/linux/input/adxl34x.h b/include/linux/input/adxl34x.h new file mode 100644 index 000000000000..df00d998a44a --- /dev/null +++ b/include/linux/input/adxl34x.h | |||
| @@ -0,0 +1,349 @@ | |||
| 1 | /* | ||
| 2 | * include/linux/input/adxl34x.h | ||
| 3 | * | ||
| 4 | * Digital Accelerometer characteristics are highly application specific | ||
| 5 | * and may vary between boards and models. The platform_data for the | ||
| 6 | * device's "struct device" holds this information. | ||
| 7 | * | ||
| 8 | * Copyright 2009 Analog Devices Inc. | ||
| 9 | * | ||
| 10 | * Licensed under the GPL-2 or later. | ||
| 11 | */ | ||
| 12 | |||
| 13 | #ifndef __LINUX_INPUT_ADXL34X_H__ | ||
| 14 | #define __LINUX_INPUT_ADXL34X_H__ | ||
| 15 | |||
| 16 | struct adxl34x_platform_data { | ||
| 17 | |||
| 18 | /* | ||
| 19 | * X,Y,Z Axis Offset: | ||
| 20 | * offer user offset adjustments in twoscompliment | ||
| 21 | * form with a scale factor of 15.6 mg/LSB (i.e. 0x7F = +2 g) | ||
| 22 | */ | ||
| 23 | |||
| 24 | s8 x_axis_offset; | ||
| 25 | s8 y_axis_offset; | ||
| 26 | s8 z_axis_offset; | ||
| 27 | |||
| 28 | /* | ||
| 29 | * TAP_X/Y/Z Enable: Setting TAP_X, Y, or Z Enable enables X, | ||
| 30 | * Y, or Z participation in Tap detection. A '0' excludes the | ||
| 31 | * selected axis from participation in Tap detection. | ||
| 32 | * Setting the SUPPRESS bit suppresses Double Tap detection if | ||
| 33 | * acceleration greater than tap_threshold is present between | ||
| 34 | * taps. | ||
| 35 | */ | ||
| 36 | |||
| 37 | #define ADXL_SUPPRESS (1 << 3) | ||
| 38 | #define ADXL_TAP_X_EN (1 << 2) | ||
| 39 | #define ADXL_TAP_Y_EN (1 << 1) | ||
| 40 | #define ADXL_TAP_Z_EN (1 << 0) | ||
| 41 | |||
| 42 | u8 tap_axis_control; | ||
| 43 | |||
| 44 | /* | ||
| 45 | * tap_threshold: | ||
| 46 | * holds the threshold value for tap detection/interrupts. | ||
| 47 | * The data format is unsigned. The scale factor is 62.5 mg/LSB | ||
| 48 | * (i.e. 0xFF = +16 g). A zero value may result in undesirable | ||
| 49 | * behavior if Tap/Double Tap is enabled. | ||
| 50 | */ | ||
| 51 | |||
| 52 | u8 tap_threshold; | ||
| 53 | |||
| 54 | /* | ||
| 55 | * tap_duration: | ||
| 56 | * is an unsigned time value representing the maximum | ||
| 57 | * time that an event must be above the tap_threshold threshold | ||
| 58 | * to qualify as a tap event. The scale factor is 625 us/LSB. A zero | ||
| 59 | * value will prevent Tap/Double Tap functions from working. | ||
| 60 | */ | ||
| 61 | |||
| 62 | u8 tap_duration; | ||
| 63 | |||
| 64 | /* | ||
| 65 | * tap_latency: | ||
| 66 | * is an unsigned time value representing the wait time | ||
| 67 | * from the detection of a tap event to the opening of the time | ||
| 68 | * window tap_window for a possible second tap event. The scale | ||
| 69 | * factor is 1.25 ms/LSB. A zero value will disable the Double Tap | ||
| 70 | * function. | ||
| 71 | */ | ||
| 72 | |||
| 73 | u8 tap_latency; | ||
| 74 | |||
| 75 | /* | ||
| 76 | * tap_window: | ||
| 77 | * is an unsigned time value representing the amount | ||
| 78 | * of time after the expiration of tap_latency during which a second | ||
| 79 | * tap can begin. The scale factor is 1.25 ms/LSB. A zero value will | ||
| 80 | * disable the Double Tap function. | ||
| 81 | */ | ||
| 82 | |||
| 83 | u8 tap_window; | ||
| 84 | |||
| 85 | /* | ||
| 86 | * act_axis_control: | ||
| 87 | * X/Y/Z Enable: A '1' enables X, Y, or Z participation in activity | ||
| 88 | * or inactivity detection. A '0' excludes the selected axis from | ||
| 89 | * participation. If all of the axes are excluded, the function is | ||
| 90 | * disabled. | ||
| 91 | * AC/DC: A '0' = DC coupled operation and a '1' = AC coupled | ||
| 92 | * operation. In DC coupled operation, the current acceleration is | ||
| 93 | * compared with activity_threshold and inactivity_threshold directly | ||
| 94 | * to determine whether activity or inactivity is detected. In AC | ||
| 95 | * coupled operation for activity detection, the acceleration value | ||
| 96 | * at the start of activity detection is taken as a reference value. | ||
| 97 | * New samples of acceleration are then compared to this | ||
| 98 | * reference value and if the magnitude of the difference exceeds | ||
| 99 | * activity_threshold the device will trigger an activity interrupt. In | ||
| 100 | * AC coupled operation for inactivity detection, a reference value | ||
| 101 | * is used again for comparison and is updated whenever the | ||
| 102 | * device exceeds the inactivity threshold. Once the reference | ||
| 103 | * value is selected, the device compares the magnitude of the | ||
| 104 | * difference between the reference value and the current | ||
| 105 | * acceleration with inactivity_threshold. If the difference is below | ||
| 106 | * inactivity_threshold for a total of inactivity_time, the device is | ||
| 107 | * considered inactive and the inactivity interrupt is triggered. | ||
| 108 | */ | ||
| 109 | |||
| 110 | #define ADXL_ACT_ACDC (1 << 7) | ||
| 111 | #define ADXL_ACT_X_EN (1 << 6) | ||
| 112 | #define ADXL_ACT_Y_EN (1 << 5) | ||
| 113 | #define ADXL_ACT_Z_EN (1 << 4) | ||
| 114 | #define ADXL_INACT_ACDC (1 << 3) | ||
| 115 | #define ADXL_INACT_X_EN (1 << 2) | ||
| 116 | #define ADXL_INACT_Y_EN (1 << 1) | ||
| 117 | #define ADXL_INACT_Z_EN (1 << 0) | ||
| 118 | |||
| 119 | u8 act_axis_control; | ||
| 120 | |||
| 121 | /* | ||
| 122 | * activity_threshold: | ||
| 123 | * holds the threshold value for activity detection. | ||
| 124 | * The data format is unsigned. The scale factor is | ||
| 125 | * 62.5 mg/LSB. A zero value may result in undesirable behavior if | ||
| 126 | * Activity interrupt is enabled. | ||
| 127 | */ | ||
| 128 | |||
| 129 | u8 activity_threshold; | ||
| 130 | |||
| 131 | /* | ||
| 132 | * inactivity_threshold: | ||
| 133 | * holds the threshold value for inactivity | ||
| 134 | * detection. The data format is unsigned. The scale | ||
| 135 | * factor is 62.5 mg/LSB. A zero value may result in undesirable | ||
| 136 | * behavior if Inactivity interrupt is enabled. | ||
| 137 | */ | ||
| 138 | |||
| 139 | u8 inactivity_threshold; | ||
| 140 | |||
| 141 | /* | ||
| 142 | * inactivity_time: | ||
| 143 | * is an unsigned time value representing the | ||
| 144 | * amount of time that acceleration must be below the value in | ||
| 145 | * inactivity_threshold for inactivity to be declared. The scale factor | ||
| 146 | * is 1 second/LSB. Unlike the other interrupt functions, which | ||
| 147 | * operate on unfiltered data, the inactivity function operates on the | ||
| 148 | * filtered output data. At least one output sample must be | ||
| 149 | * generated for the inactivity interrupt to be triggered. This will | ||
| 150 | * result in the function appearing un-responsive if the | ||
| 151 | * inactivity_time register is set with a value less than the time | ||
| 152 | * constant of the Output Data Rate. A zero value will result in an | ||
| 153 | * interrupt when the output data is below inactivity_threshold. | ||
| 154 | */ | ||
| 155 | |||
| 156 | u8 inactivity_time; | ||
| 157 | |||
| 158 | /* | ||
| 159 | * free_fall_threshold: | ||
| 160 | * holds the threshold value for Free-Fall detection. | ||
| 161 | * The data format is unsigned. The root-sum-square(RSS) value | ||
| 162 | * of all axes is calculated and compared to the value in | ||
| 163 | * free_fall_threshold to determine if a free fall event may be | ||
| 164 | * occurring. The scale factor is 62.5 mg/LSB. A zero value may | ||
| 165 | * result in undesirable behavior if Free-Fall interrupt is | ||
| 166 | * enabled. Values between 300 and 600 mg (0x05 to 0x09) are | ||
| 167 | * recommended. | ||
| 168 | */ | ||
| 169 | |||
| 170 | u8 free_fall_threshold; | ||
| 171 | |||
| 172 | /* | ||
| 173 | * free_fall_time: | ||
| 174 | * is an unsigned time value representing the minimum | ||
| 175 | * time that the RSS value of all axes must be less than | ||
| 176 | * free_fall_threshold to generate a Free-Fall interrupt. The | ||
| 177 | * scale factor is 5 ms/LSB. A zero value may result in | ||
| 178 | * undesirable behavior if Free-Fall interrupt is enabled. | ||
| 179 | * Values between 100 to 350 ms (0x14 to 0x46) are recommended. | ||
| 180 | */ | ||
| 181 | |||
| 182 | u8 free_fall_time; | ||
| 183 | |||
| 184 | /* | ||
| 185 | * data_rate: | ||
| 186 | * Selects device bandwidth and output data rate. | ||
| 187 | * RATE = 3200 Hz / (2^(15 - x)). Default value is 0x0A, or 100 Hz | ||
| 188 | * Output Data Rate. An Output Data Rate should be selected that | ||
| 189 | * is appropriate for the communication protocol and frequency | ||
| 190 | * selected. Selecting too high of an Output Data Rate with a low | ||
| 191 | * communication speed will result in samples being discarded. | ||
| 192 | */ | ||
| 193 | |||
| 194 | u8 data_rate; | ||
| 195 | |||
| 196 | /* | ||
| 197 | * data_range: | ||
| 198 | * FULL_RES: When this bit is set with the device is | ||
| 199 | * in Full-Resolution Mode, where the output resolution increases | ||
| 200 | * with RANGE to maintain a 4 mg/LSB scale factor. When this | ||
| 201 | * bit is cleared the device is in 10-bit Mode and RANGE determine the | ||
| 202 | * maximum g-Range and scale factor. | ||
| 203 | */ | ||
| 204 | |||
| 205 | #define ADXL_FULL_RES (1 << 3) | ||
| 206 | #define ADXL_RANGE_PM_2g 0 | ||
| 207 | #define ADXL_RANGE_PM_4g 1 | ||
| 208 | #define ADXL_RANGE_PM_8g 2 | ||
| 209 | #define ADXL_RANGE_PM_16g 3 | ||
| 210 | |||
| 211 | u8 data_range; | ||
| 212 | |||
| 213 | /* | ||
| 214 | * low_power_mode: | ||
| 215 | * A '0' = Normal operation and a '1' = Reduced | ||
| 216 | * power operation with somewhat higher noise. | ||
| 217 | */ | ||
| 218 | |||
| 219 | u8 low_power_mode; | ||
| 220 | |||
| 221 | /* | ||
| 222 | * power_mode: | ||
| 223 | * LINK: A '1' with both the activity and inactivity functions | ||
| 224 | * enabled will delay the start of the activity function until | ||
| 225 | * inactivity is detected. Once activity is detected, inactivity | ||
| 226 | * detection will begin and prevent the detection of activity. This | ||
| 227 | * bit serially links the activity and inactivity functions. When '0' | ||
| 228 | * the inactivity and activity functions are concurrent. Additional | ||
| 229 | * information can be found in the Application section under Link | ||
| 230 | * Mode. | ||
| 231 | * AUTO_SLEEP: A '1' sets the ADXL34x to switch to Sleep Mode | ||
| 232 | * when inactivity (acceleration has been below inactivity_threshold | ||
| 233 | * for at least inactivity_time) is detected and the LINK bit is set. | ||
| 234 | * A '0' disables automatic switching to Sleep Mode. See SLEEP | ||
| 235 | * for further description. | ||
| 236 | */ | ||
| 237 | |||
| 238 | #define ADXL_LINK (1 << 5) | ||
| 239 | #define ADXL_AUTO_SLEEP (1 << 4) | ||
| 240 | |||
| 241 | u8 power_mode; | ||
| 242 | |||
| 243 | /* | ||
| 244 | * fifo_mode: | ||
| 245 | * BYPASS The FIFO is bypassed | ||
| 246 | * FIFO FIFO collects up to 32 values then stops collecting data | ||
| 247 | * STREAM FIFO holds the last 32 data values. Once full, the FIFO's | ||
| 248 | * oldest data is lost as it is replaced with newer data | ||
| 249 | * | ||
| 250 | * DEFAULT should be ADXL_FIFO_STREAM | ||
| 251 | */ | ||
| 252 | |||
| 253 | #define ADXL_FIFO_BYPASS 0 | ||
| 254 | #define ADXL_FIFO_FIFO 1 | ||
| 255 | #define ADXL_FIFO_STREAM 2 | ||
| 256 | |||
| 257 | u8 fifo_mode; | ||
| 258 | |||
| 259 | /* | ||
| 260 | * watermark: | ||
| 261 | * The Watermark feature can be used to reduce the interrupt load | ||
| 262 | * of the system. The FIFO fills up to the value stored in watermark | ||
| 263 | * [1..32] and then generates an interrupt. | ||
| 264 | * A '0' disables the watermark feature. | ||
| 265 | */ | ||
| 266 | |||
| 267 | u8 watermark; | ||
| 268 | |||
| 269 | u32 ev_type; /* EV_ABS or EV_REL */ | ||
| 270 | |||
| 271 | u32 ev_code_x; /* ABS_X,Y,Z or REL_X,Y,Z */ | ||
| 272 | u32 ev_code_y; /* ABS_X,Y,Z or REL_X,Y,Z */ | ||
| 273 | u32 ev_code_z; /* ABS_X,Y,Z or REL_X,Y,Z */ | ||
| 274 | |||
| 275 | /* | ||
| 276 | * A valid BTN or KEY Code; use tap_axis_control to disable | ||
| 277 | * event reporting | ||
| 278 | */ | ||
| 279 | |||
| 280 | u32 ev_code_tap[3]; /* EV_KEY {X-Axis, Y-Axis, Z-Axis} */ | ||
| 281 | |||
| 282 | /* | ||
| 283 | * A valid BTN or KEY Code for Free-Fall or Activity enables | ||
| 284 | * input event reporting. A '0' disables the Free-Fall or | ||
| 285 | * Activity reporting. | ||
| 286 | */ | ||
| 287 | |||
| 288 | u32 ev_code_ff; /* EV_KEY */ | ||
| 289 | u32 ev_code_act_inactivity; /* EV_KEY */ | ||
| 290 | |||
| 291 | /* | ||
| 292 | * Use ADXL34x INT2 instead of INT1 | ||
| 293 | */ | ||
| 294 | u8 use_int2; | ||
| 295 | |||
| 296 | /* | ||
| 297 | * ADXL346 only ORIENTATION SENSING feature | ||
| 298 | * The orientation function of the ADXL346 reports both 2-D and | ||
| 299 | * 3-D orientation concurrently. | ||
| 300 | */ | ||
| 301 | |||
| 302 | #define ADXL_EN_ORIENTATION_2D 1 | ||
| 303 | #define ADXL_EN_ORIENTATION_3D 2 | ||
| 304 | #define ADXL_EN_ORIENTATION_2D_3D 3 | ||
| 305 | |||
| 306 | u8 orientation_enable; | ||
| 307 | |||
| 308 | /* | ||
| 309 | * The width of the deadzone region between two or more | ||
| 310 | * orientation positions is determined by setting the Deadzone | ||
| 311 | * value. The deadzone region size can be specified with a | ||
| 312 | * resolution of 3.6deg. The deadzone angle represents the total | ||
| 313 | * angle where the orientation is considered invalid. | ||
| 314 | */ | ||
| 315 | |||
| 316 | #define ADXL_DEADZONE_ANGLE_0p0 0 /* !!!0.0 [deg] */ | ||
| 317 | #define ADXL_DEADZONE_ANGLE_3p6 1 /* 3.6 [deg] */ | ||
| 318 | #define ADXL_DEADZONE_ANGLE_7p2 2 /* 7.2 [deg] */ | ||
| 319 | #define ADXL_DEADZONE_ANGLE_10p8 3 /* 10.8 [deg] */ | ||
| 320 | #define ADXL_DEADZONE_ANGLE_14p4 4 /* 14.4 [deg] */ | ||
| 321 | #define ADXL_DEADZONE_ANGLE_18p0 5 /* 18.0 [deg] */ | ||
| 322 | #define ADXL_DEADZONE_ANGLE_21p6 6 /* 21.6 [deg] */ | ||
| 323 | #define ADXL_DEADZONE_ANGLE_25p2 7 /* 25.2 [deg] */ | ||
| 324 | |||
| 325 | u8 deadzone_angle; | ||
| 326 | |||
| 327 | /* | ||
| 328 | * To eliminate most human motion such as walking or shaking, | ||
| 329 | * a Divisor value should be selected to effectively limit the | ||
| 330 | * orientation bandwidth. Set the depth of the filter used to | ||
| 331 | * low-pass filter the measured acceleration for stable | ||
| 332 | * orientation sensing | ||
| 333 | */ | ||
| 334 | |||
| 335 | #define ADXL_LP_FILTER_DIVISOR_2 0 | ||
| 336 | #define ADXL_LP_FILTER_DIVISOR_4 1 | ||
| 337 | #define ADXL_LP_FILTER_DIVISOR_8 2 | ||
| 338 | #define ADXL_LP_FILTER_DIVISOR_16 3 | ||
| 339 | #define ADXL_LP_FILTER_DIVISOR_32 4 | ||
| 340 | #define ADXL_LP_FILTER_DIVISOR_64 5 | ||
| 341 | #define ADXL_LP_FILTER_DIVISOR_128 6 | ||
| 342 | #define ADXL_LP_FILTER_DIVISOR_256 7 | ||
| 343 | |||
| 344 | u8 divisor_length; | ||
| 345 | |||
| 346 | u32 ev_codes_orient_2d[4]; /* EV_KEY {+X, -X, +Y, -Y} */ | ||
| 347 | u32 ev_codes_orient_3d[6]; /* EV_KEY {+Z, +Y, +X, -X, -Y, -Z} */ | ||
| 348 | }; | ||
| 349 | #endif | ||
diff --git a/include/linux/input/bu21013.h b/include/linux/input/bu21013.h new file mode 100644 index 000000000000..e470d387dd49 --- /dev/null +++ b/include/linux/input/bu21013.h | |||
| @@ -0,0 +1,44 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) ST-Ericsson SA 2010 | ||
| 3 | * Author: Naveen Kumar G <naveen.gaddipati@stericsson.com> for ST-Ericsson | ||
| 4 | * License terms:GNU General Public License (GPL) version 2 | ||
| 5 | */ | ||
| 6 | |||
| 7 | #ifndef _BU21013_H | ||
| 8 | #define _BU21013_H | ||
| 9 | |||
| 10 | /** | ||
| 11 | * struct bu21013_platform_device - Handle the platform data | ||
| 12 | * @cs_en: pointer to the cs enable function | ||
| 13 | * @cs_dis: pointer to the cs disable function | ||
| 14 | * @irq_read_val: pointer to read the pen irq value function | ||
| 15 | * @x_max_res: xmax resolution | ||
| 16 | * @y_max_res: ymax resolution | ||
| 17 | * @touch_x_max: touch x max | ||
| 18 | * @touch_y_max: touch y max | ||
| 19 | * @cs_pin: chip select pin | ||
| 20 | * @irq: irq pin | ||
| 21 | * @ext_clk: external clock flag | ||
| 22 | * @x_flip: x flip flag | ||
| 23 | * @y_flip: y flip flag | ||
| 24 | * @wakeup: wakeup flag | ||
| 25 | * | ||
| 26 | * This is used to handle the platform data | ||
| 27 | */ | ||
| 28 | struct bu21013_platform_device { | ||
| 29 | int (*cs_en)(int reset_pin); | ||
| 30 | int (*cs_dis)(int reset_pin); | ||
| 31 | int (*irq_read_val)(void); | ||
| 32 | int x_max_res; | ||
| 33 | int y_max_res; | ||
| 34 | int touch_x_max; | ||
| 35 | int touch_y_max; | ||
| 36 | unsigned int cs_pin; | ||
| 37 | unsigned int irq; | ||
| 38 | bool ext_clk; | ||
| 39 | bool x_flip; | ||
| 40 | bool y_flip; | ||
| 41 | bool wakeup; | ||
| 42 | }; | ||
| 43 | |||
| 44 | #endif | ||
diff --git a/include/linux/input/cy8ctmg110_pdata.h b/include/linux/input/cy8ctmg110_pdata.h new file mode 100644 index 000000000000..09522cb59910 --- /dev/null +++ b/include/linux/input/cy8ctmg110_pdata.h | |||
| @@ -0,0 +1,10 @@ | |||
| 1 | #ifndef _LINUX_CY8CTMG110_PDATA_H | ||
| 2 | #define _LINUX_CY8CTMG110_PDATA_H | ||
| 3 | |||
| 4 | struct cy8ctmg110_pdata | ||
| 5 | { | ||
| 6 | int reset_pin; /* Reset pin is wired to this GPIO (optional) */ | ||
| 7 | int irq_pin; /* IRQ pin is wired to this GPIO */ | ||
| 8 | }; | ||
| 9 | |||
| 10 | #endif | ||
diff --git a/include/linux/input/matrix_keypad.h b/include/linux/input/matrix_keypad.h index c964cd7f436a..80352ad6581a 100644 --- a/include/linux/input/matrix_keypad.h +++ b/include/linux/input/matrix_keypad.h | |||
| @@ -41,6 +41,9 @@ struct matrix_keymap_data { | |||
| 41 | * @col_scan_delay_us: delay, measured in microseconds, that is | 41 | * @col_scan_delay_us: delay, measured in microseconds, that is |
| 42 | * needed before we can keypad after activating column gpio | 42 | * needed before we can keypad after activating column gpio |
| 43 | * @debounce_ms: debounce interval in milliseconds | 43 | * @debounce_ms: debounce interval in milliseconds |
| 44 | * @clustered_irq: may be specified if interrupts of all row/column GPIOs | ||
| 45 | * are bundled to one single irq | ||
| 46 | * @clustered_irq_flags: flags that are needed for the clustered irq | ||
| 44 | * @active_low: gpio polarity | 47 | * @active_low: gpio polarity |
| 45 | * @wakeup: controls whether the device should be set up as wakeup | 48 | * @wakeup: controls whether the device should be set up as wakeup |
| 46 | * source | 49 | * source |
| @@ -63,6 +66,9 @@ struct matrix_keypad_platform_data { | |||
| 63 | /* key debounce interval in milli-second */ | 66 | /* key debounce interval in milli-second */ |
| 64 | unsigned int debounce_ms; | 67 | unsigned int debounce_ms; |
| 65 | 68 | ||
| 69 | unsigned int clustered_irq; | ||
| 70 | unsigned int clustered_irq_flags; | ||
| 71 | |||
| 66 | bool active_low; | 72 | bool active_low; |
| 67 | bool wakeup; | 73 | bool wakeup; |
| 68 | bool no_autorepeat; | 74 | bool no_autorepeat; |
diff --git a/include/linux/intel-gtt.h b/include/linux/intel-gtt.h new file mode 100644 index 000000000000..1d19ab2afa39 --- /dev/null +++ b/include/linux/intel-gtt.h | |||
| @@ -0,0 +1,20 @@ | |||
| 1 | /* | ||
| 2 | * Common Intel AGPGART and GTT definitions. | ||
| 3 | */ | ||
| 4 | #ifndef _INTEL_GTT_H | ||
| 5 | #define _INTEL_GTT_H | ||
| 6 | |||
| 7 | #include <linux/agp_backend.h> | ||
| 8 | |||
| 9 | /* This is for Intel only GTT controls. | ||
| 10 | * | ||
| 11 | * Sandybridge: AGP_USER_CACHED_MEMORY default to LLC only | ||
| 12 | */ | ||
| 13 | |||
| 14 | #define AGP_USER_CACHED_MEMORY_LLC_MLC (AGP_USER_TYPES + 2) | ||
| 15 | #define AGP_USER_UNCACHED_MEMORY (AGP_USER_TYPES + 4) | ||
| 16 | |||
| 17 | /* flag for GFDT type */ | ||
| 18 | #define AGP_USER_CACHED_MEMORY_GFDT (1 << 3) | ||
| 19 | |||
| 20 | #endif | ||
diff --git a/include/linux/intel_mid_dma.h b/include/linux/intel_mid_dma.h new file mode 100644 index 000000000000..10496bd24c5c --- /dev/null +++ b/include/linux/intel_mid_dma.h | |||
| @@ -0,0 +1,76 @@ | |||
| 1 | /* | ||
| 2 | * intel_mid_dma.h - Intel MID DMA Drivers | ||
| 3 | * | ||
| 4 | * Copyright (C) 2008-10 Intel Corp | ||
| 5 | * Author: Vinod Koul <vinod.koul@intel.com> | ||
| 6 | * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
| 7 | * | ||
| 8 | * This program is free software; you can redistribute it and/or modify | ||
| 9 | * it under the terms of the GNU General Public License as published by | ||
| 10 | * the Free Software Foundation; version 2 of the License. | ||
| 11 | * | ||
| 12 | * This program is distributed in the hope that it will be useful, but | ||
| 13 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
| 15 | * General Public License for more details. | ||
| 16 | * | ||
| 17 | * You should have received a copy of the GNU General Public License along | ||
| 18 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
| 19 | * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. | ||
| 20 | * | ||
| 21 | * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
| 22 | * | ||
| 23 | * | ||
| 24 | */ | ||
| 25 | #ifndef __INTEL_MID_DMA_H__ | ||
| 26 | #define __INTEL_MID_DMA_H__ | ||
| 27 | |||
| 28 | #include <linux/dmaengine.h> | ||
| 29 | |||
| 30 | #define DMA_PREP_CIRCULAR_LIST (1 << 10) | ||
| 31 | |||
| 32 | /*DMA mode configurations*/ | ||
| 33 | enum intel_mid_dma_mode { | ||
| 34 | LNW_DMA_PER_TO_MEM = 0, /*periphral to memory configuration*/ | ||
| 35 | LNW_DMA_MEM_TO_PER, /*memory to periphral configuration*/ | ||
| 36 | LNW_DMA_MEM_TO_MEM, /*mem to mem confg (testing only)*/ | ||
| 37 | }; | ||
| 38 | |||
| 39 | /*DMA handshaking*/ | ||
| 40 | enum intel_mid_dma_hs_mode { | ||
| 41 | LNW_DMA_HW_HS = 0, /*HW Handshaking only*/ | ||
| 42 | LNW_DMA_SW_HS = 1, /*SW Handshaking not recommended*/ | ||
| 43 | }; | ||
| 44 | |||
| 45 | /*Burst size configuration*/ | ||
| 46 | enum intel_mid_dma_msize { | ||
| 47 | LNW_DMA_MSIZE_1 = 0x0, | ||
| 48 | LNW_DMA_MSIZE_4 = 0x1, | ||
| 49 | LNW_DMA_MSIZE_8 = 0x2, | ||
| 50 | LNW_DMA_MSIZE_16 = 0x3, | ||
| 51 | LNW_DMA_MSIZE_32 = 0x4, | ||
| 52 | LNW_DMA_MSIZE_64 = 0x5, | ||
| 53 | }; | ||
| 54 | |||
| 55 | /** | ||
| 56 | * struct intel_mid_dma_slave - DMA slave structure | ||
| 57 | * | ||
| 58 | * @dirn: DMA trf direction | ||
| 59 | * @src_width: tx register width | ||
| 60 | * @dst_width: rx register width | ||
| 61 | * @hs_mode: HW/SW handshaking mode | ||
| 62 | * @cfg_mode: DMA data transfer mode (per-per/mem-per/mem-mem) | ||
| 63 | * @src_msize: Source DMA burst size | ||
| 64 | * @dst_msize: Dst DMA burst size | ||
| 65 | * @per_addr: Periphral address | ||
| 66 | * @device_instance: DMA peripheral device instance, we can have multiple | ||
| 67 | * peripheral device connected to single DMAC | ||
| 68 | */ | ||
| 69 | struct intel_mid_dma_slave { | ||
| 70 | enum intel_mid_dma_hs_mode hs_mode; /*handshaking*/ | ||
| 71 | enum intel_mid_dma_mode cfg_mode; /*mode configuration*/ | ||
| 72 | unsigned int device_instance; /*0, 1 for periphral instance*/ | ||
| 73 | struct dma_slave_config dma_slave; | ||
| 74 | }; | ||
| 75 | |||
| 76 | #endif /*__INTEL_MID_DMA_H__*/ | ||
diff --git a/include/linux/intel_pmic_gpio.h b/include/linux/intel_pmic_gpio.h new file mode 100644 index 000000000000..920109a29191 --- /dev/null +++ b/include/linux/intel_pmic_gpio.h | |||
| @@ -0,0 +1,15 @@ | |||
| 1 | #ifndef LINUX_INTEL_PMIC_H | ||
| 2 | #define LINUX_INTEL_PMIC_H | ||
| 3 | |||
| 4 | struct intel_pmic_gpio_platform_data { | ||
| 5 | /* the first IRQ of the chip */ | ||
| 6 | unsigned irq_base; | ||
| 7 | /* number assigned to the first GPIO */ | ||
| 8 | unsigned gpio_base; | ||
| 9 | /* sram address for gpiointr register, the langwell chip will map | ||
| 10 | * the PMIC spi GPIO expander's GPIOINTR register in sram. | ||
| 11 | */ | ||
| 12 | unsigned gpiointr; | ||
| 13 | }; | ||
| 14 | |||
| 15 | #endif | ||
diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h index c2331138ca1b..79d0c4f6d071 100644 --- a/include/linux/interrupt.h +++ b/include/linux/interrupt.h | |||
| @@ -18,6 +18,7 @@ | |||
| 18 | #include <asm/atomic.h> | 18 | #include <asm/atomic.h> |
| 19 | #include <asm/ptrace.h> | 19 | #include <asm/ptrace.h> |
| 20 | #include <asm/system.h> | 20 | #include <asm/system.h> |
| 21 | #include <trace/events/irq.h> | ||
| 21 | 22 | ||
| 22 | /* | 23 | /* |
| 23 | * These correspond to the IORESOURCE_IRQ_* defines in | 24 | * These correspond to the IORESOURCE_IRQ_* defines in |
| @@ -53,16 +54,21 @@ | |||
| 53 | * IRQF_ONESHOT - Interrupt is not reenabled after the hardirq handler finished. | 54 | * IRQF_ONESHOT - Interrupt is not reenabled after the hardirq handler finished. |
| 54 | * Used by threaded interrupts which need to keep the | 55 | * Used by threaded interrupts which need to keep the |
| 55 | * irq line disabled until the threaded handler has been run. | 56 | * irq line disabled until the threaded handler has been run. |
| 57 | * IRQF_NO_SUSPEND - Do not disable this IRQ during suspend | ||
| 58 | * | ||
| 56 | */ | 59 | */ |
| 57 | #define IRQF_DISABLED 0x00000020 | 60 | #define IRQF_DISABLED 0x00000020 |
| 58 | #define IRQF_SAMPLE_RANDOM 0x00000040 | 61 | #define IRQF_SAMPLE_RANDOM 0x00000040 |
| 59 | #define IRQF_SHARED 0x00000080 | 62 | #define IRQF_SHARED 0x00000080 |
| 60 | #define IRQF_PROBE_SHARED 0x00000100 | 63 | #define IRQF_PROBE_SHARED 0x00000100 |
| 61 | #define IRQF_TIMER 0x00000200 | 64 | #define __IRQF_TIMER 0x00000200 |
| 62 | #define IRQF_PERCPU 0x00000400 | 65 | #define IRQF_PERCPU 0x00000400 |
| 63 | #define IRQF_NOBALANCING 0x00000800 | 66 | #define IRQF_NOBALANCING 0x00000800 |
| 64 | #define IRQF_IRQPOLL 0x00001000 | 67 | #define IRQF_IRQPOLL 0x00001000 |
| 65 | #define IRQF_ONESHOT 0x00002000 | 68 | #define IRQF_ONESHOT 0x00002000 |
| 69 | #define IRQF_NO_SUSPEND 0x00004000 | ||
| 70 | |||
| 71 | #define IRQF_TIMER (__IRQF_TIMER | IRQF_NO_SUSPEND) | ||
| 66 | 72 | ||
| 67 | /* | 73 | /* |
| 68 | * Bits used by threaded handlers: | 74 | * Bits used by threaded handlers: |
| @@ -402,10 +408,14 @@ asmlinkage void do_softirq(void); | |||
| 402 | asmlinkage void __do_softirq(void); | 408 | asmlinkage void __do_softirq(void); |
| 403 | extern void open_softirq(int nr, void (*action)(struct softirq_action *)); | 409 | extern void open_softirq(int nr, void (*action)(struct softirq_action *)); |
| 404 | extern void softirq_init(void); | 410 | extern void softirq_init(void); |
| 405 | #define __raise_softirq_irqoff(nr) do { or_softirq_pending(1UL << (nr)); } while (0) | 411 | static inline void __raise_softirq_irqoff(unsigned int nr) |
| 412 | { | ||
| 413 | trace_softirq_raise(nr); | ||
| 414 | or_softirq_pending(1UL << nr); | ||
| 415 | } | ||
| 416 | |||
| 406 | extern void raise_softirq_irqoff(unsigned int nr); | 417 | extern void raise_softirq_irqoff(unsigned int nr); |
| 407 | extern void raise_softirq(unsigned int nr); | 418 | extern void raise_softirq(unsigned int nr); |
| 408 | extern void wakeup_softirqd(void); | ||
| 409 | 419 | ||
| 410 | /* This is the worklist that queues up per-cpu softirq work. | 420 | /* This is the worklist that queues up per-cpu softirq work. |
| 411 | * | 421 | * |
| @@ -636,11 +646,8 @@ static inline void init_irq_proc(void) | |||
| 636 | struct seq_file; | 646 | struct seq_file; |
| 637 | int show_interrupts(struct seq_file *p, void *v); | 647 | int show_interrupts(struct seq_file *p, void *v); |
| 638 | 648 | ||
| 639 | struct irq_desc; | ||
| 640 | |||
| 641 | extern int early_irq_init(void); | 649 | extern int early_irq_init(void); |
| 642 | extern int arch_probe_nr_irqs(void); | 650 | extern int arch_probe_nr_irqs(void); |
| 643 | extern int arch_early_irq_init(void); | 651 | extern int arch_early_irq_init(void); |
| 644 | extern int arch_init_chip_data(struct irq_desc *desc, int node); | ||
| 645 | 652 | ||
| 646 | #endif | 653 | #endif |
diff --git a/include/linux/io-mapping.h b/include/linux/io-mapping.h index 25085ddd955f..8cdcc2a199ad 100644 --- a/include/linux/io-mapping.h +++ b/include/linux/io-mapping.h | |||
| @@ -22,7 +22,6 @@ | |||
| 22 | #include <linux/slab.h> | 22 | #include <linux/slab.h> |
| 23 | #include <asm/io.h> | 23 | #include <asm/io.h> |
| 24 | #include <asm/page.h> | 24 | #include <asm/page.h> |
| 25 | #include <asm/iomap.h> | ||
| 26 | 25 | ||
| 27 | /* | 26 | /* |
| 28 | * The io_mapping mechanism provides an abstraction for mapping | 27 | * The io_mapping mechanism provides an abstraction for mapping |
| @@ -33,6 +32,8 @@ | |||
| 33 | 32 | ||
| 34 | #ifdef CONFIG_HAVE_ATOMIC_IOMAP | 33 | #ifdef CONFIG_HAVE_ATOMIC_IOMAP |
| 35 | 34 | ||
| 35 | #include <asm/iomap.h> | ||
| 36 | |||
| 36 | struct io_mapping { | 37 | struct io_mapping { |
| 37 | resource_size_t base; | 38 | resource_size_t base; |
| 38 | unsigned long size; | 39 | unsigned long size; |
| @@ -78,8 +79,9 @@ io_mapping_free(struct io_mapping *mapping) | |||
| 78 | } | 79 | } |
| 79 | 80 | ||
| 80 | /* Atomic map/unmap */ | 81 | /* Atomic map/unmap */ |
| 81 | static inline void * | 82 | static inline void __iomem * |
| 82 | io_mapping_map_atomic_wc(struct io_mapping *mapping, unsigned long offset) | 83 | io_mapping_map_atomic_wc(struct io_mapping *mapping, |
| 84 | unsigned long offset) | ||
| 83 | { | 85 | { |
| 84 | resource_size_t phys_addr; | 86 | resource_size_t phys_addr; |
| 85 | unsigned long pfn; | 87 | unsigned long pfn; |
| @@ -87,16 +89,16 @@ io_mapping_map_atomic_wc(struct io_mapping *mapping, unsigned long offset) | |||
| 87 | BUG_ON(offset >= mapping->size); | 89 | BUG_ON(offset >= mapping->size); |
| 88 | phys_addr = mapping->base + offset; | 90 | phys_addr = mapping->base + offset; |
| 89 | pfn = (unsigned long) (phys_addr >> PAGE_SHIFT); | 91 | pfn = (unsigned long) (phys_addr >> PAGE_SHIFT); |
| 90 | return iomap_atomic_prot_pfn(pfn, KM_USER0, mapping->prot); | 92 | return iomap_atomic_prot_pfn(pfn, mapping->prot); |
| 91 | } | 93 | } |
| 92 | 94 | ||
| 93 | static inline void | 95 | static inline void |
| 94 | io_mapping_unmap_atomic(void *vaddr) | 96 | io_mapping_unmap_atomic(void __iomem *vaddr) |
| 95 | { | 97 | { |
| 96 | iounmap_atomic(vaddr, KM_USER0); | 98 | iounmap_atomic(vaddr); |
| 97 | } | 99 | } |
| 98 | 100 | ||
| 99 | static inline void * | 101 | static inline void __iomem * |
| 100 | io_mapping_map_wc(struct io_mapping *mapping, unsigned long offset) | 102 | io_mapping_map_wc(struct io_mapping *mapping, unsigned long offset) |
| 101 | { | 103 | { |
| 102 | resource_size_t phys_addr; | 104 | resource_size_t phys_addr; |
| @@ -108,7 +110,7 @@ io_mapping_map_wc(struct io_mapping *mapping, unsigned long offset) | |||
| 108 | } | 110 | } |
| 109 | 111 | ||
| 110 | static inline void | 112 | static inline void |
| 111 | io_mapping_unmap(void *vaddr) | 113 | io_mapping_unmap(void __iomem *vaddr) |
| 112 | { | 114 | { |
| 113 | iounmap(vaddr); | 115 | iounmap(vaddr); |
| 114 | } | 116 | } |
| @@ -122,36 +124,37 @@ struct io_mapping; | |||
| 122 | static inline struct io_mapping * | 124 | static inline struct io_mapping * |
| 123 | io_mapping_create_wc(resource_size_t base, unsigned long size) | 125 | io_mapping_create_wc(resource_size_t base, unsigned long size) |
| 124 | { | 126 | { |
| 125 | return (struct io_mapping *) ioremap_wc(base, size); | 127 | return (struct io_mapping __force *) ioremap_wc(base, size); |
| 126 | } | 128 | } |
| 127 | 129 | ||
| 128 | static inline void | 130 | static inline void |
| 129 | io_mapping_free(struct io_mapping *mapping) | 131 | io_mapping_free(struct io_mapping *mapping) |
| 130 | { | 132 | { |
| 131 | iounmap(mapping); | 133 | iounmap((void __force __iomem *) mapping); |
| 132 | } | 134 | } |
| 133 | 135 | ||
| 134 | /* Atomic map/unmap */ | 136 | /* Atomic map/unmap */ |
| 135 | static inline void * | 137 | static inline void __iomem * |
| 136 | io_mapping_map_atomic_wc(struct io_mapping *mapping, unsigned long offset) | 138 | io_mapping_map_atomic_wc(struct io_mapping *mapping, |
| 139 | unsigned long offset) | ||
| 137 | { | 140 | { |
| 138 | return ((char *) mapping) + offset; | 141 | return ((char __force __iomem *) mapping) + offset; |
| 139 | } | 142 | } |
| 140 | 143 | ||
| 141 | static inline void | 144 | static inline void |
| 142 | io_mapping_unmap_atomic(void *vaddr) | 145 | io_mapping_unmap_atomic(void __iomem *vaddr) |
| 143 | { | 146 | { |
| 144 | } | 147 | } |
| 145 | 148 | ||
| 146 | /* Non-atomic map/unmap */ | 149 | /* Non-atomic map/unmap */ |
| 147 | static inline void * | 150 | static inline void __iomem * |
| 148 | io_mapping_map_wc(struct io_mapping *mapping, unsigned long offset) | 151 | io_mapping_map_wc(struct io_mapping *mapping, unsigned long offset) |
| 149 | { | 152 | { |
| 150 | return ((char *) mapping) + offset; | 153 | return ((char __force __iomem *) mapping) + offset; |
| 151 | } | 154 | } |
| 152 | 155 | ||
| 153 | static inline void | 156 | static inline void |
| 154 | io_mapping_unmap(void *vaddr) | 157 | io_mapping_unmap(void __iomem *vaddr) |
| 155 | { | 158 | { |
| 156 | } | 159 | } |
| 157 | 160 | ||
diff --git a/include/linux/io.h b/include/linux/io.h index 6c7f0ba0d5fa..7fd2d2138bf3 100644 --- a/include/linux/io.h +++ b/include/linux/io.h | |||
| @@ -29,10 +29,10 @@ void __iowrite64_copy(void __iomem *to, const void *from, size_t count); | |||
| 29 | 29 | ||
| 30 | #ifdef CONFIG_MMU | 30 | #ifdef CONFIG_MMU |
| 31 | int ioremap_page_range(unsigned long addr, unsigned long end, | 31 | int ioremap_page_range(unsigned long addr, unsigned long end, |
| 32 | unsigned long phys_addr, pgprot_t prot); | 32 | phys_addr_t phys_addr, pgprot_t prot); |
| 33 | #else | 33 | #else |
| 34 | static inline int ioremap_page_range(unsigned long addr, unsigned long end, | 34 | static inline int ioremap_page_range(unsigned long addr, unsigned long end, |
| 35 | unsigned long phys_addr, pgprot_t prot) | 35 | phys_addr_t phys_addr, pgprot_t prot) |
| 36 | { | 36 | { |
| 37 | return 0; | 37 | return 0; |
| 38 | } | 38 | } |
diff --git a/include/linux/iocontext.h b/include/linux/iocontext.h index 64d529133031..3e70b21884a9 100644 --- a/include/linux/iocontext.h +++ b/include/linux/iocontext.h | |||
| @@ -53,7 +53,7 @@ struct io_context { | |||
| 53 | 53 | ||
| 54 | struct radix_tree_root radix_root; | 54 | struct radix_tree_root radix_root; |
| 55 | struct hlist_head cic_list; | 55 | struct hlist_head cic_list; |
| 56 | void *ioc_data; | 56 | void __rcu *ioc_data; |
| 57 | }; | 57 | }; |
| 58 | 58 | ||
| 59 | static inline struct io_context *ioc_task_link(struct io_context *ioc) | 59 | static inline struct io_context *ioc_task_link(struct io_context *ioc) |
diff --git a/include/linux/iommu-helper.h b/include/linux/iommu-helper.h index 64d1b638745d..86bdeffe43ad 100644 --- a/include/linux/iommu-helper.h +++ b/include/linux/iommu-helper.h | |||
| @@ -1,6 +1,8 @@ | |||
| 1 | #ifndef _LINUX_IOMMU_HELPER_H | 1 | #ifndef _LINUX_IOMMU_HELPER_H |
| 2 | #define _LINUX_IOMMU_HELPER_H | 2 | #define _LINUX_IOMMU_HELPER_H |
| 3 | 3 | ||
| 4 | #include <linux/kernel.h> | ||
| 5 | |||
| 4 | static inline unsigned long iommu_device_max_index(unsigned long size, | 6 | static inline unsigned long iommu_device_max_index(unsigned long size, |
| 5 | unsigned long offset, | 7 | unsigned long offset, |
| 6 | u64 dma_mask) | 8 | u64 dma_mask) |
| @@ -20,7 +22,13 @@ extern unsigned long iommu_area_alloc(unsigned long *map, unsigned long size, | |||
| 20 | unsigned long boundary_size, | 22 | unsigned long boundary_size, |
| 21 | unsigned long align_mask); | 23 | unsigned long align_mask); |
| 22 | 24 | ||
| 23 | extern unsigned long iommu_num_pages(unsigned long addr, unsigned long len, | 25 | static inline unsigned long iommu_num_pages(unsigned long addr, |
| 24 | unsigned long io_page_size); | 26 | unsigned long len, |
| 27 | unsigned long io_page_size) | ||
| 28 | { | ||
| 29 | unsigned long size = (addr & (io_page_size - 1)) + len; | ||
| 30 | |||
| 31 | return DIV_ROUND_UP(size, io_page_size); | ||
| 32 | } | ||
| 25 | 33 | ||
| 26 | #endif | 34 | #endif |
diff --git a/include/linux/iommu.h b/include/linux/iommu.h index be22ad83689c..0a2ba4098996 100644 --- a/include/linux/iommu.h +++ b/include/linux/iommu.h | |||
| @@ -30,6 +30,7 @@ struct iommu_domain { | |||
| 30 | }; | 30 | }; |
| 31 | 31 | ||
| 32 | #define IOMMU_CAP_CACHE_COHERENCY 0x1 | 32 | #define IOMMU_CAP_CACHE_COHERENCY 0x1 |
| 33 | #define IOMMU_CAP_INTR_REMAP 0x2 /* isolates device intrs */ | ||
| 33 | 34 | ||
| 34 | struct iommu_ops { | 35 | struct iommu_ops { |
| 35 | int (*domain_init)(struct iommu_domain *domain); | 36 | int (*domain_init)(struct iommu_domain *domain); |
diff --git a/include/linux/ioport.h b/include/linux/ioport.h index b22790268b64..d377ea815d45 100644 --- a/include/linux/ioport.h +++ b/include/linux/ioport.h | |||
| @@ -112,6 +112,7 @@ struct resource_list { | |||
| 112 | /* PC/ISA/whatever - the normal PC address spaces: IO and memory */ | 112 | /* PC/ISA/whatever - the normal PC address spaces: IO and memory */ |
| 113 | extern struct resource ioport_resource; | 113 | extern struct resource ioport_resource; |
| 114 | extern struct resource iomem_resource; | 114 | extern struct resource iomem_resource; |
| 115 | extern int resource_alloc_from_bottom; | ||
| 115 | 116 | ||
| 116 | extern struct resource *request_resource_conflict(struct resource *root, struct resource *new); | 117 | extern struct resource *request_resource_conflict(struct resource *root, struct resource *new); |
| 117 | extern int request_resource(struct resource *root, struct resource *new); | 118 | extern int request_resource(struct resource *root, struct resource *new); |
diff --git a/include/linux/ip_vs.h b/include/linux/ip_vs.h index dfc170362842..5f43a3b2e3ad 100644 --- a/include/linux/ip_vs.h +++ b/include/linux/ip_vs.h | |||
| @@ -19,6 +19,7 @@ | |||
| 19 | */ | 19 | */ |
| 20 | #define IP_VS_SVC_F_PERSISTENT 0x0001 /* persistent port */ | 20 | #define IP_VS_SVC_F_PERSISTENT 0x0001 /* persistent port */ |
| 21 | #define IP_VS_SVC_F_HASHED 0x0002 /* hashed entry */ | 21 | #define IP_VS_SVC_F_HASHED 0x0002 /* hashed entry */ |
| 22 | #define IP_VS_SVC_F_ONEPACKET 0x0004 /* one-packet scheduling */ | ||
| 22 | 23 | ||
| 23 | /* | 24 | /* |
| 24 | * Destination Server Flags | 25 | * Destination Server Flags |
| @@ -69,6 +70,7 @@ | |||
| 69 | 70 | ||
| 70 | /* | 71 | /* |
| 71 | * IPVS Connection Flags | 72 | * IPVS Connection Flags |
| 73 | * Only flags 0..15 are sent to backup server | ||
| 72 | */ | 74 | */ |
| 73 | #define IP_VS_CONN_F_FWD_MASK 0x0007 /* mask for the fwd methods */ | 75 | #define IP_VS_CONN_F_FWD_MASK 0x0007 /* mask for the fwd methods */ |
| 74 | #define IP_VS_CONN_F_MASQ 0x0000 /* masquerading/NAT */ | 76 | #define IP_VS_CONN_F_MASQ 0x0000 /* masquerading/NAT */ |
| @@ -85,10 +87,22 @@ | |||
| 85 | #define IP_VS_CONN_F_SEQ_MASK 0x0600 /* in/out sequence mask */ | 87 | #define IP_VS_CONN_F_SEQ_MASK 0x0600 /* in/out sequence mask */ |
| 86 | #define IP_VS_CONN_F_NO_CPORT 0x0800 /* no client port set yet */ | 88 | #define IP_VS_CONN_F_NO_CPORT 0x0800 /* no client port set yet */ |
| 87 | #define IP_VS_CONN_F_TEMPLATE 0x1000 /* template, not connection */ | 89 | #define IP_VS_CONN_F_TEMPLATE 0x1000 /* template, not connection */ |
| 90 | #define IP_VS_CONN_F_ONE_PACKET 0x2000 /* forward only one packet */ | ||
| 91 | |||
| 92 | /* Flags that are not sent to backup server start from bit 16 */ | ||
| 93 | #define IP_VS_CONN_F_NFCT (1 << 16) /* use netfilter conntrack */ | ||
| 94 | |||
| 95 | /* Connection flags from destination that can be changed by user space */ | ||
| 96 | #define IP_VS_CONN_F_DEST_MASK (IP_VS_CONN_F_FWD_MASK | \ | ||
| 97 | IP_VS_CONN_F_ONE_PACKET | \ | ||
| 98 | IP_VS_CONN_F_NFCT | \ | ||
| 99 | 0) | ||
| 88 | 100 | ||
| 89 | #define IP_VS_SCHEDNAME_MAXLEN 16 | 101 | #define IP_VS_SCHEDNAME_MAXLEN 16 |
| 102 | #define IP_VS_PENAME_MAXLEN 16 | ||
| 90 | #define IP_VS_IFNAME_MAXLEN 16 | 103 | #define IP_VS_IFNAME_MAXLEN 16 |
| 91 | 104 | ||
| 105 | #define IP_VS_PEDATA_MAXLEN 255 | ||
| 92 | 106 | ||
| 93 | /* | 107 | /* |
| 94 | * The struct ip_vs_service_user and struct ip_vs_dest_user are | 108 | * The struct ip_vs_service_user and struct ip_vs_dest_user are |
| @@ -322,6 +336,9 @@ enum { | |||
| 322 | IPVS_SVC_ATTR_NETMASK, /* persistent netmask */ | 336 | IPVS_SVC_ATTR_NETMASK, /* persistent netmask */ |
| 323 | 337 | ||
| 324 | IPVS_SVC_ATTR_STATS, /* nested attribute for service stats */ | 338 | IPVS_SVC_ATTR_STATS, /* nested attribute for service stats */ |
| 339 | |||
| 340 | IPVS_SVC_ATTR_PE_NAME, /* name of ct retriever */ | ||
| 341 | |||
| 325 | __IPVS_SVC_ATTR_MAX, | 342 | __IPVS_SVC_ATTR_MAX, |
| 326 | }; | 343 | }; |
| 327 | 344 | ||
diff --git a/include/linux/ipv6.h b/include/linux/ipv6.h index 99e1ab7e3eec..8e429d0e0405 100644 --- a/include/linux/ipv6.h +++ b/include/linux/ipv6.h | |||
| @@ -58,7 +58,7 @@ struct ipv6_opt_hdr { | |||
| 58 | /* | 58 | /* |
| 59 | * TLV encoded option data follows. | 59 | * TLV encoded option data follows. |
| 60 | */ | 60 | */ |
| 61 | } __attribute__ ((packed)); /* required for some archs */ | 61 | } __attribute__((packed)); /* required for some archs */ |
| 62 | 62 | ||
| 63 | #define ipv6_destopt_hdr ipv6_opt_hdr | 63 | #define ipv6_destopt_hdr ipv6_opt_hdr |
| 64 | #define ipv6_hopopt_hdr ipv6_opt_hdr | 64 | #define ipv6_hopopt_hdr ipv6_opt_hdr |
| @@ -99,7 +99,7 @@ struct ipv6_destopt_hao { | |||
| 99 | __u8 type; | 99 | __u8 type; |
| 100 | __u8 length; | 100 | __u8 length; |
| 101 | struct in6_addr addr; | 101 | struct in6_addr addr; |
| 102 | } __attribute__ ((__packed__)); | 102 | } __attribute__((packed)); |
| 103 | 103 | ||
| 104 | /* | 104 | /* |
| 105 | * IPv6 fixed header | 105 | * IPv6 fixed header |
| @@ -246,7 +246,7 @@ struct inet6_skb_parm { | |||
| 246 | __u16 srcrt; | 246 | __u16 srcrt; |
| 247 | __u16 dst1; | 247 | __u16 dst1; |
| 248 | __u16 lastopt; | 248 | __u16 lastopt; |
| 249 | __u32 nhoff; | 249 | __u16 nhoff; |
| 250 | __u16 flags; | 250 | __u16 flags; |
| 251 | #if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE) | 251 | #if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE) |
| 252 | __u16 dsthao; | 252 | __u16 dsthao; |
| @@ -341,7 +341,9 @@ struct ipv6_pinfo { | |||
| 341 | odstopts:1, | 341 | odstopts:1, |
| 342 | rxflow:1, | 342 | rxflow:1, |
| 343 | rxtclass:1, | 343 | rxtclass:1, |
| 344 | rxpmtu:1; | 344 | rxpmtu:1, |
| 345 | rxorigdstaddr:1; | ||
| 346 | /* 2 bits hole */ | ||
| 345 | } bits; | 347 | } bits; |
| 346 | __u16 all; | 348 | __u16 all; |
| 347 | } rxopt; | 349 | } rxopt; |
diff --git a/include/linux/irq.h b/include/linux/irq.h index c03243ad84b4..e9639115dff1 100644 --- a/include/linux/irq.h +++ b/include/linux/irq.h | |||
| @@ -72,6 +72,10 @@ typedef void (*irq_flow_handler_t)(unsigned int irq, | |||
| 72 | #define IRQ_ONESHOT 0x08000000 /* IRQ is not unmasked after hardirq */ | 72 | #define IRQ_ONESHOT 0x08000000 /* IRQ is not unmasked after hardirq */ |
| 73 | #define IRQ_NESTED_THREAD 0x10000000 /* IRQ is nested into another, no own handler thread */ | 73 | #define IRQ_NESTED_THREAD 0x10000000 /* IRQ is nested into another, no own handler thread */ |
| 74 | 74 | ||
| 75 | #define IRQF_MODIFY_MASK \ | ||
| 76 | (IRQ_TYPE_SENSE_MASK | IRQ_NOPROBE | IRQ_NOREQUEST | \ | ||
| 77 | IRQ_NOAUTOEN | IRQ_MOVE_PCNTXT | IRQ_LEVEL) | ||
| 78 | |||
| 75 | #ifdef CONFIG_IRQ_PER_CPU | 79 | #ifdef CONFIG_IRQ_PER_CPU |
| 76 | # define CHECK_IRQ_PER_CPU(var) ((var) & IRQ_PER_CPU) | 80 | # define CHECK_IRQ_PER_CPU(var) ((var) & IRQ_PER_CPU) |
| 77 | # define IRQ_NO_BALANCING_MASK (IRQ_PER_CPU | IRQ_NO_BALANCING) | 81 | # define IRQ_NO_BALANCING_MASK (IRQ_PER_CPU | IRQ_NO_BALANCING) |
| @@ -80,36 +84,77 @@ typedef void (*irq_flow_handler_t)(unsigned int irq, | |||
| 80 | # define IRQ_NO_BALANCING_MASK IRQ_NO_BALANCING | 84 | # define IRQ_NO_BALANCING_MASK IRQ_NO_BALANCING |
| 81 | #endif | 85 | #endif |
| 82 | 86 | ||
| 83 | struct proc_dir_entry; | ||
| 84 | struct msi_desc; | 87 | struct msi_desc; |
| 85 | 88 | ||
| 86 | /** | 89 | /** |
| 90 | * struct irq_data - per irq and irq chip data passed down to chip functions | ||
| 91 | * @irq: interrupt number | ||
| 92 | * @node: node index useful for balancing | ||
| 93 | * @chip: low level interrupt hardware access | ||
| 94 | * @handler_data: per-IRQ data for the irq_chip methods | ||
| 95 | * @chip_data: platform-specific per-chip private data for the chip | ||
| 96 | * methods, to allow shared chip implementations | ||
| 97 | * @msi_desc: MSI descriptor | ||
| 98 | * @affinity: IRQ affinity on SMP | ||
| 99 | * | ||
| 100 | * The fields here need to overlay the ones in irq_desc until we | ||
| 101 | * cleaned up the direct references and switched everything over to | ||
| 102 | * irq_data. | ||
| 103 | */ | ||
| 104 | struct irq_data { | ||
| 105 | unsigned int irq; | ||
| 106 | unsigned int node; | ||
| 107 | struct irq_chip *chip; | ||
| 108 | void *handler_data; | ||
| 109 | void *chip_data; | ||
| 110 | struct msi_desc *msi_desc; | ||
| 111 | #ifdef CONFIG_SMP | ||
| 112 | cpumask_var_t affinity; | ||
| 113 | #endif | ||
| 114 | }; | ||
| 115 | |||
| 116 | /** | ||
| 87 | * struct irq_chip - hardware interrupt chip descriptor | 117 | * struct irq_chip - hardware interrupt chip descriptor |
| 88 | * | 118 | * |
| 89 | * @name: name for /proc/interrupts | 119 | * @name: name for /proc/interrupts |
| 90 | * @startup: start up the interrupt (defaults to ->enable if NULL) | 120 | * @startup: deprecated, replaced by irq_startup |
| 91 | * @shutdown: shut down the interrupt (defaults to ->disable if NULL) | 121 | * @shutdown: deprecated, replaced by irq_shutdown |
| 92 | * @enable: enable the interrupt (defaults to chip->unmask if NULL) | 122 | * @enable: deprecated, replaced by irq_enable |
| 93 | * @disable: disable the interrupt | 123 | * @disable: deprecated, replaced by irq_disable |
| 94 | * @ack: start of a new interrupt | 124 | * @ack: deprecated, replaced by irq_ack |
| 95 | * @mask: mask an interrupt source | 125 | * @mask: deprecated, replaced by irq_mask |
| 96 | * @mask_ack: ack and mask an interrupt source | 126 | * @mask_ack: deprecated, replaced by irq_mask_ack |
| 97 | * @unmask: unmask an interrupt source | 127 | * @unmask: deprecated, replaced by irq_unmask |
| 98 | * @eoi: end of interrupt - chip level | 128 | * @eoi: deprecated, replaced by irq_eoi |
| 99 | * @end: end of interrupt - flow level | 129 | * @end: deprecated, will go away with __do_IRQ() |
| 100 | * @set_affinity: set the CPU affinity on SMP machines | 130 | * @set_affinity: deprecated, replaced by irq_set_affinity |
| 101 | * @retrigger: resend an IRQ to the CPU | 131 | * @retrigger: deprecated, replaced by irq_retrigger |
| 102 | * @set_type: set the flow type (IRQ_TYPE_LEVEL/etc.) of an IRQ | 132 | * @set_type: deprecated, replaced by irq_set_type |
| 103 | * @set_wake: enable/disable power-management wake-on of an IRQ | 133 | * @set_wake: deprecated, replaced by irq_wake |
| 134 | * @bus_lock: deprecated, replaced by irq_bus_lock | ||
| 135 | * @bus_sync_unlock: deprecated, replaced by irq_bus_sync_unlock | ||
| 104 | * | 136 | * |
| 105 | * @bus_lock: function to lock access to slow bus (i2c) chips | 137 | * @irq_startup: start up the interrupt (defaults to ->enable if NULL) |
| 106 | * @bus_sync_unlock: function to sync and unlock slow bus (i2c) chips | 138 | * @irq_shutdown: shut down the interrupt (defaults to ->disable if NULL) |
| 139 | * @irq_enable: enable the interrupt (defaults to chip->unmask if NULL) | ||
| 140 | * @irq_disable: disable the interrupt | ||
| 141 | * @irq_ack: start of a new interrupt | ||
| 142 | * @irq_mask: mask an interrupt source | ||
| 143 | * @irq_mask_ack: ack and mask an interrupt source | ||
| 144 | * @irq_unmask: unmask an interrupt source | ||
| 145 | * @irq_eoi: end of interrupt | ||
| 146 | * @irq_set_affinity: set the CPU affinity on SMP machines | ||
| 147 | * @irq_retrigger: resend an IRQ to the CPU | ||
| 148 | * @irq_set_type: set the flow type (IRQ_TYPE_LEVEL/etc.) of an IRQ | ||
| 149 | * @irq_set_wake: enable/disable power-management wake-on of an IRQ | ||
| 150 | * @irq_bus_lock: function to lock access to slow bus (i2c) chips | ||
| 151 | * @irq_bus_sync_unlock:function to sync and unlock slow bus (i2c) chips | ||
| 107 | * | 152 | * |
| 108 | * @release: release function solely used by UML | 153 | * @release: release function solely used by UML |
| 109 | * @typename: obsoleted by name, kept as migration helper | ||
| 110 | */ | 154 | */ |
| 111 | struct irq_chip { | 155 | struct irq_chip { |
| 112 | const char *name; | 156 | const char *name; |
| 157 | #ifndef CONFIG_GENERIC_HARDIRQS_NO_DEPRECATED | ||
| 113 | unsigned int (*startup)(unsigned int irq); | 158 | unsigned int (*startup)(unsigned int irq); |
| 114 | void (*shutdown)(unsigned int irq); | 159 | void (*shutdown)(unsigned int irq); |
| 115 | void (*enable)(unsigned int irq); | 160 | void (*enable)(unsigned int irq); |
| @@ -130,154 +175,66 @@ struct irq_chip { | |||
| 130 | 175 | ||
| 131 | void (*bus_lock)(unsigned int irq); | 176 | void (*bus_lock)(unsigned int irq); |
| 132 | void (*bus_sync_unlock)(unsigned int irq); | 177 | void (*bus_sync_unlock)(unsigned int irq); |
| 178 | #endif | ||
| 179 | unsigned int (*irq_startup)(struct irq_data *data); | ||
| 180 | void (*irq_shutdown)(struct irq_data *data); | ||
| 181 | void (*irq_enable)(struct irq_data *data); | ||
| 182 | void (*irq_disable)(struct irq_data *data); | ||
| 183 | |||
| 184 | void (*irq_ack)(struct irq_data *data); | ||
| 185 | void (*irq_mask)(struct irq_data *data); | ||
| 186 | void (*irq_mask_ack)(struct irq_data *data); | ||
| 187 | void (*irq_unmask)(struct irq_data *data); | ||
| 188 | void (*irq_eoi)(struct irq_data *data); | ||
| 189 | |||
| 190 | int (*irq_set_affinity)(struct irq_data *data, const struct cpumask *dest, bool force); | ||
| 191 | int (*irq_retrigger)(struct irq_data *data); | ||
| 192 | int (*irq_set_type)(struct irq_data *data, unsigned int flow_type); | ||
| 193 | int (*irq_set_wake)(struct irq_data *data, unsigned int on); | ||
| 194 | |||
| 195 | void (*irq_bus_lock)(struct irq_data *data); | ||
| 196 | void (*irq_bus_sync_unlock)(struct irq_data *data); | ||
| 133 | 197 | ||
| 134 | /* Currently used only by UML, might disappear one day.*/ | 198 | /* Currently used only by UML, might disappear one day.*/ |
| 135 | #ifdef CONFIG_IRQ_RELEASE_METHOD | 199 | #ifdef CONFIG_IRQ_RELEASE_METHOD |
| 136 | void (*release)(unsigned int irq, void *dev_id); | 200 | void (*release)(unsigned int irq, void *dev_id); |
| 137 | #endif | 201 | #endif |
| 138 | /* | ||
| 139 | * For compatibility, ->typename is copied into ->name. | ||
| 140 | * Will disappear. | ||
| 141 | */ | ||
| 142 | const char *typename; | ||
| 143 | }; | 202 | }; |
| 144 | 203 | ||
| 145 | struct timer_rand_state; | 204 | /* This include will go away once we isolated irq_desc usage to core code */ |
| 146 | struct irq_2_iommu; | 205 | #include <linux/irqdesc.h> |
| 147 | /** | ||
| 148 | * struct irq_desc - interrupt descriptor | ||
| 149 | * @irq: interrupt number for this descriptor | ||
| 150 | * @timer_rand_state: pointer to timer rand state struct | ||
| 151 | * @kstat_irqs: irq stats per cpu | ||
| 152 | * @irq_2_iommu: iommu with this irq | ||
| 153 | * @handle_irq: highlevel irq-events handler [if NULL, __do_IRQ()] | ||
| 154 | * @chip: low level interrupt hardware access | ||
| 155 | * @msi_desc: MSI descriptor | ||
| 156 | * @handler_data: per-IRQ data for the irq_chip methods | ||
| 157 | * @chip_data: platform-specific per-chip private data for the chip | ||
| 158 | * methods, to allow shared chip implementations | ||
| 159 | * @action: the irq action chain | ||
| 160 | * @status: status information | ||
| 161 | * @depth: disable-depth, for nested irq_disable() calls | ||
| 162 | * @wake_depth: enable depth, for multiple set_irq_wake() callers | ||
| 163 | * @irq_count: stats field to detect stalled irqs | ||
| 164 | * @last_unhandled: aging timer for unhandled count | ||
| 165 | * @irqs_unhandled: stats field for spurious unhandled interrupts | ||
| 166 | * @lock: locking for SMP | ||
| 167 | * @affinity: IRQ affinity on SMP | ||
| 168 | * @node: node index useful for balancing | ||
| 169 | * @pending_mask: pending rebalanced interrupts | ||
| 170 | * @threads_active: number of irqaction threads currently running | ||
| 171 | * @wait_for_threads: wait queue for sync_irq to wait for threaded handlers | ||
| 172 | * @dir: /proc/irq/ procfs entry | ||
| 173 | * @name: flow handler name for /proc/interrupts output | ||
| 174 | */ | ||
| 175 | struct irq_desc { | ||
| 176 | unsigned int irq; | ||
| 177 | struct timer_rand_state *timer_rand_state; | ||
| 178 | unsigned int *kstat_irqs; | ||
| 179 | #ifdef CONFIG_INTR_REMAP | ||
| 180 | struct irq_2_iommu *irq_2_iommu; | ||
| 181 | #endif | ||
| 182 | irq_flow_handler_t handle_irq; | ||
| 183 | struct irq_chip *chip; | ||
| 184 | struct msi_desc *msi_desc; | ||
| 185 | void *handler_data; | ||
| 186 | void *chip_data; | ||
| 187 | struct irqaction *action; /* IRQ action list */ | ||
| 188 | unsigned int status; /* IRQ status */ | ||
| 189 | |||
| 190 | unsigned int depth; /* nested irq disables */ | ||
| 191 | unsigned int wake_depth; /* nested wake enables */ | ||
| 192 | unsigned int irq_count; /* For detecting broken IRQs */ | ||
| 193 | unsigned long last_unhandled; /* Aging timer for unhandled count */ | ||
| 194 | unsigned int irqs_unhandled; | ||
| 195 | raw_spinlock_t lock; | ||
| 196 | #ifdef CONFIG_SMP | ||
| 197 | cpumask_var_t affinity; | ||
| 198 | const struct cpumask *affinity_hint; | ||
| 199 | unsigned int node; | ||
| 200 | #ifdef CONFIG_GENERIC_PENDING_IRQ | ||
| 201 | cpumask_var_t pending_mask; | ||
| 202 | #endif | ||
| 203 | #endif | ||
| 204 | atomic_t threads_active; | ||
| 205 | wait_queue_head_t wait_for_threads; | ||
| 206 | #ifdef CONFIG_PROC_FS | ||
| 207 | struct proc_dir_entry *dir; | ||
| 208 | #endif | ||
| 209 | const char *name; | ||
| 210 | } ____cacheline_internodealigned_in_smp; | ||
| 211 | 206 | ||
| 212 | extern void arch_init_copy_chip_data(struct irq_desc *old_desc, | 207 | /* |
| 213 | struct irq_desc *desc, int node); | 208 | * Pick up the arch-dependent methods: |
| 214 | extern void arch_free_chip_data(struct irq_desc *old_desc, struct irq_desc *desc); | 209 | */ |
| 210 | #include <asm/hw_irq.h> | ||
| 215 | 211 | ||
| 216 | #ifndef CONFIG_SPARSE_IRQ | 212 | #ifndef NR_IRQS_LEGACY |
| 217 | extern struct irq_desc irq_desc[NR_IRQS]; | 213 | # define NR_IRQS_LEGACY 0 |
| 218 | #endif | 214 | #endif |
| 219 | 215 | ||
| 220 | #ifdef CONFIG_NUMA_IRQ_DESC | 216 | #ifndef ARCH_IRQ_INIT_FLAGS |
| 221 | extern struct irq_desc *move_irq_desc(struct irq_desc *old_desc, int node); | 217 | # define ARCH_IRQ_INIT_FLAGS 0 |
| 222 | #else | ||
| 223 | static inline struct irq_desc *move_irq_desc(struct irq_desc *desc, int node) | ||
| 224 | { | ||
| 225 | return desc; | ||
| 226 | } | ||
| 227 | #endif | 218 | #endif |
| 228 | 219 | ||
| 229 | extern struct irq_desc *irq_to_desc_alloc_node(unsigned int irq, int node); | 220 | #define IRQ_DEFAULT_INIT_FLAGS (IRQ_DISABLED | ARCH_IRQ_INIT_FLAGS) |
| 230 | |||
| 231 | /* | ||
| 232 | * Pick up the arch-dependent methods: | ||
| 233 | */ | ||
| 234 | #include <asm/hw_irq.h> | ||
| 235 | 221 | ||
| 222 | struct irqaction; | ||
| 236 | extern int setup_irq(unsigned int irq, struct irqaction *new); | 223 | extern int setup_irq(unsigned int irq, struct irqaction *new); |
| 237 | extern void remove_irq(unsigned int irq, struct irqaction *act); | 224 | extern void remove_irq(unsigned int irq, struct irqaction *act); |
| 238 | 225 | ||
| 239 | #ifdef CONFIG_GENERIC_HARDIRQS | 226 | #ifdef CONFIG_GENERIC_HARDIRQS |
| 240 | 227 | ||
| 241 | #ifdef CONFIG_SMP | 228 | #if defined(CONFIG_SMP) && defined(CONFIG_GENERIC_PENDING_IRQ) |
| 242 | |||
| 243 | #ifdef CONFIG_GENERIC_PENDING_IRQ | ||
| 244 | |||
| 245 | void move_native_irq(int irq); | 229 | void move_native_irq(int irq); |
| 246 | void move_masked_irq(int irq); | 230 | void move_masked_irq(int irq); |
| 247 | 231 | #else | |
| 248 | #else /* CONFIG_GENERIC_PENDING_IRQ */ | 232 | static inline void move_native_irq(int irq) { } |
| 249 | 233 | static inline void move_masked_irq(int irq) { } | |
| 250 | static inline void move_irq(int irq) | 234 | #endif |
| 251 | { | ||
| 252 | } | ||
| 253 | |||
| 254 | static inline void move_native_irq(int irq) | ||
| 255 | { | ||
| 256 | } | ||
| 257 | |||
| 258 | static inline void move_masked_irq(int irq) | ||
| 259 | { | ||
| 260 | } | ||
| 261 | |||
| 262 | #endif /* CONFIG_GENERIC_PENDING_IRQ */ | ||
| 263 | |||
| 264 | #else /* CONFIG_SMP */ | ||
| 265 | |||
| 266 | #define move_native_irq(x) | ||
| 267 | #define move_masked_irq(x) | ||
| 268 | |||
| 269 | #endif /* CONFIG_SMP */ | ||
| 270 | 235 | ||
| 271 | extern int no_irq_affinity; | 236 | extern int no_irq_affinity; |
| 272 | 237 | ||
| 273 | static inline int irq_balancing_disabled(unsigned int irq) | ||
| 274 | { | ||
| 275 | struct irq_desc *desc; | ||
| 276 | |||
| 277 | desc = irq_to_desc(irq); | ||
| 278 | return desc->status & IRQ_NO_BALANCING_MASK; | ||
| 279 | } | ||
| 280 | |||
| 281 | /* Handle irq action chains: */ | 238 | /* Handle irq action chains: */ |
| 282 | extern irqreturn_t handle_IRQ_event(unsigned int irq, struct irqaction *action); | 239 | extern irqreturn_t handle_IRQ_event(unsigned int irq, struct irqaction *action); |
| 283 | 240 | ||
| @@ -293,42 +250,10 @@ extern void handle_percpu_irq(unsigned int irq, struct irq_desc *desc); | |||
| 293 | extern void handle_bad_irq(unsigned int irq, struct irq_desc *desc); | 250 | extern void handle_bad_irq(unsigned int irq, struct irq_desc *desc); |
| 294 | extern void handle_nested_irq(unsigned int irq); | 251 | extern void handle_nested_irq(unsigned int irq); |
| 295 | 252 | ||
| 296 | /* | ||
| 297 | * Monolithic do_IRQ implementation. | ||
| 298 | */ | ||
| 299 | #ifndef CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ | ||
| 300 | extern unsigned int __do_IRQ(unsigned int irq); | ||
| 301 | #endif | ||
| 302 | |||
| 303 | /* | ||
| 304 | * Architectures call this to let the generic IRQ layer | ||
| 305 | * handle an interrupt. If the descriptor is attached to an | ||
| 306 | * irqchip-style controller then we call the ->handle_irq() handler, | ||
| 307 | * and it calls __do_IRQ() if it's attached to an irqtype-style controller. | ||
| 308 | */ | ||
| 309 | static inline void generic_handle_irq_desc(unsigned int irq, struct irq_desc *desc) | ||
| 310 | { | ||
| 311 | #ifdef CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ | ||
| 312 | desc->handle_irq(irq, desc); | ||
| 313 | #else | ||
| 314 | if (likely(desc->handle_irq)) | ||
| 315 | desc->handle_irq(irq, desc); | ||
| 316 | else | ||
| 317 | __do_IRQ(irq); | ||
| 318 | #endif | ||
| 319 | } | ||
| 320 | |||
| 321 | static inline void generic_handle_irq(unsigned int irq) | ||
| 322 | { | ||
| 323 | generic_handle_irq_desc(irq, irq_to_desc(irq)); | ||
| 324 | } | ||
| 325 | |||
| 326 | /* Handling of unhandled and spurious interrupts: */ | 253 | /* Handling of unhandled and spurious interrupts: */ |
| 327 | extern void note_interrupt(unsigned int irq, struct irq_desc *desc, | 254 | extern void note_interrupt(unsigned int irq, struct irq_desc *desc, |
| 328 | irqreturn_t action_ret); | 255 | irqreturn_t action_ret); |
| 329 | 256 | ||
| 330 | /* Resending of interrupts :*/ | ||
| 331 | void check_irq_resend(struct irq_desc *desc, unsigned int irq); | ||
| 332 | 257 | ||
| 333 | /* Enable/disable irq debugging output: */ | 258 | /* Enable/disable irq debugging output: */ |
| 334 | extern int noirqdebug_setup(char *str); | 259 | extern int noirqdebug_setup(char *str); |
| @@ -351,16 +276,6 @@ extern void | |||
| 351 | __set_irq_handler(unsigned int irq, irq_flow_handler_t handle, int is_chained, | 276 | __set_irq_handler(unsigned int irq, irq_flow_handler_t handle, int is_chained, |
| 352 | const char *name); | 277 | const char *name); |
| 353 | 278 | ||
| 354 | /* caller has locked the irq_desc and both params are valid */ | ||
| 355 | static inline void __set_irq_handler_unlocked(int irq, | ||
| 356 | irq_flow_handler_t handler) | ||
| 357 | { | ||
| 358 | struct irq_desc *desc; | ||
| 359 | |||
| 360 | desc = irq_to_desc(irq); | ||
| 361 | desc->handle_irq = handler; | ||
| 362 | } | ||
| 363 | |||
| 364 | /* | 279 | /* |
| 365 | * Set a highlevel flow handler for a given IRQ: | 280 | * Set a highlevel flow handler for a given IRQ: |
| 366 | */ | 281 | */ |
| @@ -384,141 +299,121 @@ set_irq_chained_handler(unsigned int irq, | |||
| 384 | 299 | ||
| 385 | extern void set_irq_nested_thread(unsigned int irq, int nest); | 300 | extern void set_irq_nested_thread(unsigned int irq, int nest); |
| 386 | 301 | ||
| 387 | extern void set_irq_noprobe(unsigned int irq); | 302 | void irq_modify_status(unsigned int irq, unsigned long clr, unsigned long set); |
| 388 | extern void set_irq_probe(unsigned int irq); | 303 | |
| 304 | static inline void irq_set_status_flags(unsigned int irq, unsigned long set) | ||
| 305 | { | ||
| 306 | irq_modify_status(irq, 0, set); | ||
| 307 | } | ||
| 308 | |||
| 309 | static inline void irq_clear_status_flags(unsigned int irq, unsigned long clr) | ||
| 310 | { | ||
| 311 | irq_modify_status(irq, clr, 0); | ||
| 312 | } | ||
| 313 | |||
| 314 | static inline void set_irq_noprobe(unsigned int irq) | ||
| 315 | { | ||
| 316 | irq_modify_status(irq, 0, IRQ_NOPROBE); | ||
| 317 | } | ||
| 318 | |||
| 319 | static inline void set_irq_probe(unsigned int irq) | ||
| 320 | { | ||
| 321 | irq_modify_status(irq, IRQ_NOPROBE, 0); | ||
| 322 | } | ||
| 389 | 323 | ||
| 390 | /* Handle dynamic irq creation and destruction */ | 324 | /* Handle dynamic irq creation and destruction */ |
| 391 | extern unsigned int create_irq_nr(unsigned int irq_want, int node); | 325 | extern unsigned int create_irq_nr(unsigned int irq_want, int node); |
| 392 | extern int create_irq(void); | 326 | extern int create_irq(void); |
| 393 | extern void destroy_irq(unsigned int irq); | 327 | extern void destroy_irq(unsigned int irq); |
| 394 | 328 | ||
| 395 | /* Test to see if a driver has successfully requested an irq */ | 329 | /* |
| 396 | static inline int irq_has_action(unsigned int irq) | 330 | * Dynamic irq helper functions. Obsolete. Use irq_alloc_desc* and |
| 331 | * irq_free_desc instead. | ||
| 332 | */ | ||
| 333 | extern void dynamic_irq_cleanup(unsigned int irq); | ||
| 334 | static inline void dynamic_irq_init(unsigned int irq) | ||
| 397 | { | 335 | { |
| 398 | struct irq_desc *desc = irq_to_desc(irq); | 336 | dynamic_irq_cleanup(irq); |
| 399 | return desc->action != NULL; | ||
| 400 | } | 337 | } |
| 401 | 338 | ||
| 402 | /* Dynamic irq helper functions */ | ||
| 403 | extern void dynamic_irq_init(unsigned int irq); | ||
| 404 | void dynamic_irq_init_keep_chip_data(unsigned int irq); | ||
| 405 | extern void dynamic_irq_cleanup(unsigned int irq); | ||
| 406 | void dynamic_irq_cleanup_keep_chip_data(unsigned int irq); | ||
| 407 | |||
| 408 | /* Set/get chip/data for an IRQ: */ | 339 | /* Set/get chip/data for an IRQ: */ |
| 409 | extern int set_irq_chip(unsigned int irq, struct irq_chip *chip); | 340 | extern int set_irq_chip(unsigned int irq, struct irq_chip *chip); |
| 410 | extern int set_irq_data(unsigned int irq, void *data); | 341 | extern int set_irq_data(unsigned int irq, void *data); |
| 411 | extern int set_irq_chip_data(unsigned int irq, void *data); | 342 | extern int set_irq_chip_data(unsigned int irq, void *data); |
| 412 | extern int set_irq_type(unsigned int irq, unsigned int type); | 343 | extern int set_irq_type(unsigned int irq, unsigned int type); |
| 413 | extern int set_irq_msi(unsigned int irq, struct msi_desc *entry); | 344 | extern int set_irq_msi(unsigned int irq, struct msi_desc *entry); |
| 345 | extern struct irq_data *irq_get_irq_data(unsigned int irq); | ||
| 414 | 346 | ||
| 415 | #define get_irq_chip(irq) (irq_to_desc(irq)->chip) | 347 | static inline struct irq_chip *get_irq_chip(unsigned int irq) |
| 416 | #define get_irq_chip_data(irq) (irq_to_desc(irq)->chip_data) | ||
| 417 | #define get_irq_data(irq) (irq_to_desc(irq)->handler_data) | ||
| 418 | #define get_irq_msi(irq) (irq_to_desc(irq)->msi_desc) | ||
| 419 | |||
| 420 | #define get_irq_desc_chip(desc) ((desc)->chip) | ||
| 421 | #define get_irq_desc_chip_data(desc) ((desc)->chip_data) | ||
| 422 | #define get_irq_desc_data(desc) ((desc)->handler_data) | ||
| 423 | #define get_irq_desc_msi(desc) ((desc)->msi_desc) | ||
| 424 | |||
| 425 | #endif /* CONFIG_GENERIC_HARDIRQS */ | ||
| 426 | |||
| 427 | #endif /* !CONFIG_S390 */ | ||
| 428 | |||
| 429 | #ifdef CONFIG_SMP | ||
| 430 | /** | ||
| 431 | * alloc_desc_masks - allocate cpumasks for irq_desc | ||
| 432 | * @desc: pointer to irq_desc struct | ||
| 433 | * @node: node which will be handling the cpumasks | ||
| 434 | * @boot: true if need bootmem | ||
| 435 | * | ||
| 436 | * Allocates affinity and pending_mask cpumask if required. | ||
| 437 | * Returns true if successful (or not required). | ||
| 438 | */ | ||
| 439 | static inline bool alloc_desc_masks(struct irq_desc *desc, int node, | ||
| 440 | bool boot) | ||
| 441 | { | 348 | { |
| 442 | gfp_t gfp = GFP_ATOMIC; | 349 | struct irq_data *d = irq_get_irq_data(irq); |
| 443 | 350 | return d ? d->chip : NULL; | |
| 444 | if (boot) | 351 | } |
| 445 | gfp = GFP_NOWAIT; | ||
| 446 | |||
| 447 | #ifdef CONFIG_CPUMASK_OFFSTACK | ||
| 448 | if (!alloc_cpumask_var_node(&desc->affinity, gfp, node)) | ||
| 449 | return false; | ||
| 450 | 352 | ||
| 451 | #ifdef CONFIG_GENERIC_PENDING_IRQ | 353 | static inline struct irq_chip *irq_data_get_irq_chip(struct irq_data *d) |
| 452 | if (!alloc_cpumask_var_node(&desc->pending_mask, gfp, node)) { | 354 | { |
| 453 | free_cpumask_var(desc->affinity); | 355 | return d->chip; |
| 454 | return false; | ||
| 455 | } | ||
| 456 | #endif | ||
| 457 | #endif | ||
| 458 | return true; | ||
| 459 | } | 356 | } |
| 460 | 357 | ||
| 461 | static inline void init_desc_masks(struct irq_desc *desc) | 358 | static inline void *get_irq_chip_data(unsigned int irq) |
| 462 | { | 359 | { |
| 463 | cpumask_setall(desc->affinity); | 360 | struct irq_data *d = irq_get_irq_data(irq); |
| 464 | #ifdef CONFIG_GENERIC_PENDING_IRQ | 361 | return d ? d->chip_data : NULL; |
| 465 | cpumask_clear(desc->pending_mask); | ||
| 466 | #endif | ||
| 467 | } | 362 | } |
| 468 | 363 | ||
| 469 | /** | 364 | static inline void *irq_data_get_irq_chip_data(struct irq_data *d) |
| 470 | * init_copy_desc_masks - copy cpumasks for irq_desc | 365 | { |
| 471 | * @old_desc: pointer to old irq_desc struct | 366 | return d->chip_data; |
| 472 | * @new_desc: pointer to new irq_desc struct | 367 | } |
| 473 | * | ||
| 474 | * Insures affinity and pending_masks are copied to new irq_desc. | ||
| 475 | * If !CONFIG_CPUMASKS_OFFSTACK the cpumasks are embedded in the | ||
| 476 | * irq_desc struct so the copy is redundant. | ||
| 477 | */ | ||
| 478 | 368 | ||
| 479 | static inline void init_copy_desc_masks(struct irq_desc *old_desc, | 369 | static inline void *get_irq_data(unsigned int irq) |
| 480 | struct irq_desc *new_desc) | ||
| 481 | { | 370 | { |
| 482 | #ifdef CONFIG_CPUMASK_OFFSTACK | 371 | struct irq_data *d = irq_get_irq_data(irq); |
| 483 | cpumask_copy(new_desc->affinity, old_desc->affinity); | 372 | return d ? d->handler_data : NULL; |
| 373 | } | ||
| 484 | 374 | ||
| 485 | #ifdef CONFIG_GENERIC_PENDING_IRQ | 375 | static inline void *irq_data_get_irq_data(struct irq_data *d) |
| 486 | cpumask_copy(new_desc->pending_mask, old_desc->pending_mask); | 376 | { |
| 487 | #endif | 377 | return d->handler_data; |
| 488 | #endif | ||
| 489 | } | 378 | } |
| 490 | 379 | ||
| 491 | static inline void free_desc_masks(struct irq_desc *old_desc, | 380 | static inline struct msi_desc *get_irq_msi(unsigned int irq) |
| 492 | struct irq_desc *new_desc) | ||
| 493 | { | 381 | { |
| 494 | free_cpumask_var(old_desc->affinity); | 382 | struct irq_data *d = irq_get_irq_data(irq); |
| 383 | return d ? d->msi_desc : NULL; | ||
| 384 | } | ||
| 495 | 385 | ||
| 496 | #ifdef CONFIG_GENERIC_PENDING_IRQ | 386 | static inline struct msi_desc *irq_data_get_msi(struct irq_data *d) |
| 497 | free_cpumask_var(old_desc->pending_mask); | 387 | { |
| 498 | #endif | 388 | return d->msi_desc; |
| 499 | } | 389 | } |
| 500 | 390 | ||
| 501 | #else /* !CONFIG_SMP */ | 391 | int irq_alloc_descs(int irq, unsigned int from, unsigned int cnt, int node); |
| 392 | void irq_free_descs(unsigned int irq, unsigned int cnt); | ||
| 393 | int irq_reserve_irqs(unsigned int from, unsigned int cnt); | ||
| 502 | 394 | ||
| 503 | static inline bool alloc_desc_masks(struct irq_desc *desc, int node, | 395 | static inline int irq_alloc_desc(int node) |
| 504 | bool boot) | ||
| 505 | { | 396 | { |
| 506 | return true; | 397 | return irq_alloc_descs(-1, 0, 1, node); |
| 507 | } | 398 | } |
| 508 | 399 | ||
| 509 | static inline void init_desc_masks(struct irq_desc *desc) | 400 | static inline int irq_alloc_desc_at(unsigned int at, int node) |
| 510 | { | 401 | { |
| 402 | return irq_alloc_descs(at, at, 1, node); | ||
| 511 | } | 403 | } |
| 512 | 404 | ||
| 513 | static inline void init_copy_desc_masks(struct irq_desc *old_desc, | 405 | static inline int irq_alloc_desc_from(unsigned int from, int node) |
| 514 | struct irq_desc *new_desc) | ||
| 515 | { | 406 | { |
| 407 | return irq_alloc_descs(-1, from, 1, node); | ||
| 516 | } | 408 | } |
| 517 | 409 | ||
| 518 | static inline void free_desc_masks(struct irq_desc *old_desc, | 410 | static inline void irq_free_desc(unsigned int irq) |
| 519 | struct irq_desc *new_desc) | ||
| 520 | { | 411 | { |
| 412 | irq_free_descs(irq, 1); | ||
| 521 | } | 413 | } |
| 522 | #endif /* CONFIG_SMP */ | 414 | |
| 415 | #endif /* CONFIG_GENERIC_HARDIRQS */ | ||
| 416 | |||
| 417 | #endif /* !CONFIG_S390 */ | ||
| 523 | 418 | ||
| 524 | #endif /* _LINUX_IRQ_H */ | 419 | #endif /* _LINUX_IRQ_H */ |
diff --git a/include/linux/irq_work.h b/include/linux/irq_work.h new file mode 100644 index 000000000000..4fa09d4d0b71 --- /dev/null +++ b/include/linux/irq_work.h | |||
| @@ -0,0 +1,20 @@ | |||
| 1 | #ifndef _LINUX_IRQ_WORK_H | ||
| 2 | #define _LINUX_IRQ_WORK_H | ||
| 3 | |||
| 4 | struct irq_work { | ||
| 5 | struct irq_work *next; | ||
| 6 | void (*func)(struct irq_work *); | ||
| 7 | }; | ||
| 8 | |||
| 9 | static inline | ||
| 10 | void init_irq_work(struct irq_work *entry, void (*func)(struct irq_work *)) | ||
| 11 | { | ||
| 12 | entry->next = NULL; | ||
| 13 | entry->func = func; | ||
| 14 | } | ||
| 15 | |||
| 16 | bool irq_work_queue(struct irq_work *entry); | ||
| 17 | void irq_work_run(void); | ||
| 18 | void irq_work_sync(struct irq_work *entry); | ||
| 19 | |||
| 20 | #endif /* _LINUX_IRQ_WORK_H */ | ||
diff --git a/include/linux/irqdesc.h b/include/linux/irqdesc.h new file mode 100644 index 000000000000..979c68cc7458 --- /dev/null +++ b/include/linux/irqdesc.h | |||
| @@ -0,0 +1,159 @@ | |||
| 1 | #ifndef _LINUX_IRQDESC_H | ||
| 2 | #define _LINUX_IRQDESC_H | ||
| 3 | |||
| 4 | /* | ||
| 5 | * Core internal functions to deal with irq descriptors | ||
| 6 | * | ||
| 7 | * This include will move to kernel/irq once we cleaned up the tree. | ||
| 8 | * For now it's included from <linux/irq.h> | ||
| 9 | */ | ||
| 10 | |||
| 11 | struct proc_dir_entry; | ||
| 12 | struct timer_rand_state; | ||
| 13 | /** | ||
| 14 | * struct irq_desc - interrupt descriptor | ||
| 15 | * @irq_data: per irq and chip data passed down to chip functions | ||
| 16 | * @timer_rand_state: pointer to timer rand state struct | ||
| 17 | * @kstat_irqs: irq stats per cpu | ||
| 18 | * @handle_irq: highlevel irq-events handler [if NULL, __do_IRQ()] | ||
| 19 | * @action: the irq action chain | ||
| 20 | * @status: status information | ||
| 21 | * @depth: disable-depth, for nested irq_disable() calls | ||
| 22 | * @wake_depth: enable depth, for multiple set_irq_wake() callers | ||
| 23 | * @irq_count: stats field to detect stalled irqs | ||
| 24 | * @last_unhandled: aging timer for unhandled count | ||
| 25 | * @irqs_unhandled: stats field for spurious unhandled interrupts | ||
| 26 | * @lock: locking for SMP | ||
| 27 | * @pending_mask: pending rebalanced interrupts | ||
| 28 | * @threads_active: number of irqaction threads currently running | ||
| 29 | * @wait_for_threads: wait queue for sync_irq to wait for threaded handlers | ||
| 30 | * @dir: /proc/irq/ procfs entry | ||
| 31 | * @name: flow handler name for /proc/interrupts output | ||
| 32 | */ | ||
| 33 | struct irq_desc { | ||
| 34 | |||
| 35 | #ifdef CONFIG_GENERIC_HARDIRQS_NO_DEPRECATED | ||
| 36 | struct irq_data irq_data; | ||
| 37 | #else | ||
| 38 | /* | ||
| 39 | * This union will go away, once we fixed the direct access to | ||
| 40 | * irq_desc all over the place. The direct fields are a 1:1 | ||
| 41 | * overlay of irq_data. | ||
| 42 | */ | ||
| 43 | union { | ||
| 44 | struct irq_data irq_data; | ||
| 45 | struct { | ||
| 46 | unsigned int irq; | ||
| 47 | unsigned int node; | ||
| 48 | struct irq_chip *chip; | ||
| 49 | void *handler_data; | ||
| 50 | void *chip_data; | ||
| 51 | struct msi_desc *msi_desc; | ||
| 52 | #ifdef CONFIG_SMP | ||
| 53 | cpumask_var_t affinity; | ||
| 54 | #endif | ||
| 55 | }; | ||
| 56 | }; | ||
| 57 | #endif | ||
| 58 | |||
| 59 | struct timer_rand_state *timer_rand_state; | ||
| 60 | unsigned int *kstat_irqs; | ||
| 61 | irq_flow_handler_t handle_irq; | ||
| 62 | struct irqaction *action; /* IRQ action list */ | ||
| 63 | unsigned int status; /* IRQ status */ | ||
| 64 | |||
| 65 | unsigned int depth; /* nested irq disables */ | ||
| 66 | unsigned int wake_depth; /* nested wake enables */ | ||
| 67 | unsigned int irq_count; /* For detecting broken IRQs */ | ||
| 68 | unsigned long last_unhandled; /* Aging timer for unhandled count */ | ||
| 69 | unsigned int irqs_unhandled; | ||
| 70 | raw_spinlock_t lock; | ||
| 71 | #ifdef CONFIG_SMP | ||
| 72 | const struct cpumask *affinity_hint; | ||
| 73 | #ifdef CONFIG_GENERIC_PENDING_IRQ | ||
| 74 | cpumask_var_t pending_mask; | ||
| 75 | #endif | ||
| 76 | #endif | ||
| 77 | atomic_t threads_active; | ||
| 78 | wait_queue_head_t wait_for_threads; | ||
| 79 | #ifdef CONFIG_PROC_FS | ||
| 80 | struct proc_dir_entry *dir; | ||
| 81 | #endif | ||
| 82 | const char *name; | ||
| 83 | } ____cacheline_internodealigned_in_smp; | ||
| 84 | |||
| 85 | #ifndef CONFIG_SPARSE_IRQ | ||
| 86 | extern struct irq_desc irq_desc[NR_IRQS]; | ||
| 87 | #endif | ||
| 88 | |||
| 89 | /* Will be removed once the last users in power and sh are gone */ | ||
| 90 | extern struct irq_desc *irq_to_desc_alloc_node(unsigned int irq, int node); | ||
| 91 | static inline struct irq_desc *move_irq_desc(struct irq_desc *desc, int node) | ||
| 92 | { | ||
| 93 | return desc; | ||
| 94 | } | ||
| 95 | |||
| 96 | #ifdef CONFIG_GENERIC_HARDIRQS | ||
| 97 | |||
| 98 | #define get_irq_desc_chip(desc) ((desc)->irq_data.chip) | ||
| 99 | #define get_irq_desc_chip_data(desc) ((desc)->irq_data.chip_data) | ||
| 100 | #define get_irq_desc_data(desc) ((desc)->irq_data.handler_data) | ||
| 101 | #define get_irq_desc_msi(desc) ((desc)->irq_data.msi_desc) | ||
| 102 | |||
| 103 | /* | ||
| 104 | * Monolithic do_IRQ implementation. | ||
| 105 | */ | ||
| 106 | #ifndef CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ | ||
| 107 | extern unsigned int __do_IRQ(unsigned int irq); | ||
| 108 | #endif | ||
| 109 | |||
| 110 | /* | ||
| 111 | * Architectures call this to let the generic IRQ layer | ||
| 112 | * handle an interrupt. If the descriptor is attached to an | ||
| 113 | * irqchip-style controller then we call the ->handle_irq() handler, | ||
| 114 | * and it calls __do_IRQ() if it's attached to an irqtype-style controller. | ||
| 115 | */ | ||
| 116 | static inline void generic_handle_irq_desc(unsigned int irq, struct irq_desc *desc) | ||
| 117 | { | ||
| 118 | #ifdef CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ | ||
| 119 | desc->handle_irq(irq, desc); | ||
| 120 | #else | ||
| 121 | if (likely(desc->handle_irq)) | ||
| 122 | desc->handle_irq(irq, desc); | ||
| 123 | else | ||
| 124 | __do_IRQ(irq); | ||
| 125 | #endif | ||
| 126 | } | ||
| 127 | |||
| 128 | static inline void generic_handle_irq(unsigned int irq) | ||
| 129 | { | ||
| 130 | generic_handle_irq_desc(irq, irq_to_desc(irq)); | ||
| 131 | } | ||
| 132 | |||
| 133 | /* Test to see if a driver has successfully requested an irq */ | ||
| 134 | static inline int irq_has_action(unsigned int irq) | ||
| 135 | { | ||
| 136 | struct irq_desc *desc = irq_to_desc(irq); | ||
| 137 | return desc->action != NULL; | ||
| 138 | } | ||
| 139 | |||
| 140 | static inline int irq_balancing_disabled(unsigned int irq) | ||
| 141 | { | ||
| 142 | struct irq_desc *desc; | ||
| 143 | |||
| 144 | desc = irq_to_desc(irq); | ||
| 145 | return desc->status & IRQ_NO_BALANCING_MASK; | ||
| 146 | } | ||
| 147 | |||
| 148 | /* caller has locked the irq_desc and both params are valid */ | ||
| 149 | static inline void __set_irq_handler_unlocked(int irq, | ||
| 150 | irq_flow_handler_t handler) | ||
| 151 | { | ||
| 152 | struct irq_desc *desc; | ||
| 153 | |||
| 154 | desc = irq_to_desc(irq); | ||
| 155 | desc->handle_irq = handler; | ||
| 156 | } | ||
| 157 | #endif | ||
| 158 | |||
| 159 | #endif | ||
diff --git a/include/linux/irqflags.h b/include/linux/irqflags.h index 006bf45eae30..d176d658fe25 100644 --- a/include/linux/irqflags.h +++ b/include/linux/irqflags.h | |||
| @@ -12,6 +12,7 @@ | |||
| 12 | #define _LINUX_TRACE_IRQFLAGS_H | 12 | #define _LINUX_TRACE_IRQFLAGS_H |
| 13 | 13 | ||
| 14 | #include <linux/typecheck.h> | 14 | #include <linux/typecheck.h> |
| 15 | #include <asm/irqflags.h> | ||
| 15 | 16 | ||
| 16 | #ifdef CONFIG_TRACE_IRQFLAGS | 17 | #ifdef CONFIG_TRACE_IRQFLAGS |
| 17 | extern void trace_softirqs_on(unsigned long ip); | 18 | extern void trace_softirqs_on(unsigned long ip); |
| @@ -52,17 +53,45 @@ | |||
| 52 | # define start_critical_timings() do { } while (0) | 53 | # define start_critical_timings() do { } while (0) |
| 53 | #endif | 54 | #endif |
| 54 | 55 | ||
| 55 | #ifdef CONFIG_TRACE_IRQFLAGS_SUPPORT | 56 | /* |
| 56 | 57 | * Wrap the arch provided IRQ routines to provide appropriate checks. | |
| 57 | #include <asm/irqflags.h> | 58 | */ |
| 59 | #define raw_local_irq_disable() arch_local_irq_disable() | ||
| 60 | #define raw_local_irq_enable() arch_local_irq_enable() | ||
| 61 | #define raw_local_irq_save(flags) \ | ||
| 62 | do { \ | ||
| 63 | typecheck(unsigned long, flags); \ | ||
| 64 | flags = arch_local_irq_save(); \ | ||
| 65 | } while (0) | ||
| 66 | #define raw_local_irq_restore(flags) \ | ||
| 67 | do { \ | ||
| 68 | typecheck(unsigned long, flags); \ | ||
| 69 | arch_local_irq_restore(flags); \ | ||
| 70 | } while (0) | ||
| 71 | #define raw_local_save_flags(flags) \ | ||
| 72 | do { \ | ||
| 73 | typecheck(unsigned long, flags); \ | ||
| 74 | flags = arch_local_save_flags(); \ | ||
| 75 | } while (0) | ||
| 76 | #define raw_irqs_disabled_flags(flags) \ | ||
| 77 | ({ \ | ||
| 78 | typecheck(unsigned long, flags); \ | ||
| 79 | arch_irqs_disabled_flags(flags); \ | ||
| 80 | }) | ||
| 81 | #define raw_irqs_disabled() (arch_irqs_disabled()) | ||
| 82 | #define raw_safe_halt() arch_safe_halt() | ||
| 58 | 83 | ||
| 84 | /* | ||
| 85 | * The local_irq_*() APIs are equal to the raw_local_irq*() | ||
| 86 | * if !TRACE_IRQFLAGS. | ||
| 87 | */ | ||
| 88 | #ifdef CONFIG_TRACE_IRQFLAGS_SUPPORT | ||
| 59 | #define local_irq_enable() \ | 89 | #define local_irq_enable() \ |
| 60 | do { trace_hardirqs_on(); raw_local_irq_enable(); } while (0) | 90 | do { trace_hardirqs_on(); raw_local_irq_enable(); } while (0) |
| 61 | #define local_irq_disable() \ | 91 | #define local_irq_disable() \ |
| 62 | do { raw_local_irq_disable(); trace_hardirqs_off(); } while (0) | 92 | do { raw_local_irq_disable(); trace_hardirqs_off(); } while (0) |
| 63 | #define local_irq_save(flags) \ | 93 | #define local_irq_save(flags) \ |
| 64 | do { \ | 94 | do { \ |
| 65 | typecheck(unsigned long, flags); \ | ||
| 66 | raw_local_irq_save(flags); \ | 95 | raw_local_irq_save(flags); \ |
| 67 | trace_hardirqs_off(); \ | 96 | trace_hardirqs_off(); \ |
| 68 | } while (0) | 97 | } while (0) |
| @@ -70,7 +99,6 @@ | |||
| 70 | 99 | ||
| 71 | #define local_irq_restore(flags) \ | 100 | #define local_irq_restore(flags) \ |
| 72 | do { \ | 101 | do { \ |
| 73 | typecheck(unsigned long, flags); \ | ||
| 74 | if (raw_irqs_disabled_flags(flags)) { \ | 102 | if (raw_irqs_disabled_flags(flags)) { \ |
| 75 | raw_local_irq_restore(flags); \ | 103 | raw_local_irq_restore(flags); \ |
| 76 | trace_hardirqs_off(); \ | 104 | trace_hardirqs_off(); \ |
| @@ -79,51 +107,44 @@ | |||
| 79 | raw_local_irq_restore(flags); \ | 107 | raw_local_irq_restore(flags); \ |
| 80 | } \ | 108 | } \ |
| 81 | } while (0) | 109 | } while (0) |
| 82 | #else /* !CONFIG_TRACE_IRQFLAGS_SUPPORT */ | 110 | #define local_save_flags(flags) \ |
| 83 | /* | ||
| 84 | * The local_irq_*() APIs are equal to the raw_local_irq*() | ||
| 85 | * if !TRACE_IRQFLAGS. | ||
| 86 | */ | ||
| 87 | # define raw_local_irq_disable() local_irq_disable() | ||
| 88 | # define raw_local_irq_enable() local_irq_enable() | ||
| 89 | # define raw_local_irq_save(flags) \ | ||
| 90 | do { \ | ||
| 91 | typecheck(unsigned long, flags); \ | ||
| 92 | local_irq_save(flags); \ | ||
| 93 | } while (0) | ||
| 94 | # define raw_local_irq_restore(flags) \ | ||
| 95 | do { \ | 111 | do { \ |
| 96 | typecheck(unsigned long, flags); \ | 112 | raw_local_save_flags(flags); \ |
| 97 | local_irq_restore(flags); \ | ||
| 98 | } while (0) | 113 | } while (0) |
| 99 | #endif /* CONFIG_TRACE_IRQFLAGS_SUPPORT */ | ||
| 100 | 114 | ||
| 101 | #ifdef CONFIG_TRACE_IRQFLAGS_SUPPORT | 115 | #define irqs_disabled_flags(flags) \ |
| 102 | #define safe_halt() \ | 116 | ({ \ |
| 103 | do { \ | 117 | raw_irqs_disabled_flags(flags); \ |
| 104 | trace_hardirqs_on(); \ | 118 | }) |
| 105 | raw_safe_halt(); \ | ||
| 106 | } while (0) | ||
| 107 | 119 | ||
| 108 | #define local_save_flags(flags) \ | 120 | #define irqs_disabled() \ |
| 109 | do { \ | 121 | ({ \ |
| 110 | typecheck(unsigned long, flags); \ | 122 | unsigned long _flags; \ |
| 111 | raw_local_save_flags(flags); \ | 123 | raw_local_save_flags(_flags); \ |
| 124 | raw_irqs_disabled_flags(_flags); \ | ||
| 125 | }) | ||
| 126 | |||
| 127 | #define safe_halt() \ | ||
| 128 | do { \ | ||
| 129 | trace_hardirqs_on(); \ | ||
| 130 | raw_safe_halt(); \ | ||
| 112 | } while (0) | 131 | } while (0) |
| 113 | 132 | ||
| 114 | #define irqs_disabled() \ | ||
| 115 | ({ \ | ||
| 116 | unsigned long _flags; \ | ||
| 117 | \ | ||
| 118 | raw_local_save_flags(_flags); \ | ||
| 119 | raw_irqs_disabled_flags(_flags); \ | ||
| 120 | }) | ||
| 121 | 133 | ||
| 122 | #define irqs_disabled_flags(flags) \ | 134 | #else /* !CONFIG_TRACE_IRQFLAGS_SUPPORT */ |
| 123 | ({ \ | 135 | |
| 124 | typecheck(unsigned long, flags); \ | 136 | #define local_irq_enable() do { raw_local_irq_enable(); } while (0) |
| 125 | raw_irqs_disabled_flags(flags); \ | 137 | #define local_irq_disable() do { raw_local_irq_disable(); } while (0) |
| 126 | }) | 138 | #define local_irq_save(flags) \ |
| 139 | do { \ | ||
| 140 | raw_local_irq_save(flags); \ | ||
| 141 | } while (0) | ||
| 142 | #define local_irq_restore(flags) do { raw_local_irq_restore(flags); } while (0) | ||
| 143 | #define local_save_flags(flags) do { raw_local_save_flags(flags); } while (0) | ||
| 144 | #define irqs_disabled() (raw_irqs_disabled()) | ||
| 145 | #define irqs_disabled_flags(flags) (raw_irqs_disabled_flags(flags)) | ||
| 146 | #define safe_halt() do { raw_safe_halt(); } while (0) | ||
| 147 | |||
| 127 | #endif /* CONFIG_TRACE_IRQFLAGS_SUPPORT */ | 148 | #endif /* CONFIG_TRACE_IRQFLAGS_SUPPORT */ |
| 128 | 149 | ||
| 129 | #endif | 150 | #endif |
diff --git a/include/linux/irqnr.h b/include/linux/irqnr.h index 7bf89bc8cbca..05aa8c23483f 100644 --- a/include/linux/irqnr.h +++ b/include/linux/irqnr.h | |||
| @@ -25,6 +25,7 @@ | |||
| 25 | 25 | ||
| 26 | extern int nr_irqs; | 26 | extern int nr_irqs; |
| 27 | extern struct irq_desc *irq_to_desc(unsigned int irq); | 27 | extern struct irq_desc *irq_to_desc(unsigned int irq); |
| 28 | unsigned int irq_get_next_irq(unsigned int offset); | ||
| 28 | 29 | ||
| 29 | # define for_each_irq_desc(irq, desc) \ | 30 | # define for_each_irq_desc(irq, desc) \ |
| 30 | for (irq = 0, desc = irq_to_desc(irq); irq < nr_irqs; \ | 31 | for (irq = 0, desc = irq_to_desc(irq); irq < nr_irqs; \ |
| @@ -47,6 +48,10 @@ extern struct irq_desc *irq_to_desc(unsigned int irq); | |||
| 47 | #define irq_node(irq) 0 | 48 | #define irq_node(irq) 0 |
| 48 | #endif | 49 | #endif |
| 49 | 50 | ||
| 51 | # define for_each_active_irq(irq) \ | ||
| 52 | for (irq = irq_get_next_irq(0); irq < nr_irqs; \ | ||
| 53 | irq = irq_get_next_irq(irq + 1)) | ||
| 54 | |||
| 50 | #endif /* CONFIG_GENERIC_HARDIRQS */ | 55 | #endif /* CONFIG_GENERIC_HARDIRQS */ |
| 51 | 56 | ||
| 52 | #define for_each_irq_nr(irq) \ | 57 | #define for_each_irq_nr(irq) \ |
diff --git a/include/linux/iscsi_boot_sysfs.h b/include/linux/iscsi_boot_sysfs.h new file mode 100644 index 000000000000..f1e6c184f14f --- /dev/null +++ b/include/linux/iscsi_boot_sysfs.h | |||
| @@ -0,0 +1,123 @@ | |||
| 1 | /* | ||
| 2 | * Export the iSCSI boot info to userland via sysfs. | ||
| 3 | * | ||
| 4 | * Copyright (C) 2010 Red Hat, Inc. All rights reserved. | ||
| 5 | * Copyright (C) 2010 Mike Christie | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License v2.0 as published by | ||
| 9 | * the Free Software Foundation | ||
| 10 | * | ||
| 11 | * This program is distributed in the hope that it will be useful, | ||
| 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 14 | * GNU General Public License for more details. | ||
| 15 | */ | ||
| 16 | #ifndef _ISCSI_BOOT_SYSFS_ | ||
| 17 | #define _ISCSI_BOOT_SYSFS_ | ||
| 18 | |||
| 19 | /* | ||
| 20 | * The text attributes names for each of the kobjects. | ||
| 21 | */ | ||
| 22 | enum iscsi_boot_eth_properties_enum { | ||
| 23 | ISCSI_BOOT_ETH_INDEX, | ||
| 24 | ISCSI_BOOT_ETH_FLAGS, | ||
| 25 | ISCSI_BOOT_ETH_IP_ADDR, | ||
| 26 | ISCSI_BOOT_ETH_SUBNET_MASK, | ||
| 27 | ISCSI_BOOT_ETH_ORIGIN, | ||
| 28 | ISCSI_BOOT_ETH_GATEWAY, | ||
| 29 | ISCSI_BOOT_ETH_PRIMARY_DNS, | ||
| 30 | ISCSI_BOOT_ETH_SECONDARY_DNS, | ||
| 31 | ISCSI_BOOT_ETH_DHCP, | ||
| 32 | ISCSI_BOOT_ETH_VLAN, | ||
| 33 | ISCSI_BOOT_ETH_MAC, | ||
| 34 | /* eth_pci_bdf - this is replaced by link to the device itself. */ | ||
| 35 | ISCSI_BOOT_ETH_HOSTNAME, | ||
| 36 | ISCSI_BOOT_ETH_END_MARKER, | ||
| 37 | }; | ||
| 38 | |||
| 39 | enum iscsi_boot_tgt_properties_enum { | ||
| 40 | ISCSI_BOOT_TGT_INDEX, | ||
| 41 | ISCSI_BOOT_TGT_FLAGS, | ||
| 42 | ISCSI_BOOT_TGT_IP_ADDR, | ||
| 43 | ISCSI_BOOT_TGT_PORT, | ||
| 44 | ISCSI_BOOT_TGT_LUN, | ||
| 45 | ISCSI_BOOT_TGT_CHAP_TYPE, | ||
| 46 | ISCSI_BOOT_TGT_NIC_ASSOC, | ||
| 47 | ISCSI_BOOT_TGT_NAME, | ||
| 48 | ISCSI_BOOT_TGT_CHAP_NAME, | ||
| 49 | ISCSI_BOOT_TGT_CHAP_SECRET, | ||
| 50 | ISCSI_BOOT_TGT_REV_CHAP_NAME, | ||
| 51 | ISCSI_BOOT_TGT_REV_CHAP_SECRET, | ||
| 52 | ISCSI_BOOT_TGT_END_MARKER, | ||
| 53 | }; | ||
| 54 | |||
| 55 | enum iscsi_boot_initiator_properties_enum { | ||
| 56 | ISCSI_BOOT_INI_INDEX, | ||
| 57 | ISCSI_BOOT_INI_FLAGS, | ||
| 58 | ISCSI_BOOT_INI_ISNS_SERVER, | ||
| 59 | ISCSI_BOOT_INI_SLP_SERVER, | ||
| 60 | ISCSI_BOOT_INI_PRI_RADIUS_SERVER, | ||
| 61 | ISCSI_BOOT_INI_SEC_RADIUS_SERVER, | ||
| 62 | ISCSI_BOOT_INI_INITIATOR_NAME, | ||
| 63 | ISCSI_BOOT_INI_END_MARKER, | ||
| 64 | }; | ||
| 65 | |||
| 66 | struct attribute_group; | ||
| 67 | |||
| 68 | struct iscsi_boot_kobj { | ||
| 69 | struct kobject kobj; | ||
| 70 | struct attribute_group *attr_group; | ||
| 71 | struct list_head list; | ||
| 72 | |||
| 73 | /* | ||
| 74 | * Pointer to store driver specific info. If set this will | ||
| 75 | * be freed for the LLD when the kobj release function is called. | ||
| 76 | */ | ||
| 77 | void *data; | ||
| 78 | /* | ||
| 79 | * Driver specific show function. | ||
| 80 | * | ||
| 81 | * The enum of the type. This can be any value of the above | ||
| 82 | * properties. | ||
| 83 | */ | ||
| 84 | ssize_t (*show) (void *data, int type, char *buf); | ||
| 85 | |||
| 86 | /* | ||
| 87 | * Drivers specific visibility function. | ||
| 88 | * The function should return if they the attr should be readable | ||
| 89 | * writable or should not be shown. | ||
| 90 | * | ||
| 91 | * The enum of the type. This can be any value of the above | ||
| 92 | * properties. | ||
| 93 | */ | ||
| 94 | mode_t (*is_visible) (void *data, int type); | ||
| 95 | }; | ||
| 96 | |||
| 97 | struct iscsi_boot_kset { | ||
| 98 | struct list_head kobj_list; | ||
| 99 | struct kset *kset; | ||
| 100 | }; | ||
| 101 | |||
| 102 | struct iscsi_boot_kobj * | ||
| 103 | iscsi_boot_create_initiator(struct iscsi_boot_kset *boot_kset, int index, | ||
| 104 | void *data, | ||
| 105 | ssize_t (*show) (void *data, int type, char *buf), | ||
| 106 | mode_t (*is_visible) (void *data, int type)); | ||
| 107 | |||
| 108 | struct iscsi_boot_kobj * | ||
| 109 | iscsi_boot_create_ethernet(struct iscsi_boot_kset *boot_kset, int index, | ||
| 110 | void *data, | ||
| 111 | ssize_t (*show) (void *data, int type, char *buf), | ||
| 112 | mode_t (*is_visible) (void *data, int type)); | ||
| 113 | struct iscsi_boot_kobj * | ||
| 114 | iscsi_boot_create_target(struct iscsi_boot_kset *boot_kset, int index, | ||
| 115 | void *data, | ||
| 116 | ssize_t (*show) (void *data, int type, char *buf), | ||
| 117 | mode_t (*is_visible) (void *data, int type)); | ||
| 118 | |||
| 119 | struct iscsi_boot_kset *iscsi_boot_create_kset(const char *set_name); | ||
| 120 | struct iscsi_boot_kset *iscsi_boot_create_host_kset(unsigned int hostno); | ||
| 121 | void iscsi_boot_destroy_kset(struct iscsi_boot_kset *boot_kset); | ||
| 122 | |||
| 123 | #endif | ||
diff --git a/include/linux/iscsi_ibft.h b/include/linux/iscsi_ibft.h index d2e4042f8f5e..8ba7e5b9d62c 100644 --- a/include/linux/iscsi_ibft.h +++ b/include/linux/iscsi_ibft.h | |||
| @@ -21,21 +21,13 @@ | |||
| 21 | #ifndef ISCSI_IBFT_H | 21 | #ifndef ISCSI_IBFT_H |
| 22 | #define ISCSI_IBFT_H | 22 | #define ISCSI_IBFT_H |
| 23 | 23 | ||
| 24 | struct ibft_table_header { | 24 | #include <acpi/acpi.h> |
| 25 | char signature[4]; | ||
| 26 | u32 length; | ||
| 27 | u8 revision; | ||
| 28 | u8 checksum; | ||
| 29 | char oem_id[6]; | ||
| 30 | char oem_table_id[8]; | ||
| 31 | char reserved[24]; | ||
| 32 | } __attribute__((__packed__)); | ||
| 33 | 25 | ||
| 34 | /* | 26 | /* |
| 35 | * Logical location of iSCSI Boot Format Table. | 27 | * Logical location of iSCSI Boot Format Table. |
| 36 | * If the value is NULL there is no iBFT on the machine. | 28 | * If the value is NULL there is no iBFT on the machine. |
| 37 | */ | 29 | */ |
| 38 | extern struct ibft_table_header *ibft_addr; | 30 | extern struct acpi_table_ibft *ibft_addr; |
| 39 | 31 | ||
| 40 | /* | 32 | /* |
| 41 | * Routine used to find and reserve the iSCSI Boot Format Table. The | 33 | * Routine used to find and reserve the iSCSI Boot Format Table. The |
diff --git a/include/linux/isdnif.h b/include/linux/isdnif.h index b9b5a684ed69..b8c23f88dd54 100644 --- a/include/linux/isdnif.h +++ b/include/linux/isdnif.h | |||
| @@ -317,7 +317,7 @@ typedef struct T30_s { | |||
| 317 | __u8 r_scantime; | 317 | __u8 r_scantime; |
| 318 | __u8 r_id[FAXIDLEN]; | 318 | __u8 r_id[FAXIDLEN]; |
| 319 | __u8 r_code; | 319 | __u8 r_code; |
| 320 | } __attribute__((packed)) T30_s; | 320 | } __packed T30_s; |
| 321 | 321 | ||
| 322 | #define ISDN_TTY_FAX_CONN_IN 0 | 322 | #define ISDN_TTY_FAX_CONN_IN 0 |
| 323 | #define ISDN_TTY_FAX_CONN_OUT 1 | 323 | #define ISDN_TTY_FAX_CONN_OUT 1 |
diff --git a/include/linux/istallion.h b/include/linux/istallion.h index 7faca98c7d14..ad700a60c158 100644 --- a/include/linux/istallion.h +++ b/include/linux/istallion.h | |||
| @@ -86,7 +86,7 @@ struct stlibrd { | |||
| 86 | unsigned long magic; | 86 | unsigned long magic; |
| 87 | unsigned int brdnr; | 87 | unsigned int brdnr; |
| 88 | unsigned int brdtype; | 88 | unsigned int brdtype; |
| 89 | unsigned int state; | 89 | unsigned long state; |
| 90 | unsigned int nrpanels; | 90 | unsigned int nrpanels; |
| 91 | unsigned int nrports; | 91 | unsigned int nrports; |
| 92 | unsigned int nrdevs; | 92 | unsigned int nrdevs; |
diff --git a/include/linux/jbd2.h b/include/linux/jbd2.h index adf832dec3f3..2ae86aa21fce 100644 --- a/include/linux/jbd2.h +++ b/include/linux/jbd2.h | |||
| @@ -395,7 +395,7 @@ struct jbd2_inode { | |||
| 395 | struct inode *i_vfs_inode; | 395 | struct inode *i_vfs_inode; |
| 396 | 396 | ||
| 397 | /* Flags of inode [j_list_lock] */ | 397 | /* Flags of inode [j_list_lock] */ |
| 398 | unsigned int i_flags; | 398 | unsigned long i_flags; |
| 399 | }; | 399 | }; |
| 400 | 400 | ||
| 401 | struct jbd2_revoke_table_s; | 401 | struct jbd2_revoke_table_s; |
| @@ -601,13 +601,13 @@ struct transaction_s | |||
| 601 | * Number of outstanding updates running on this transaction | 601 | * Number of outstanding updates running on this transaction |
| 602 | * [t_handle_lock] | 602 | * [t_handle_lock] |
| 603 | */ | 603 | */ |
| 604 | int t_updates; | 604 | atomic_t t_updates; |
| 605 | 605 | ||
| 606 | /* | 606 | /* |
| 607 | * Number of buffers reserved for use by all handles in this transaction | 607 | * Number of buffers reserved for use by all handles in this transaction |
| 608 | * handle but not yet modified. [t_handle_lock] | 608 | * handle but not yet modified. [t_handle_lock] |
| 609 | */ | 609 | */ |
| 610 | int t_outstanding_credits; | 610 | atomic_t t_outstanding_credits; |
| 611 | 611 | ||
| 612 | /* | 612 | /* |
| 613 | * Forward and backward links for the circular list of all transactions | 613 | * Forward and backward links for the circular list of all transactions |
| @@ -629,7 +629,7 @@ struct transaction_s | |||
| 629 | /* | 629 | /* |
| 630 | * How many handles used this transaction? [t_handle_lock] | 630 | * How many handles used this transaction? [t_handle_lock] |
| 631 | */ | 631 | */ |
| 632 | int t_handle_count; | 632 | atomic_t t_handle_count; |
| 633 | 633 | ||
| 634 | /* | 634 | /* |
| 635 | * This transaction is being forced and some process is | 635 | * This transaction is being forced and some process is |
| @@ -764,7 +764,7 @@ struct journal_s | |||
| 764 | /* | 764 | /* |
| 765 | * Protect the various scalars in the journal | 765 | * Protect the various scalars in the journal |
| 766 | */ | 766 | */ |
| 767 | spinlock_t j_state_lock; | 767 | rwlock_t j_state_lock; |
| 768 | 768 | ||
| 769 | /* | 769 | /* |
| 770 | * Number of processes waiting to create a barrier lock [j_state_lock] | 770 | * Number of processes waiting to create a barrier lock [j_state_lock] |
| @@ -1082,7 +1082,9 @@ static inline handle_t *journal_current_handle(void) | |||
| 1082 | */ | 1082 | */ |
| 1083 | 1083 | ||
| 1084 | extern handle_t *jbd2_journal_start(journal_t *, int nblocks); | 1084 | extern handle_t *jbd2_journal_start(journal_t *, int nblocks); |
| 1085 | extern int jbd2_journal_restart (handle_t *, int nblocks); | 1085 | extern handle_t *jbd2__journal_start(journal_t *, int nblocks, int gfp_mask); |
| 1086 | extern int jbd2_journal_restart(handle_t *, int nblocks); | ||
| 1087 | extern int jbd2__journal_restart(handle_t *, int nblocks, int gfp_mask); | ||
| 1086 | extern int jbd2_journal_extend (handle_t *, int nblocks); | 1088 | extern int jbd2_journal_extend (handle_t *, int nblocks); |
| 1087 | extern int jbd2_journal_get_write_access(handle_t *, struct buffer_head *); | 1089 | extern int jbd2_journal_get_write_access(handle_t *, struct buffer_head *); |
| 1088 | extern int jbd2_journal_get_create_access (handle_t *, struct buffer_head *); | 1090 | extern int jbd2_journal_get_create_access (handle_t *, struct buffer_head *); |
| @@ -1257,8 +1259,8 @@ static inline int jbd_space_needed(journal_t *journal) | |||
| 1257 | { | 1259 | { |
| 1258 | int nblocks = journal->j_max_transaction_buffers; | 1260 | int nblocks = journal->j_max_transaction_buffers; |
| 1259 | if (journal->j_committing_transaction) | 1261 | if (journal->j_committing_transaction) |
| 1260 | nblocks += journal->j_committing_transaction-> | 1262 | nblocks += atomic_read(&journal->j_committing_transaction-> |
| 1261 | t_outstanding_credits; | 1263 | t_outstanding_credits); |
| 1262 | return nblocks; | 1264 | return nblocks; |
| 1263 | } | 1265 | } |
| 1264 | 1266 | ||
diff --git a/include/linux/jffs2.h b/include/linux/jffs2.h index 0874ab59ffef..a18b719f49d4 100644 --- a/include/linux/jffs2.h +++ b/include/linux/jffs2.h | |||
| @@ -1,7 +1,8 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * JFFS2 -- Journalling Flash File System, Version 2. | 2 | * JFFS2 -- Journalling Flash File System, Version 2. |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2001-2003 Red Hat, Inc. | 4 | * Copyright © 2001-2007 Red Hat, Inc. |
| 5 | * Copyright © 2004-2010 David Woodhouse <dwmw2@infradead.org> | ||
| 5 | * | 6 | * |
| 6 | * Created by David Woodhouse <dwmw2@infradead.org> | 7 | * Created by David Woodhouse <dwmw2@infradead.org> |
| 7 | * | 8 | * |
| @@ -185,7 +186,7 @@ struct jffs2_raw_xref | |||
| 185 | jint32_t hdr_crc; | 186 | jint32_t hdr_crc; |
| 186 | jint32_t ino; /* inode number */ | 187 | jint32_t ino; /* inode number */ |
| 187 | jint32_t xid; /* XATTR identifier number */ | 188 | jint32_t xid; /* XATTR identifier number */ |
| 188 | jint32_t xseqno; /* xref sequencial number */ | 189 | jint32_t xseqno; /* xref sequential number */ |
| 189 | jint32_t node_crc; | 190 | jint32_t node_crc; |
| 190 | } __attribute__((packed)); | 191 | } __attribute__((packed)); |
| 191 | 192 | ||
diff --git a/include/linux/jhash.h b/include/linux/jhash.h index 2a2f99fbcb16..ced1159fa4f2 100644 --- a/include/linux/jhash.h +++ b/include/linux/jhash.h | |||
| @@ -116,7 +116,7 @@ static inline u32 jhash2(const u32 *k, u32 length, u32 initval) | |||
| 116 | /* A special ultra-optimized versions that knows they are hashing exactly | 116 | /* A special ultra-optimized versions that knows they are hashing exactly |
| 117 | * 3, 2 or 1 word(s). | 117 | * 3, 2 or 1 word(s). |
| 118 | * | 118 | * |
| 119 | * NOTE: In partilar the "c += length; __jhash_mix(a,b,c);" normally | 119 | * NOTE: In particular the "c += length; __jhash_mix(a,b,c);" normally |
| 120 | * done at the end is not done here. | 120 | * done at the end is not done here. |
| 121 | */ | 121 | */ |
| 122 | static inline u32 jhash_3words(u32 a, u32 b, u32 c, u32 initval) | 122 | static inline u32 jhash_3words(u32 a, u32 b, u32 c, u32 initval) |
diff --git a/include/linux/jump_label.h b/include/linux/jump_label.h new file mode 100644 index 000000000000..b67cb180e6e9 --- /dev/null +++ b/include/linux/jump_label.h | |||
| @@ -0,0 +1,74 @@ | |||
| 1 | #ifndef _LINUX_JUMP_LABEL_H | ||
| 2 | #define _LINUX_JUMP_LABEL_H | ||
| 3 | |||
| 4 | #if defined(CC_HAVE_ASM_GOTO) && defined(CONFIG_HAVE_ARCH_JUMP_LABEL) | ||
| 5 | # include <asm/jump_label.h> | ||
| 6 | # define HAVE_JUMP_LABEL | ||
| 7 | #endif | ||
| 8 | |||
| 9 | enum jump_label_type { | ||
| 10 | JUMP_LABEL_ENABLE, | ||
| 11 | JUMP_LABEL_DISABLE | ||
| 12 | }; | ||
| 13 | |||
| 14 | struct module; | ||
| 15 | |||
| 16 | #ifdef HAVE_JUMP_LABEL | ||
| 17 | |||
| 18 | extern struct jump_entry __start___jump_table[]; | ||
| 19 | extern struct jump_entry __stop___jump_table[]; | ||
| 20 | |||
| 21 | extern void arch_jump_label_transform(struct jump_entry *entry, | ||
| 22 | enum jump_label_type type); | ||
| 23 | extern void arch_jump_label_text_poke_early(jump_label_t addr); | ||
| 24 | extern void jump_label_update(unsigned long key, enum jump_label_type type); | ||
| 25 | extern void jump_label_apply_nops(struct module *mod); | ||
| 26 | extern int jump_label_text_reserved(void *start, void *end); | ||
| 27 | |||
| 28 | #define jump_label_enable(key) \ | ||
| 29 | jump_label_update((unsigned long)key, JUMP_LABEL_ENABLE); | ||
| 30 | |||
| 31 | #define jump_label_disable(key) \ | ||
| 32 | jump_label_update((unsigned long)key, JUMP_LABEL_DISABLE); | ||
| 33 | |||
| 34 | #else | ||
| 35 | |||
| 36 | #define JUMP_LABEL(key, label) \ | ||
| 37 | do { \ | ||
| 38 | if (unlikely(*key)) \ | ||
| 39 | goto label; \ | ||
| 40 | } while (0) | ||
| 41 | |||
| 42 | #define jump_label_enable(cond_var) \ | ||
| 43 | do { \ | ||
| 44 | *(cond_var) = 1; \ | ||
| 45 | } while (0) | ||
| 46 | |||
| 47 | #define jump_label_disable(cond_var) \ | ||
| 48 | do { \ | ||
| 49 | *(cond_var) = 0; \ | ||
| 50 | } while (0) | ||
| 51 | |||
| 52 | static inline int jump_label_apply_nops(struct module *mod) | ||
| 53 | { | ||
| 54 | return 0; | ||
| 55 | } | ||
| 56 | |||
| 57 | static inline int jump_label_text_reserved(void *start, void *end) | ||
| 58 | { | ||
| 59 | return 0; | ||
| 60 | } | ||
| 61 | |||
| 62 | #endif | ||
| 63 | |||
| 64 | #define COND_STMT(key, stmt) \ | ||
| 65 | do { \ | ||
| 66 | __label__ jl_enabled; \ | ||
| 67 | JUMP_LABEL(key, jl_enabled); \ | ||
| 68 | if (0) { \ | ||
| 69 | jl_enabled: \ | ||
| 70 | stmt; \ | ||
| 71 | } \ | ||
| 72 | } while (0) | ||
| 73 | |||
| 74 | #endif | ||
diff --git a/include/linux/jump_label_ref.h b/include/linux/jump_label_ref.h new file mode 100644 index 000000000000..e5d012ad92c6 --- /dev/null +++ b/include/linux/jump_label_ref.h | |||
| @@ -0,0 +1,44 @@ | |||
| 1 | #ifndef _LINUX_JUMP_LABEL_REF_H | ||
| 2 | #define _LINUX_JUMP_LABEL_REF_H | ||
| 3 | |||
| 4 | #include <linux/jump_label.h> | ||
| 5 | #include <asm/atomic.h> | ||
| 6 | |||
| 7 | #ifdef HAVE_JUMP_LABEL | ||
| 8 | |||
| 9 | static inline void jump_label_inc(atomic_t *key) | ||
| 10 | { | ||
| 11 | if (atomic_add_return(1, key) == 1) | ||
| 12 | jump_label_enable(key); | ||
| 13 | } | ||
| 14 | |||
| 15 | static inline void jump_label_dec(atomic_t *key) | ||
| 16 | { | ||
| 17 | if (atomic_dec_and_test(key)) | ||
| 18 | jump_label_disable(key); | ||
| 19 | } | ||
| 20 | |||
| 21 | #else /* !HAVE_JUMP_LABEL */ | ||
| 22 | |||
| 23 | static inline void jump_label_inc(atomic_t *key) | ||
| 24 | { | ||
| 25 | atomic_inc(key); | ||
| 26 | } | ||
| 27 | |||
| 28 | static inline void jump_label_dec(atomic_t *key) | ||
| 29 | { | ||
| 30 | atomic_dec(key); | ||
| 31 | } | ||
| 32 | |||
| 33 | #undef JUMP_LABEL | ||
| 34 | #define JUMP_LABEL(key, label) \ | ||
| 35 | do { \ | ||
| 36 | if (unlikely(__builtin_choose_expr( \ | ||
| 37 | __builtin_types_compatible_p(typeof(key), atomic_t *), \ | ||
| 38 | atomic_read((atomic_t *)(key)), *(key)))) \ | ||
| 39 | goto label; \ | ||
| 40 | } while (0) | ||
| 41 | |||
| 42 | #endif /* HAVE_JUMP_LABEL */ | ||
| 43 | |||
| 44 | #endif /* _LINUX_JUMP_LABEL_REF_H */ | ||
diff --git a/include/linux/jz4740-adc.h b/include/linux/jz4740-adc.h new file mode 100644 index 000000000000..9053f95e9687 --- /dev/null +++ b/include/linux/jz4740-adc.h | |||
| @@ -0,0 +1,32 @@ | |||
| 1 | |||
| 2 | #ifndef __LINUX_JZ4740_ADC | ||
| 3 | #define __LINUX_JZ4740_ADC | ||
| 4 | |||
| 5 | #include <linux/device.h> | ||
| 6 | |||
| 7 | /* | ||
| 8 | * jz4740_adc_set_config - Configure a JZ4740 adc device | ||
| 9 | * @dev: Pointer to a jz4740-adc device | ||
| 10 | * @mask: Mask for the config value to be set | ||
| 11 | * @val: Value to be set | ||
| 12 | * | ||
| 13 | * This function can be used by the JZ4740 ADC mfd cells to configure their | ||
| 14 | * options in the shared config register. | ||
| 15 | */ | ||
| 16 | int jz4740_adc_set_config(struct device *dev, uint32_t mask, uint32_t val); | ||
| 17 | |||
| 18 | #define JZ_ADC_CONFIG_SPZZ BIT(31) | ||
| 19 | #define JZ_ADC_CONFIG_EX_IN BIT(30) | ||
| 20 | #define JZ_ADC_CONFIG_DNUM_MASK (0x7 << 16) | ||
| 21 | #define JZ_ADC_CONFIG_DMA_ENABLE BIT(15) | ||
| 22 | #define JZ_ADC_CONFIG_XYZ_MASK (0x2 << 13) | ||
| 23 | #define JZ_ADC_CONFIG_SAMPLE_NUM_MASK (0x7 << 10) | ||
| 24 | #define JZ_ADC_CONFIG_CLKDIV_MASK (0xf << 5) | ||
| 25 | #define JZ_ADC_CONFIG_BAT_MB BIT(4) | ||
| 26 | |||
| 27 | #define JZ_ADC_CONFIG_DNUM(dnum) ((dnum) << 16) | ||
| 28 | #define JZ_ADC_CONFIG_XYZ_OFFSET(dnum) ((xyz) << 13) | ||
| 29 | #define JZ_ADC_CONFIG_SAMPLE_NUM(x) ((x) << 10) | ||
| 30 | #define JZ_ADC_CONFIG_CLKDIV(div) ((div) << 5) | ||
| 31 | |||
| 32 | #endif | ||
diff --git a/include/linux/kdb.h b/include/linux/kdb.h index ccb2b3ec0fe8..aadff7cc2b84 100644 --- a/include/linux/kdb.h +++ b/include/linux/kdb.h | |||
| @@ -28,6 +28,41 @@ extern int kdb_poll_idx; | |||
| 28 | extern int kdb_initial_cpu; | 28 | extern int kdb_initial_cpu; |
| 29 | extern atomic_t kdb_event; | 29 | extern atomic_t kdb_event; |
| 30 | 30 | ||
| 31 | /* Types and messages used for dynamically added kdb shell commands */ | ||
| 32 | |||
| 33 | #define KDB_MAXARGS 16 /* Maximum number of arguments to a function */ | ||
| 34 | |||
| 35 | typedef enum { | ||
| 36 | KDB_REPEAT_NONE = 0, /* Do not repeat this command */ | ||
| 37 | KDB_REPEAT_NO_ARGS, /* Repeat the command without arguments */ | ||
| 38 | KDB_REPEAT_WITH_ARGS, /* Repeat the command including its arguments */ | ||
| 39 | } kdb_repeat_t; | ||
| 40 | |||
| 41 | typedef int (*kdb_func_t)(int, const char **); | ||
| 42 | |||
| 43 | /* KDB return codes from a command or internal kdb function */ | ||
| 44 | #define KDB_NOTFOUND (-1) | ||
| 45 | #define KDB_ARGCOUNT (-2) | ||
| 46 | #define KDB_BADWIDTH (-3) | ||
| 47 | #define KDB_BADRADIX (-4) | ||
| 48 | #define KDB_NOTENV (-5) | ||
| 49 | #define KDB_NOENVVALUE (-6) | ||
| 50 | #define KDB_NOTIMP (-7) | ||
| 51 | #define KDB_ENVFULL (-8) | ||
| 52 | #define KDB_ENVBUFFULL (-9) | ||
| 53 | #define KDB_TOOMANYBPT (-10) | ||
| 54 | #define KDB_TOOMANYDBREGS (-11) | ||
| 55 | #define KDB_DUPBPT (-12) | ||
| 56 | #define KDB_BPTNOTFOUND (-13) | ||
| 57 | #define KDB_BADMODE (-14) | ||
| 58 | #define KDB_BADINT (-15) | ||
| 59 | #define KDB_INVADDRFMT (-16) | ||
| 60 | #define KDB_BADREG (-17) | ||
| 61 | #define KDB_BADCPUNUM (-18) | ||
| 62 | #define KDB_BADLENGTH (-19) | ||
| 63 | #define KDB_NOBP (-20) | ||
| 64 | #define KDB_BADADDR (-21) | ||
| 65 | |||
| 31 | /* | 66 | /* |
| 32 | * kdb_diemsg | 67 | * kdb_diemsg |
| 33 | * | 68 | * |
| @@ -104,14 +139,34 @@ int kdb_process_cpu(const struct task_struct *p) | |||
| 104 | 139 | ||
| 105 | /* kdb access to register set for stack dumping */ | 140 | /* kdb access to register set for stack dumping */ |
| 106 | extern struct pt_regs *kdb_current_regs; | 141 | extern struct pt_regs *kdb_current_regs; |
| 142 | #ifdef CONFIG_KALLSYMS | ||
| 143 | extern const char *kdb_walk_kallsyms(loff_t *pos); | ||
| 144 | #else /* ! CONFIG_KALLSYMS */ | ||
| 145 | static inline const char *kdb_walk_kallsyms(loff_t *pos) | ||
| 146 | { | ||
| 147 | return NULL; | ||
| 148 | } | ||
| 149 | #endif /* ! CONFIG_KALLSYMS */ | ||
| 107 | 150 | ||
| 151 | /* Dynamic kdb shell command registration */ | ||
| 152 | extern int kdb_register(char *, kdb_func_t, char *, char *, short); | ||
| 153 | extern int kdb_register_repeat(char *, kdb_func_t, char *, char *, | ||
| 154 | short, kdb_repeat_t); | ||
| 155 | extern int kdb_unregister(char *); | ||
| 108 | #else /* ! CONFIG_KGDB_KDB */ | 156 | #else /* ! CONFIG_KGDB_KDB */ |
| 109 | #define kdb_printf(...) | 157 | #define kdb_printf(...) |
| 110 | #define kdb_init(x) | 158 | #define kdb_init(x) |
| 159 | #define kdb_register(...) | ||
| 160 | #define kdb_register_repeat(...) | ||
| 161 | #define kdb_uregister(x) | ||
| 111 | #endif /* CONFIG_KGDB_KDB */ | 162 | #endif /* CONFIG_KGDB_KDB */ |
| 112 | enum { | 163 | enum { |
| 113 | KDB_NOT_INITIALIZED, | 164 | KDB_NOT_INITIALIZED, |
| 114 | KDB_INIT_EARLY, | 165 | KDB_INIT_EARLY, |
| 115 | KDB_INIT_FULL, | 166 | KDB_INIT_FULL, |
| 116 | }; | 167 | }; |
| 168 | |||
| 169 | extern int kdbgetintenv(const char *, int *); | ||
| 170 | extern int kdb_set(int, const char **); | ||
| 171 | |||
| 117 | #endif /* !_KDB_H */ | 172 | #endif /* !_KDB_H */ |
diff --git a/include/linux/kernel.h b/include/linux/kernel.h index 8317ec4b9f3b..450092c1e35f 100644 --- a/include/linux/kernel.h +++ b/include/linux/kernel.h | |||
| @@ -58,7 +58,18 @@ extern const char linux_proc_banner[]; | |||
| 58 | 58 | ||
| 59 | #define FIELD_SIZEOF(t, f) (sizeof(((t*)0)->f)) | 59 | #define FIELD_SIZEOF(t, f) (sizeof(((t*)0)->f)) |
| 60 | #define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d)) | 60 | #define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d)) |
| 61 | #define roundup(x, y) ((((x) + ((y) - 1)) / (y)) * (y)) | 61 | #define roundup(x, y) ( \ |
| 62 | { \ | ||
| 63 | typeof(y) __y = y; \ | ||
| 64 | (((x) + (__y - 1)) / __y) * __y; \ | ||
| 65 | } \ | ||
| 66 | ) | ||
| 67 | #define rounddown(x, y) ( \ | ||
| 68 | { \ | ||
| 69 | typeof(x) __x = (x); \ | ||
| 70 | __x - (__x % (y)); \ | ||
| 71 | } \ | ||
| 72 | ) | ||
| 62 | #define DIV_ROUND_CLOSEST(x, divisor)( \ | 73 | #define DIV_ROUND_CLOSEST(x, divisor)( \ |
| 63 | { \ | 74 | { \ |
| 64 | typeof(divisor) __divisor = divisor; \ | 75 | typeof(divisor) __divisor = divisor; \ |
| @@ -162,6 +173,11 @@ extern int _cond_resched(void); | |||
| 162 | (__x < 0) ? -__x : __x; \ | 173 | (__x < 0) ? -__x : __x; \ |
| 163 | }) | 174 | }) |
| 164 | 175 | ||
| 176 | #define abs64(x) ({ \ | ||
| 177 | s64 __x = (x); \ | ||
| 178 | (__x < 0) ? -__x : __x; \ | ||
| 179 | }) | ||
| 180 | |||
| 165 | #ifdef CONFIG_PROVE_LOCKING | 181 | #ifdef CONFIG_PROVE_LOCKING |
| 166 | void might_fault(void); | 182 | void might_fault(void); |
| 167 | #else | 183 | #else |
| @@ -171,12 +187,18 @@ static inline void might_fault(void) | |||
| 171 | } | 187 | } |
| 172 | #endif | 188 | #endif |
| 173 | 189 | ||
| 190 | struct va_format { | ||
| 191 | const char *fmt; | ||
| 192 | va_list *va; | ||
| 193 | }; | ||
| 194 | |||
| 174 | extern struct atomic_notifier_head panic_notifier_list; | 195 | extern struct atomic_notifier_head panic_notifier_list; |
| 175 | extern long (*panic_blink)(long time); | 196 | extern long (*panic_blink)(int state); |
| 176 | NORET_TYPE void panic(const char * fmt, ...) | 197 | NORET_TYPE void panic(const char * fmt, ...) |
| 177 | __attribute__ ((NORET_AND format (printf, 1, 2))) __cold; | 198 | __attribute__ ((NORET_AND format (printf, 1, 2))) __cold; |
| 178 | extern void oops_enter(void); | 199 | extern void oops_enter(void); |
| 179 | extern void oops_exit(void); | 200 | extern void oops_exit(void); |
| 201 | void print_oops_end_marker(void); | ||
| 180 | extern int oops_may_print(void); | 202 | extern int oops_may_print(void); |
| 181 | NORET_TYPE void do_exit(long error_code) | 203 | NORET_TYPE void do_exit(long error_code) |
| 182 | ATTRIB_NORET; | 204 | ATTRIB_NORET; |
| @@ -186,10 +208,10 @@ extern unsigned long simple_strtoul(const char *,char **,unsigned int); | |||
| 186 | extern long simple_strtol(const char *,char **,unsigned int); | 208 | extern long simple_strtol(const char *,char **,unsigned int); |
| 187 | extern unsigned long long simple_strtoull(const char *,char **,unsigned int); | 209 | extern unsigned long long simple_strtoull(const char *,char **,unsigned int); |
| 188 | extern long long simple_strtoll(const char *,char **,unsigned int); | 210 | extern long long simple_strtoll(const char *,char **,unsigned int); |
| 189 | extern int strict_strtoul(const char *, unsigned int, unsigned long *); | 211 | extern int __must_check strict_strtoul(const char *, unsigned int, unsigned long *); |
| 190 | extern int strict_strtol(const char *, unsigned int, long *); | 212 | extern int __must_check strict_strtol(const char *, unsigned int, long *); |
| 191 | extern int strict_strtoull(const char *, unsigned int, unsigned long long *); | 213 | extern int __must_check strict_strtoull(const char *, unsigned int, unsigned long long *); |
| 192 | extern int strict_strtoll(const char *, unsigned int, long long *); | 214 | extern int __must_check strict_strtoll(const char *, unsigned int, long long *); |
| 193 | extern int sprintf(char * buf, const char * fmt, ...) | 215 | extern int sprintf(char * buf, const char * fmt, ...) |
| 194 | __attribute__ ((format (printf, 2, 3))); | 216 | __attribute__ ((format (printf, 2, 3))); |
| 195 | extern int vsprintf(char *buf, const char *, va_list) | 217 | extern int vsprintf(char *buf, const char *, va_list) |
| @@ -247,12 +269,24 @@ extern struct pid *session_of_pgrp(struct pid *pgrp); | |||
| 247 | #define FW_WARN "[Firmware Warn]: " | 269 | #define FW_WARN "[Firmware Warn]: " |
| 248 | #define FW_INFO "[Firmware Info]: " | 270 | #define FW_INFO "[Firmware Info]: " |
| 249 | 271 | ||
| 272 | /* | ||
| 273 | * HW_ERR | ||
| 274 | * Add this to a message for hardware errors, so that user can report | ||
| 275 | * it to hardware vendor instead of LKML or software vendor. | ||
| 276 | */ | ||
| 277 | #define HW_ERR "[Hardware Error]: " | ||
| 278 | |||
| 250 | #ifdef CONFIG_PRINTK | 279 | #ifdef CONFIG_PRINTK |
| 251 | asmlinkage int vprintk(const char *fmt, va_list args) | 280 | asmlinkage int vprintk(const char *fmt, va_list args) |
| 252 | __attribute__ ((format (printf, 1, 0))); | 281 | __attribute__ ((format (printf, 1, 0))); |
| 253 | asmlinkage int printk(const char * fmt, ...) | 282 | asmlinkage int printk(const char * fmt, ...) |
| 254 | __attribute__ ((format (printf, 1, 2))) __cold; | 283 | __attribute__ ((format (printf, 1, 2))) __cold; |
| 255 | 284 | ||
| 285 | /* | ||
| 286 | * Please don't use printk_ratelimit(), because it shares ratelimiting state | ||
| 287 | * with all other unrelated printk_ratelimit() callsites. Instead use | ||
| 288 | * printk_ratelimited() or plain old __ratelimit(). | ||
| 289 | */ | ||
| 256 | extern int __printk_ratelimit(const char *func); | 290 | extern int __printk_ratelimit(const char *func); |
| 257 | #define printk_ratelimit() __printk_ratelimit(__func__) | 291 | #define printk_ratelimit() __printk_ratelimit(__func__) |
| 258 | extern bool printk_timed_ratelimit(unsigned long *caller_jiffies, | 292 | extern bool printk_timed_ratelimit(unsigned long *caller_jiffies, |
| @@ -293,6 +327,13 @@ static inline void log_buf_kexec_setup(void) | |||
| 293 | } | 327 | } |
| 294 | #endif | 328 | #endif |
| 295 | 329 | ||
| 330 | /* | ||
| 331 | * Dummy printk for disabled debugging statements to use whilst maintaining | ||
| 332 | * gcc's format and side-effect checking. | ||
| 333 | */ | ||
| 334 | static inline __attribute__ ((format (printf, 1, 2))) | ||
| 335 | int no_printk(const char *s, ...) { return 0; } | ||
| 336 | |||
| 296 | extern int printk_needs_cpu(int cpu); | 337 | extern int printk_needs_cpu(int cpu); |
| 297 | extern void printk_tick(void); | 338 | extern void printk_tick(void); |
| 298 | 339 | ||
| @@ -508,9 +549,6 @@ extern void tracing_start(void); | |||
| 508 | extern void tracing_stop(void); | 549 | extern void tracing_stop(void); |
| 509 | extern void ftrace_off_permanent(void); | 550 | extern void ftrace_off_permanent(void); |
| 510 | 551 | ||
| 511 | extern void | ||
| 512 | ftrace_special(unsigned long arg1, unsigned long arg2, unsigned long arg3); | ||
| 513 | |||
| 514 | static inline void __attribute__ ((format (printf, 1, 2))) | 552 | static inline void __attribute__ ((format (printf, 1, 2))) |
| 515 | ____trace_printk_check_format(const char *fmt, ...) | 553 | ____trace_printk_check_format(const char *fmt, ...) |
| 516 | { | 554 | { |
| @@ -586,8 +624,6 @@ __ftrace_vprintk(unsigned long ip, const char *fmt, va_list ap); | |||
| 586 | 624 | ||
| 587 | extern void ftrace_dump(enum ftrace_dump_mode oops_dump_mode); | 625 | extern void ftrace_dump(enum ftrace_dump_mode oops_dump_mode); |
| 588 | #else | 626 | #else |
| 589 | static inline void | ||
| 590 | ftrace_special(unsigned long arg1, unsigned long arg2, unsigned long arg3) { } | ||
| 591 | static inline int | 627 | static inline int |
| 592 | trace_printk(const char *fmt, ...) __attribute__ ((format (printf, 1, 2))); | 628 | trace_printk(const char *fmt, ...) __attribute__ ((format (printf, 1, 2))); |
| 593 | 629 | ||
| @@ -609,17 +645,6 @@ static inline void ftrace_dump(enum ftrace_dump_mode oops_dump_mode) { } | |||
| 609 | #endif /* CONFIG_TRACING */ | 645 | #endif /* CONFIG_TRACING */ |
| 610 | 646 | ||
| 611 | /* | 647 | /* |
| 612 | * Display an IP address in readable format. | ||
| 613 | */ | ||
| 614 | |||
| 615 | #define NIPQUAD(addr) \ | ||
| 616 | ((unsigned char *)&addr)[0], \ | ||
| 617 | ((unsigned char *)&addr)[1], \ | ||
| 618 | ((unsigned char *)&addr)[2], \ | ||
| 619 | ((unsigned char *)&addr)[3] | ||
| 620 | #define NIPQUAD_FMT "%u.%u.%u.%u" | ||
| 621 | |||
| 622 | /* | ||
| 623 | * min()/max()/clamp() macros that also do | 648 | * min()/max()/clamp() macros that also do |
| 624 | * strict type-checking.. See the | 649 | * strict type-checking.. See the |
| 625 | * "unnecessary" pointer comparison. | 650 | * "unnecessary" pointer comparison. |
| @@ -636,6 +661,34 @@ static inline void ftrace_dump(enum ftrace_dump_mode oops_dump_mode) { } | |||
| 636 | (void) (&_max1 == &_max2); \ | 661 | (void) (&_max1 == &_max2); \ |
| 637 | _max1 > _max2 ? _max1 : _max2; }) | 662 | _max1 > _max2 ? _max1 : _max2; }) |
| 638 | 663 | ||
| 664 | #define min3(x, y, z) ({ \ | ||
| 665 | typeof(x) _min1 = (x); \ | ||
| 666 | typeof(y) _min2 = (y); \ | ||
| 667 | typeof(z) _min3 = (z); \ | ||
| 668 | (void) (&_min1 == &_min2); \ | ||
| 669 | (void) (&_min1 == &_min3); \ | ||
| 670 | _min1 < _min2 ? (_min1 < _min3 ? _min1 : _min3) : \ | ||
| 671 | (_min2 < _min3 ? _min2 : _min3); }) | ||
| 672 | |||
| 673 | #define max3(x, y, z) ({ \ | ||
| 674 | typeof(x) _max1 = (x); \ | ||
| 675 | typeof(y) _max2 = (y); \ | ||
| 676 | typeof(z) _max3 = (z); \ | ||
| 677 | (void) (&_max1 == &_max2); \ | ||
| 678 | (void) (&_max1 == &_max3); \ | ||
| 679 | _max1 > _max2 ? (_max1 > _max3 ? _max1 : _max3) : \ | ||
| 680 | (_max2 > _max3 ? _max2 : _max3); }) | ||
| 681 | |||
| 682 | /** | ||
| 683 | * min_not_zero - return the minimum that is _not_ zero, unless both are zero | ||
| 684 | * @x: value1 | ||
| 685 | * @y: value2 | ||
| 686 | */ | ||
| 687 | #define min_not_zero(x, y) ({ \ | ||
| 688 | typeof(x) __x = (x); \ | ||
| 689 | typeof(y) __y = (y); \ | ||
| 690 | __x == 0 ? __y : ((__y == 0) ? __x : min(__x, __y)); }) | ||
| 691 | |||
| 639 | /** | 692 | /** |
| 640 | * clamp - return a value clamped to a given range with strict typechecking | 693 | * clamp - return a value clamped to a given range with strict typechecking |
| 641 | * @val: current value | 694 | * @val: current value |
| @@ -728,12 +781,6 @@ extern int do_sysinfo(struct sysinfo *info); | |||
| 728 | 781 | ||
| 729 | #endif /* __KERNEL__ */ | 782 | #endif /* __KERNEL__ */ |
| 730 | 783 | ||
| 731 | #ifndef __EXPORTED_HEADERS__ | ||
| 732 | #ifndef __KERNEL__ | ||
| 733 | #warning Attempt to use kernel headers from user space, see http://kernelnewbies.org/KernelHeaders | ||
| 734 | #endif /* __KERNEL__ */ | ||
| 735 | #endif /* __EXPORTED_HEADERS__ */ | ||
| 736 | |||
| 737 | #define SI_LOAD_SHIFT 16 | 784 | #define SI_LOAD_SHIFT 16 |
| 738 | struct sysinfo { | 785 | struct sysinfo { |
| 739 | long uptime; /* Seconds since boot */ | 786 | long uptime; /* Seconds since boot */ |
diff --git a/include/linux/kernel_stat.h b/include/linux/kernel_stat.h index c059044bc6dc..ad54c846911b 100644 --- a/include/linux/kernel_stat.h +++ b/include/linux/kernel_stat.h | |||
| @@ -33,6 +33,7 @@ struct kernel_stat { | |||
| 33 | #ifndef CONFIG_GENERIC_HARDIRQS | 33 | #ifndef CONFIG_GENERIC_HARDIRQS |
| 34 | unsigned int irqs[NR_IRQS]; | 34 | unsigned int irqs[NR_IRQS]; |
| 35 | #endif | 35 | #endif |
| 36 | unsigned long irqs_sum; | ||
| 36 | unsigned int softirqs[NR_SOFTIRQS]; | 37 | unsigned int softirqs[NR_SOFTIRQS]; |
| 37 | }; | 38 | }; |
| 38 | 39 | ||
| @@ -54,6 +55,7 @@ static inline void kstat_incr_irqs_this_cpu(unsigned int irq, | |||
| 54 | struct irq_desc *desc) | 55 | struct irq_desc *desc) |
| 55 | { | 56 | { |
| 56 | kstat_this_cpu.irqs[irq]++; | 57 | kstat_this_cpu.irqs[irq]++; |
| 58 | kstat_this_cpu.irqs_sum++; | ||
| 57 | } | 59 | } |
| 58 | 60 | ||
| 59 | static inline unsigned int kstat_irqs_cpu(unsigned int irq, int cpu) | 61 | static inline unsigned int kstat_irqs_cpu(unsigned int irq, int cpu) |
| @@ -65,8 +67,9 @@ static inline unsigned int kstat_irqs_cpu(unsigned int irq, int cpu) | |||
| 65 | extern unsigned int kstat_irqs_cpu(unsigned int irq, int cpu); | 67 | extern unsigned int kstat_irqs_cpu(unsigned int irq, int cpu); |
| 66 | #define kstat_irqs_this_cpu(DESC) \ | 68 | #define kstat_irqs_this_cpu(DESC) \ |
| 67 | ((DESC)->kstat_irqs[smp_processor_id()]) | 69 | ((DESC)->kstat_irqs[smp_processor_id()]) |
| 68 | #define kstat_incr_irqs_this_cpu(irqno, DESC) \ | 70 | #define kstat_incr_irqs_this_cpu(irqno, DESC) do {\ |
| 69 | ((DESC)->kstat_irqs[smp_processor_id()]++) | 71 | ((DESC)->kstat_irqs[smp_processor_id()]++);\ |
| 72 | kstat_this_cpu.irqs_sum++; } while (0) | ||
| 70 | 73 | ||
| 71 | #endif | 74 | #endif |
| 72 | 75 | ||
| @@ -83,6 +86,7 @@ static inline unsigned int kstat_softirqs_cpu(unsigned int irq, int cpu) | |||
| 83 | /* | 86 | /* |
| 84 | * Number of interrupts per specific IRQ source, since bootup | 87 | * Number of interrupts per specific IRQ source, since bootup |
| 85 | */ | 88 | */ |
| 89 | #ifndef CONFIG_GENERIC_HARDIRQS | ||
| 86 | static inline unsigned int kstat_irqs(unsigned int irq) | 90 | static inline unsigned int kstat_irqs(unsigned int irq) |
| 87 | { | 91 | { |
| 88 | unsigned int sum = 0; | 92 | unsigned int sum = 0; |
| @@ -93,7 +97,17 @@ static inline unsigned int kstat_irqs(unsigned int irq) | |||
| 93 | 97 | ||
| 94 | return sum; | 98 | return sum; |
| 95 | } | 99 | } |
| 100 | #else | ||
| 101 | extern unsigned int kstat_irqs(unsigned int irq); | ||
| 102 | #endif | ||
| 96 | 103 | ||
| 104 | /* | ||
| 105 | * Number of interrupts per cpu, since bootup | ||
| 106 | */ | ||
| 107 | static inline unsigned int kstat_cpu_irqs_sum(unsigned int cpu) | ||
| 108 | { | ||
| 109 | return kstat_cpu(cpu).irqs_sum; | ||
| 110 | } | ||
| 97 | 111 | ||
| 98 | /* | 112 | /* |
| 99 | * Lock/unlock the current runqueue - to extract task statistics: | 113 | * Lock/unlock the current runqueue - to extract task statistics: |
diff --git a/include/linux/key.h b/include/linux/key.h index cd50dfa1d4c2..3db0adce1fda 100644 --- a/include/linux/key.h +++ b/include/linux/key.h | |||
| @@ -178,8 +178,9 @@ struct key { | |||
| 178 | */ | 178 | */ |
| 179 | union { | 179 | union { |
| 180 | unsigned long value; | 180 | unsigned long value; |
| 181 | void __rcu *rcudata; | ||
| 181 | void *data; | 182 | void *data; |
| 182 | struct keyring_list *subscriptions; | 183 | struct keyring_list __rcu *subscriptions; |
| 183 | } payload; | 184 | } payload; |
| 184 | }; | 185 | }; |
| 185 | 186 | ||
diff --git a/include/linux/kfifo.h b/include/linux/kfifo.h index 9fad0527344f..10308c6a3d1c 100644 --- a/include/linux/kfifo.h +++ b/include/linux/kfifo.h | |||
| @@ -1,8 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * A generic kernel FIFO implementation. | 2 | * A generic kernel FIFO implementation |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2009 Stefani Seibold <stefani@seibold.net> | 4 | * Copyright (C) 2009/2010 Stefani Seibold <stefani@seibold.net> |
| 5 | * Copyright (C) 2004 Stelian Pop <stelian@popies.net> | ||
| 6 | * | 5 | * |
| 7 | * This program is free software; you can redistribute it and/or modify | 6 | * This program is free software; you can redistribute it and/or modify |
| 8 | * it under the terms of the GNU General Public License as published by | 7 | * it under the terms of the GNU General Public License as published by |
| @@ -20,8 +19,11 @@ | |||
| 20 | * | 19 | * |
| 21 | */ | 20 | */ |
| 22 | 21 | ||
| 22 | #ifndef _LINUX_KFIFO_H | ||
| 23 | #define _LINUX_KFIFO_H | ||
| 24 | |||
| 23 | /* | 25 | /* |
| 24 | * Howto porting drivers to the new generic fifo API: | 26 | * How to porting drivers to the new generic FIFO API: |
| 25 | * | 27 | * |
| 26 | * - Modify the declaration of the "struct kfifo *" object into a | 28 | * - Modify the declaration of the "struct kfifo *" object into a |
| 27 | * in-place "struct kfifo" object | 29 | * in-place "struct kfifo" object |
| @@ -30,586 +32,821 @@ | |||
| 30 | * passed as the first argument to this functions | 32 | * passed as the first argument to this functions |
| 31 | * - Replace the use of __kfifo_put into kfifo_in and __kfifo_get | 33 | * - Replace the use of __kfifo_put into kfifo_in and __kfifo_get |
| 32 | * into kfifo_out | 34 | * into kfifo_out |
| 33 | * - Replace the use of kfifo_put into kfifo_in_locked and kfifo_get | 35 | * - Replace the use of kfifo_put into kfifo_in_spinlocked and kfifo_get |
| 34 | * into kfifo_out_locked | 36 | * into kfifo_out_spinlocked |
| 35 | * Note: the spinlock pointer formerly passed to kfifo_init/kfifo_alloc | 37 | * Note: the spinlock pointer formerly passed to kfifo_init/kfifo_alloc |
| 36 | * must be passed now to the kfifo_in_locked and kfifo_out_locked | 38 | * must be passed now to the kfifo_in_spinlocked and kfifo_out_spinlocked |
| 37 | * as the last parameter. | 39 | * as the last parameter |
| 38 | * - All formerly name __kfifo_* functions has been renamed into kfifo_* | 40 | * - The formerly __kfifo_* functions are renamed into kfifo_* |
| 39 | */ | 41 | */ |
| 40 | 42 | ||
| 41 | #ifndef _LINUX_KFIFO_H | 43 | /* |
| 42 | #define _LINUX_KFIFO_H | 44 | * Note about locking : There is no locking required until only * one reader |
| 45 | * and one writer is using the fifo and no kfifo_reset() will be * called | ||
| 46 | * kfifo_reset_out() can be safely used, until it will be only called | ||
| 47 | * in the reader thread. | ||
| 48 | * For multiple writer and one reader there is only a need to lock the writer. | ||
| 49 | * And vice versa for only one writer and multiple reader there is only a need | ||
| 50 | * to lock the reader. | ||
| 51 | */ | ||
| 43 | 52 | ||
| 44 | #include <linux/kernel.h> | 53 | #include <linux/kernel.h> |
| 45 | #include <linux/spinlock.h> | 54 | #include <linux/spinlock.h> |
| 46 | 55 | #include <linux/stddef.h> | |
| 47 | struct kfifo { | 56 | #include <linux/scatterlist.h> |
| 48 | unsigned char *buffer; /* the buffer holding the data */ | 57 | |
| 49 | unsigned int size; /* the size of the allocated buffer */ | 58 | struct __kfifo { |
| 50 | unsigned int in; /* data is added at offset (in % size) */ | 59 | unsigned int in; |
| 51 | unsigned int out; /* data is extracted from off. (out % size) */ | 60 | unsigned int out; |
| 61 | unsigned int mask; | ||
| 62 | unsigned int esize; | ||
| 63 | void *data; | ||
| 52 | }; | 64 | }; |
| 53 | 65 | ||
| 66 | #define __STRUCT_KFIFO_COMMON(datatype, recsize, ptrtype) \ | ||
| 67 | union { \ | ||
| 68 | struct __kfifo kfifo; \ | ||
| 69 | datatype *type; \ | ||
| 70 | char (*rectype)[recsize]; \ | ||
| 71 | ptrtype *ptr; \ | ||
| 72 | const ptrtype *ptr_const; \ | ||
| 73 | } | ||
| 74 | |||
| 75 | #define __STRUCT_KFIFO(type, size, recsize, ptrtype) \ | ||
| 76 | { \ | ||
| 77 | __STRUCT_KFIFO_COMMON(type, recsize, ptrtype); \ | ||
| 78 | type buf[((size < 2) || (size & (size - 1))) ? -1 : size]; \ | ||
| 79 | } | ||
| 80 | |||
| 81 | #define STRUCT_KFIFO(type, size) \ | ||
| 82 | struct __STRUCT_KFIFO(type, size, 0, type) | ||
| 83 | |||
| 84 | #define __STRUCT_KFIFO_PTR(type, recsize, ptrtype) \ | ||
| 85 | { \ | ||
| 86 | __STRUCT_KFIFO_COMMON(type, recsize, ptrtype); \ | ||
| 87 | type buf[0]; \ | ||
| 88 | } | ||
| 89 | |||
| 90 | #define STRUCT_KFIFO_PTR(type) \ | ||
| 91 | struct __STRUCT_KFIFO_PTR(type, 0, type) | ||
| 92 | |||
| 54 | /* | 93 | /* |
| 55 | * Macros for declaration and initialization of the kfifo datatype | 94 | * define compatibility "struct kfifo" for dynamic allocated fifos |
| 56 | */ | 95 | */ |
| 96 | struct kfifo __STRUCT_KFIFO_PTR(unsigned char, 0, void); | ||
| 57 | 97 | ||
| 58 | /* helper macro */ | 98 | #define STRUCT_KFIFO_REC_1(size) \ |
| 59 | #define __kfifo_initializer(s, b) \ | 99 | struct __STRUCT_KFIFO(unsigned char, size, 1, void) |
| 60 | (struct kfifo) { \ | ||
| 61 | .size = s, \ | ||
| 62 | .in = 0, \ | ||
| 63 | .out = 0, \ | ||
| 64 | .buffer = b \ | ||
| 65 | } | ||
| 66 | 100 | ||
| 67 | /** | 101 | #define STRUCT_KFIFO_REC_2(size) \ |
| 68 | * DECLARE_KFIFO - macro to declare a kfifo and the associated buffer | 102 | struct __STRUCT_KFIFO(unsigned char, size, 2, void) |
| 69 | * @name: name of the declared kfifo datatype | 103 | |
| 70 | * @size: size of the fifo buffer. Must be a power of two. | 104 | /* |
| 71 | * | 105 | * define kfifo_rec types |
| 72 | * Note1: the macro can be used inside struct or union declaration | ||
| 73 | * Note2: the macro creates two objects: | ||
| 74 | * A kfifo object with the given name and a buffer for the kfifo | ||
| 75 | * object named name##kfifo_buffer | ||
| 76 | */ | 106 | */ |
| 77 | #define DECLARE_KFIFO(name, size) \ | 107 | struct kfifo_rec_ptr_1 __STRUCT_KFIFO_PTR(unsigned char, 1, void); |
| 78 | union { \ | 108 | struct kfifo_rec_ptr_2 __STRUCT_KFIFO_PTR(unsigned char, 2, void); |
| 79 | struct kfifo name; \ | ||
| 80 | unsigned char name##kfifo_buffer[size + sizeof(struct kfifo)]; \ | ||
| 81 | } | ||
| 82 | 109 | ||
| 83 | /** | 110 | /* |
| 84 | * INIT_KFIFO - Initialize a kfifo declared by DECLARE_KFIFO | 111 | * helper macro to distinguish between real in place fifo where the fifo |
| 85 | * @name: name of the declared kfifo datatype | 112 | * array is a part of the structure and the fifo type where the array is |
| 113 | * outside of the fifo structure. | ||
| 86 | */ | 114 | */ |
| 87 | #define INIT_KFIFO(name) \ | 115 | #define __is_kfifo_ptr(fifo) (sizeof(*fifo) == sizeof(struct __kfifo)) |
| 88 | name = __kfifo_initializer(sizeof(name##kfifo_buffer) - \ | ||
| 89 | sizeof(struct kfifo), \ | ||
| 90 | name##kfifo_buffer + sizeof(struct kfifo)) | ||
| 91 | 116 | ||
| 92 | /** | 117 | /** |
| 93 | * DEFINE_KFIFO - macro to define and initialize a kfifo | 118 | * DECLARE_KFIFO_PTR - macro to declare a fifo pointer object |
| 94 | * @name: name of the declared kfifo datatype | 119 | * @fifo: name of the declared fifo |
| 95 | * @size: size of the fifo buffer. Must be a power of two. | 120 | * @type: type of the fifo elements |
| 96 | * | ||
| 97 | * Note1: the macro can be used for global and local kfifo data type variables | ||
| 98 | * Note2: the macro creates two objects: | ||
| 99 | * A kfifo object with the given name and a buffer for the kfifo | ||
| 100 | * object named name##kfifo_buffer | ||
| 101 | */ | 121 | */ |
| 102 | #define DEFINE_KFIFO(name, size) \ | 122 | #define DECLARE_KFIFO_PTR(fifo, type) STRUCT_KFIFO_PTR(type) fifo |
| 103 | unsigned char name##kfifo_buffer[size]; \ | ||
| 104 | struct kfifo name = __kfifo_initializer(size, name##kfifo_buffer) | ||
| 105 | |||
| 106 | extern void kfifo_init(struct kfifo *fifo, void *buffer, | ||
| 107 | unsigned int size); | ||
| 108 | extern __must_check int kfifo_alloc(struct kfifo *fifo, unsigned int size, | ||
| 109 | gfp_t gfp_mask); | ||
| 110 | extern void kfifo_free(struct kfifo *fifo); | ||
| 111 | extern unsigned int kfifo_in(struct kfifo *fifo, | ||
| 112 | const void *from, unsigned int len); | ||
| 113 | extern __must_check unsigned int kfifo_out(struct kfifo *fifo, | ||
| 114 | void *to, unsigned int len); | ||
| 115 | extern __must_check unsigned int kfifo_out_peek(struct kfifo *fifo, | ||
| 116 | void *to, unsigned int len, unsigned offset); | ||
| 117 | 123 | ||
| 118 | /** | 124 | /** |
| 119 | * kfifo_initialized - Check if kfifo is initialized. | 125 | * DECLARE_KFIFO - macro to declare a fifo object |
| 120 | * @fifo: fifo to check | 126 | * @fifo: name of the declared fifo |
| 121 | * Return %true if FIFO is initialized, otherwise %false. | 127 | * @type: type of the fifo elements |
| 122 | * Assumes the fifo was 0 before. | 128 | * @size: the number of elements in the fifo, this must be a power of 2 |
| 123 | */ | 129 | */ |
| 124 | static inline bool kfifo_initialized(struct kfifo *fifo) | 130 | #define DECLARE_KFIFO(fifo, type, size) STRUCT_KFIFO(type, size) fifo |
| 125 | { | ||
| 126 | return fifo->buffer != NULL; | ||
| 127 | } | ||
| 128 | 131 | ||
| 129 | /** | 132 | /** |
| 130 | * kfifo_reset - removes the entire FIFO contents | 133 | * INIT_KFIFO - Initialize a fifo declared by DECLARE_KFIFO |
| 131 | * @fifo: the fifo to be emptied. | 134 | * @fifo: name of the declared fifo datatype |
| 132 | */ | 135 | */ |
| 133 | static inline void kfifo_reset(struct kfifo *fifo) | 136 | #define INIT_KFIFO(fifo) \ |
| 134 | { | 137 | (void)({ \ |
| 135 | fifo->in = fifo->out = 0; | 138 | typeof(&(fifo)) __tmp = &(fifo); \ |
| 136 | } | 139 | struct __kfifo *__kfifo = &__tmp->kfifo; \ |
| 140 | __kfifo->in = 0; \ | ||
| 141 | __kfifo->out = 0; \ | ||
| 142 | __kfifo->mask = __is_kfifo_ptr(__tmp) ? 0 : ARRAY_SIZE(__tmp->buf) - 1;\ | ||
| 143 | __kfifo->esize = sizeof(*__tmp->buf); \ | ||
| 144 | __kfifo->data = __is_kfifo_ptr(__tmp) ? NULL : __tmp->buf; \ | ||
| 145 | }) | ||
| 137 | 146 | ||
| 138 | /** | 147 | /** |
| 139 | * kfifo_reset_out - skip FIFO contents | 148 | * DEFINE_KFIFO - macro to define and initialize a fifo |
| 140 | * @fifo: the fifo to be emptied. | 149 | * @fifo: name of the declared fifo datatype |
| 141 | */ | 150 | * @type: type of the fifo elements |
| 142 | static inline void kfifo_reset_out(struct kfifo *fifo) | 151 | * @size: the number of elements in the fifo, this must be a power of 2 |
| 152 | * | ||
| 153 | * Note: the macro can be used for global and local fifo data type variables. | ||
| 154 | */ | ||
| 155 | #define DEFINE_KFIFO(fifo, type, size) \ | ||
| 156 | DECLARE_KFIFO(fifo, type, size) = \ | ||
| 157 | (typeof(fifo)) { \ | ||
| 158 | { \ | ||
| 159 | { \ | ||
| 160 | .in = 0, \ | ||
| 161 | .out = 0, \ | ||
| 162 | .mask = __is_kfifo_ptr(&(fifo)) ? \ | ||
| 163 | 0 : \ | ||
| 164 | ARRAY_SIZE((fifo).buf) - 1, \ | ||
| 165 | .esize = sizeof(*(fifo).buf), \ | ||
| 166 | .data = __is_kfifo_ptr(&(fifo)) ? \ | ||
| 167 | NULL : \ | ||
| 168 | (fifo).buf, \ | ||
| 169 | } \ | ||
| 170 | } \ | ||
| 171 | } | ||
| 172 | |||
| 173 | |||
| 174 | static inline unsigned int __must_check | ||
| 175 | __kfifo_uint_must_check_helper(unsigned int val) | ||
| 143 | { | 176 | { |
| 144 | smp_mb(); | 177 | return val; |
| 145 | fifo->out = fifo->in; | ||
| 146 | } | 178 | } |
| 147 | 179 | ||
| 148 | /** | 180 | static inline int __must_check |
| 149 | * kfifo_size - returns the size of the fifo in bytes | 181 | __kfifo_int_must_check_helper(int val) |
| 150 | * @fifo: the fifo to be used. | ||
| 151 | */ | ||
| 152 | static inline __must_check unsigned int kfifo_size(struct kfifo *fifo) | ||
| 153 | { | 182 | { |
| 154 | return fifo->size; | 183 | return val; |
| 155 | } | 184 | } |
| 156 | 185 | ||
| 157 | /** | 186 | /** |
| 158 | * kfifo_len - returns the number of used bytes in the FIFO | 187 | * kfifo_initialized - Check if the fifo is initialized |
| 159 | * @fifo: the fifo to be used. | 188 | * @fifo: address of the fifo to check |
| 189 | * | ||
| 190 | * Return %true if fifo is initialized, otherwise %false. | ||
| 191 | * Assumes the fifo was 0 before. | ||
| 160 | */ | 192 | */ |
| 161 | static inline unsigned int kfifo_len(struct kfifo *fifo) | 193 | #define kfifo_initialized(fifo) ((fifo)->kfifo.mask) |
| 162 | { | ||
| 163 | register unsigned int out; | ||
| 164 | |||
| 165 | out = fifo->out; | ||
| 166 | smp_rmb(); | ||
| 167 | return fifo->in - out; | ||
| 168 | } | ||
| 169 | 194 | ||
| 170 | /** | 195 | /** |
| 171 | * kfifo_is_empty - returns true if the fifo is empty | 196 | * kfifo_esize - returns the size of the element managed by the fifo |
| 172 | * @fifo: the fifo to be used. | 197 | * @fifo: address of the fifo to be used |
| 173 | */ | 198 | */ |
| 174 | static inline __must_check int kfifo_is_empty(struct kfifo *fifo) | 199 | #define kfifo_esize(fifo) ((fifo)->kfifo.esize) |
| 175 | { | ||
| 176 | return fifo->in == fifo->out; | ||
| 177 | } | ||
| 178 | 200 | ||
| 179 | /** | 201 | /** |
| 180 | * kfifo_is_full - returns true if the fifo is full | 202 | * kfifo_recsize - returns the size of the record length field |
| 181 | * @fifo: the fifo to be used. | 203 | * @fifo: address of the fifo to be used |
| 182 | */ | 204 | */ |
| 183 | static inline __must_check int kfifo_is_full(struct kfifo *fifo) | 205 | #define kfifo_recsize(fifo) (sizeof(*(fifo)->rectype)) |
| 184 | { | ||
| 185 | return kfifo_len(fifo) == kfifo_size(fifo); | ||
| 186 | } | ||
| 187 | 206 | ||
| 188 | /** | 207 | /** |
| 189 | * kfifo_avail - returns the number of bytes available in the FIFO | 208 | * kfifo_size - returns the size of the fifo in elements |
| 190 | * @fifo: the fifo to be used. | 209 | * @fifo: address of the fifo to be used |
| 191 | */ | 210 | */ |
| 192 | static inline __must_check unsigned int kfifo_avail(struct kfifo *fifo) | 211 | #define kfifo_size(fifo) ((fifo)->kfifo.mask + 1) |
| 193 | { | ||
| 194 | return kfifo_size(fifo) - kfifo_len(fifo); | ||
| 195 | } | ||
| 196 | 212 | ||
| 197 | /** | 213 | /** |
| 198 | * kfifo_in_locked - puts some data into the FIFO using a spinlock for locking | 214 | * kfifo_reset - removes the entire fifo content |
| 199 | * @fifo: the fifo to be used. | 215 | * @fifo: address of the fifo to be used |
| 200 | * @from: the data to be added. | ||
| 201 | * @n: the length of the data to be added. | ||
| 202 | * @lock: pointer to the spinlock to use for locking. | ||
| 203 | * | 216 | * |
| 204 | * This function copies at most @n bytes from the @from buffer into | 217 | * Note: usage of kfifo_reset() is dangerous. It should be only called when the |
| 205 | * the FIFO depending on the free space, and returns the number of | 218 | * fifo is exclusived locked or when it is secured that no other thread is |
| 206 | * bytes copied. | 219 | * accessing the fifo. |
| 207 | */ | 220 | */ |
| 208 | static inline unsigned int kfifo_in_locked(struct kfifo *fifo, | 221 | #define kfifo_reset(fifo) \ |
| 209 | const void *from, unsigned int n, spinlock_t *lock) | 222 | (void)({ \ |
| 210 | { | 223 | typeof((fifo) + 1) __tmp = (fifo); \ |
| 211 | unsigned long flags; | 224 | __tmp->kfifo.in = __tmp->kfifo.out = 0; \ |
| 212 | unsigned int ret; | 225 | }) |
| 213 | |||
| 214 | spin_lock_irqsave(lock, flags); | ||
| 215 | |||
| 216 | ret = kfifo_in(fifo, from, n); | ||
| 217 | |||
| 218 | spin_unlock_irqrestore(lock, flags); | ||
| 219 | |||
| 220 | return ret; | ||
| 221 | } | ||
| 222 | 226 | ||
| 223 | /** | 227 | /** |
| 224 | * kfifo_out_locked - gets some data from the FIFO using a spinlock for locking | 228 | * kfifo_reset_out - skip fifo content |
| 225 | * @fifo: the fifo to be used. | 229 | * @fifo: address of the fifo to be used |
| 226 | * @to: where the data must be copied. | ||
| 227 | * @n: the size of the destination buffer. | ||
| 228 | * @lock: pointer to the spinlock to use for locking. | ||
| 229 | * | 230 | * |
| 230 | * This function copies at most @n bytes from the FIFO into the | 231 | * Note: The usage of kfifo_reset_out() is safe until it will be only called |
| 231 | * @to buffer and returns the number of copied bytes. | 232 | * from the reader thread and there is only one concurrent reader. Otherwise |
| 232 | */ | 233 | * it is dangerous and must be handled in the same way as kfifo_reset(). |
| 233 | static inline __must_check unsigned int kfifo_out_locked(struct kfifo *fifo, | ||
| 234 | void *to, unsigned int n, spinlock_t *lock) | ||
| 235 | { | ||
| 236 | unsigned long flags; | ||
| 237 | unsigned int ret; | ||
| 238 | |||
| 239 | spin_lock_irqsave(lock, flags); | ||
| 240 | |||
| 241 | ret = kfifo_out(fifo, to, n); | ||
| 242 | |||
| 243 | spin_unlock_irqrestore(lock, flags); | ||
| 244 | |||
| 245 | return ret; | ||
| 246 | } | ||
| 247 | |||
| 248 | extern void kfifo_skip(struct kfifo *fifo, unsigned int len); | ||
| 249 | |||
| 250 | extern __must_check int kfifo_from_user(struct kfifo *fifo, | ||
| 251 | const void __user *from, unsigned int n, unsigned *lenout); | ||
| 252 | |||
| 253 | extern __must_check int kfifo_to_user(struct kfifo *fifo, | ||
| 254 | void __user *to, unsigned int n, unsigned *lenout); | ||
| 255 | |||
| 256 | /* | ||
| 257 | * __kfifo_add_out internal helper function for updating the out offset | ||
| 258 | */ | 234 | */ |
| 259 | static inline void __kfifo_add_out(struct kfifo *fifo, | 235 | #define kfifo_reset_out(fifo) \ |
| 260 | unsigned int off) | 236 | (void)({ \ |
| 261 | { | 237 | typeof((fifo) + 1) __tmp = (fifo); \ |
| 262 | smp_mb(); | 238 | __tmp->kfifo.out = __tmp->kfifo.in; \ |
| 263 | fifo->out += off; | 239 | }) |
| 264 | } | ||
| 265 | 240 | ||
| 266 | /* | 241 | /** |
| 267 | * __kfifo_add_in internal helper function for updating the in offset | 242 | * kfifo_len - returns the number of used elements in the fifo |
| 243 | * @fifo: address of the fifo to be used | ||
| 268 | */ | 244 | */ |
| 269 | static inline void __kfifo_add_in(struct kfifo *fifo, | 245 | #define kfifo_len(fifo) \ |
| 270 | unsigned int off) | 246 | ({ \ |
| 271 | { | 247 | typeof((fifo) + 1) __tmpl = (fifo); \ |
| 272 | smp_wmb(); | 248 | __tmpl->kfifo.in - __tmpl->kfifo.out; \ |
| 273 | fifo->in += off; | 249 | }) |
| 274 | } | ||
| 275 | 250 | ||
| 276 | /* | 251 | /** |
| 277 | * __kfifo_off internal helper function for calculating the index of a | 252 | * kfifo_is_empty - returns true if the fifo is empty |
| 278 | * given offeset | 253 | * @fifo: address of the fifo to be used |
| 279 | */ | 254 | */ |
| 280 | static inline unsigned int __kfifo_off(struct kfifo *fifo, unsigned int off) | 255 | #define kfifo_is_empty(fifo) \ |
| 281 | { | 256 | ({ \ |
| 282 | return off & (fifo->size - 1); | 257 | typeof((fifo) + 1) __tmpq = (fifo); \ |
| 283 | } | 258 | __tmpq->kfifo.in == __tmpq->kfifo.out; \ |
| 259 | }) | ||
| 284 | 260 | ||
| 285 | /* | 261 | /** |
| 286 | * __kfifo_peek_n internal helper function for determinate the length of | 262 | * kfifo_is_full - returns true if the fifo is full |
| 287 | * the next record in the fifo | 263 | * @fifo: address of the fifo to be used |
| 288 | */ | 264 | */ |
| 289 | static inline unsigned int __kfifo_peek_n(struct kfifo *fifo, | 265 | #define kfifo_is_full(fifo) \ |
| 290 | unsigned int recsize) | 266 | ({ \ |
| 291 | { | 267 | typeof((fifo) + 1) __tmpq = (fifo); \ |
| 292 | #define __KFIFO_GET(fifo, off, shift) \ | 268 | kfifo_len(__tmpq) > __tmpq->kfifo.mask; \ |
| 293 | ((fifo)->buffer[__kfifo_off((fifo), (fifo)->out+(off))] << (shift)) | 269 | }) |
| 294 | 270 | ||
| 295 | unsigned int l; | 271 | /** |
| 272 | * kfifo_avail - returns the number of unused elements in the fifo | ||
| 273 | * @fifo: address of the fifo to be used | ||
| 274 | */ | ||
| 275 | #define kfifo_avail(fifo) \ | ||
| 276 | __kfifo_uint_must_check_helper( \ | ||
| 277 | ({ \ | ||
| 278 | typeof((fifo) + 1) __tmpq = (fifo); \ | ||
| 279 | const size_t __recsize = sizeof(*__tmpq->rectype); \ | ||
| 280 | unsigned int __avail = kfifo_size(__tmpq) - kfifo_len(__tmpq); \ | ||
| 281 | (__recsize) ? ((__avail <= __recsize) ? 0 : \ | ||
| 282 | __kfifo_max_r(__avail - __recsize, __recsize)) : \ | ||
| 283 | __avail; \ | ||
| 284 | }) \ | ||
| 285 | ) | ||
| 296 | 286 | ||
| 297 | l = __KFIFO_GET(fifo, 0, 0); | 287 | /** |
| 288 | * kfifo_skip - skip output data | ||
| 289 | * @fifo: address of the fifo to be used | ||
| 290 | */ | ||
| 291 | #define kfifo_skip(fifo) \ | ||
| 292 | (void)({ \ | ||
| 293 | typeof((fifo) + 1) __tmp = (fifo); \ | ||
| 294 | const size_t __recsize = sizeof(*__tmp->rectype); \ | ||
| 295 | struct __kfifo *__kfifo = &__tmp->kfifo; \ | ||
| 296 | if (__recsize) \ | ||
| 297 | __kfifo_skip_r(__kfifo, __recsize); \ | ||
| 298 | else \ | ||
| 299 | __kfifo->out++; \ | ||
| 300 | }) | ||
| 298 | 301 | ||
| 299 | if (--recsize) | 302 | /** |
| 300 | l |= __KFIFO_GET(fifo, 1, 8); | 303 | * kfifo_peek_len - gets the size of the next fifo record |
| 304 | * @fifo: address of the fifo to be used | ||
| 305 | * | ||
| 306 | * This function returns the size of the next fifo record in number of bytes. | ||
| 307 | */ | ||
| 308 | #define kfifo_peek_len(fifo) \ | ||
| 309 | __kfifo_uint_must_check_helper( \ | ||
| 310 | ({ \ | ||
| 311 | typeof((fifo) + 1) __tmp = (fifo); \ | ||
| 312 | const size_t __recsize = sizeof(*__tmp->rectype); \ | ||
| 313 | struct __kfifo *__kfifo = &__tmp->kfifo; \ | ||
| 314 | (!__recsize) ? kfifo_len(__tmp) * sizeof(*__tmp->type) : \ | ||
| 315 | __kfifo_len_r(__kfifo, __recsize); \ | ||
| 316 | }) \ | ||
| 317 | ) | ||
| 301 | 318 | ||
| 302 | return l; | 319 | /** |
| 303 | #undef __KFIFO_GET | 320 | * kfifo_alloc - dynamically allocates a new fifo buffer |
| 304 | } | 321 | * @fifo: pointer to the fifo |
| 322 | * @size: the number of elements in the fifo, this must be a power of 2 | ||
| 323 | * @gfp_mask: get_free_pages mask, passed to kmalloc() | ||
| 324 | * | ||
| 325 | * This macro dynamically allocates a new fifo buffer. | ||
| 326 | * | ||
| 327 | * The numer of elements will be rounded-up to a power of 2. | ||
| 328 | * The fifo will be release with kfifo_free(). | ||
| 329 | * Return 0 if no error, otherwise an error code. | ||
| 330 | */ | ||
| 331 | #define kfifo_alloc(fifo, size, gfp_mask) \ | ||
| 332 | __kfifo_int_must_check_helper( \ | ||
| 333 | ({ \ | ||
| 334 | typeof((fifo) + 1) __tmp = (fifo); \ | ||
| 335 | struct __kfifo *__kfifo = &__tmp->kfifo; \ | ||
| 336 | __is_kfifo_ptr(__tmp) ? \ | ||
| 337 | __kfifo_alloc(__kfifo, size, sizeof(*__tmp->type), gfp_mask) : \ | ||
| 338 | -EINVAL; \ | ||
| 339 | }) \ | ||
| 340 | ) | ||
| 305 | 341 | ||
| 306 | /* | 342 | /** |
| 307 | * __kfifo_poke_n internal helper function for storing the length of | 343 | * kfifo_free - frees the fifo |
| 308 | * the next record into the fifo | 344 | * @fifo: the fifo to be freed |
| 309 | */ | 345 | */ |
| 310 | static inline void __kfifo_poke_n(struct kfifo *fifo, | 346 | #define kfifo_free(fifo) \ |
| 311 | unsigned int recsize, unsigned int n) | 347 | ({ \ |
| 312 | { | 348 | typeof((fifo) + 1) __tmp = (fifo); \ |
| 313 | #define __KFIFO_PUT(fifo, off, val, shift) \ | 349 | struct __kfifo *__kfifo = &__tmp->kfifo; \ |
| 314 | ( \ | 350 | if (__is_kfifo_ptr(__tmp)) \ |
| 315 | (fifo)->buffer[__kfifo_off((fifo), (fifo)->in+(off))] = \ | 351 | __kfifo_free(__kfifo); \ |
| 316 | (unsigned char)((val) >> (shift)) \ | 352 | }) |
| 317 | ) | ||
| 318 | 353 | ||
| 319 | __KFIFO_PUT(fifo, 0, n, 0); | 354 | /** |
| 355 | * kfifo_init - initialize a fifo using a preallocated buffer | ||
| 356 | * @fifo: the fifo to assign the buffer | ||
| 357 | * @buffer: the preallocated buffer to be used | ||
| 358 | * @size: the size of the internal buffer, this have to be a power of 2 | ||
| 359 | * | ||
| 360 | * This macro initialize a fifo using a preallocated buffer. | ||
| 361 | * | ||
| 362 | * The numer of elements will be rounded-up to a power of 2. | ||
| 363 | * Return 0 if no error, otherwise an error code. | ||
| 364 | */ | ||
| 365 | #define kfifo_init(fifo, buffer, size) \ | ||
| 366 | ({ \ | ||
| 367 | typeof((fifo) + 1) __tmp = (fifo); \ | ||
| 368 | struct __kfifo *__kfifo = &__tmp->kfifo; \ | ||
| 369 | __is_kfifo_ptr(__tmp) ? \ | ||
| 370 | __kfifo_init(__kfifo, buffer, size, sizeof(*__tmp->type)) : \ | ||
| 371 | -EINVAL; \ | ||
| 372 | }) | ||
| 320 | 373 | ||
| 321 | if (--recsize) | 374 | /** |
| 322 | __KFIFO_PUT(fifo, 1, n, 8); | 375 | * kfifo_put - put data into the fifo |
| 323 | #undef __KFIFO_PUT | 376 | * @fifo: address of the fifo to be used |
| 324 | } | 377 | * @val: the data to be added |
| 378 | * | ||
| 379 | * This macro copies the given value into the fifo. | ||
| 380 | * It returns 0 if the fifo was full. Otherwise it returns the number | ||
| 381 | * processed elements. | ||
| 382 | * | ||
| 383 | * Note that with only one concurrent reader and one concurrent | ||
| 384 | * writer, you don't need extra locking to use these macro. | ||
| 385 | */ | ||
| 386 | #define kfifo_put(fifo, val) \ | ||
| 387 | ({ \ | ||
| 388 | typeof((fifo) + 1) __tmp = (fifo); \ | ||
| 389 | typeof((val) + 1) __val = (val); \ | ||
| 390 | unsigned int __ret; \ | ||
| 391 | const size_t __recsize = sizeof(*__tmp->rectype); \ | ||
| 392 | struct __kfifo *__kfifo = &__tmp->kfifo; \ | ||
| 393 | if (0) { \ | ||
| 394 | typeof(__tmp->ptr_const) __dummy __attribute__ ((unused)); \ | ||
| 395 | __dummy = (typeof(__val))NULL; \ | ||
| 396 | } \ | ||
| 397 | if (__recsize) \ | ||
| 398 | __ret = __kfifo_in_r(__kfifo, __val, sizeof(*__val), \ | ||
| 399 | __recsize); \ | ||
| 400 | else { \ | ||
| 401 | __ret = !kfifo_is_full(__tmp); \ | ||
| 402 | if (__ret) { \ | ||
| 403 | (__is_kfifo_ptr(__tmp) ? \ | ||
| 404 | ((typeof(__tmp->type))__kfifo->data) : \ | ||
| 405 | (__tmp->buf) \ | ||
| 406 | )[__kfifo->in & __tmp->kfifo.mask] = \ | ||
| 407 | *(typeof(__tmp->type))__val; \ | ||
| 408 | smp_wmb(); \ | ||
| 409 | __kfifo->in++; \ | ||
| 410 | } \ | ||
| 411 | } \ | ||
| 412 | __ret; \ | ||
| 413 | }) | ||
| 325 | 414 | ||
| 326 | /* | 415 | /** |
| 327 | * __kfifo_in_... internal functions for put date into the fifo | 416 | * kfifo_get - get data from the fifo |
| 328 | * do not call it directly, use kfifo_in_rec() instead | 417 | * @fifo: address of the fifo to be used |
| 329 | */ | 418 | * @val: the var where to store the data to be added |
| 330 | extern unsigned int __kfifo_in_n(struct kfifo *fifo, | 419 | * |
| 331 | const void *from, unsigned int n, unsigned int recsize); | 420 | * This macro reads the data from the fifo. |
| 421 | * It returns 0 if the fifo was empty. Otherwise it returns the number | ||
| 422 | * processed elements. | ||
| 423 | * | ||
| 424 | * Note that with only one concurrent reader and one concurrent | ||
| 425 | * writer, you don't need extra locking to use these macro. | ||
| 426 | */ | ||
| 427 | #define kfifo_get(fifo, val) \ | ||
| 428 | __kfifo_uint_must_check_helper( \ | ||
| 429 | ({ \ | ||
| 430 | typeof((fifo) + 1) __tmp = (fifo); \ | ||
| 431 | typeof((val) + 1) __val = (val); \ | ||
| 432 | unsigned int __ret; \ | ||
| 433 | const size_t __recsize = sizeof(*__tmp->rectype); \ | ||
| 434 | struct __kfifo *__kfifo = &__tmp->kfifo; \ | ||
| 435 | if (0) \ | ||
| 436 | __val = (typeof(__tmp->ptr))0; \ | ||
| 437 | if (__recsize) \ | ||
| 438 | __ret = __kfifo_out_r(__kfifo, __val, sizeof(*__val), \ | ||
| 439 | __recsize); \ | ||
| 440 | else { \ | ||
| 441 | __ret = !kfifo_is_empty(__tmp); \ | ||
| 442 | if (__ret) { \ | ||
| 443 | *(typeof(__tmp->type))__val = \ | ||
| 444 | (__is_kfifo_ptr(__tmp) ? \ | ||
| 445 | ((typeof(__tmp->type))__kfifo->data) : \ | ||
| 446 | (__tmp->buf) \ | ||
| 447 | )[__kfifo->out & __tmp->kfifo.mask]; \ | ||
| 448 | smp_wmb(); \ | ||
| 449 | __kfifo->out++; \ | ||
| 450 | } \ | ||
| 451 | } \ | ||
| 452 | __ret; \ | ||
| 453 | }) \ | ||
| 454 | ) | ||
| 332 | 455 | ||
| 333 | extern unsigned int __kfifo_in_generic(struct kfifo *fifo, | 456 | /** |
| 334 | const void *from, unsigned int n, unsigned int recsize); | 457 | * kfifo_peek - get data from the fifo without removing |
| 458 | * @fifo: address of the fifo to be used | ||
| 459 | * @val: the var where to store the data to be added | ||
| 460 | * | ||
| 461 | * This reads the data from the fifo without removing it from the fifo. | ||
| 462 | * It returns 0 if the fifo was empty. Otherwise it returns the number | ||
| 463 | * processed elements. | ||
| 464 | * | ||
| 465 | * Note that with only one concurrent reader and one concurrent | ||
| 466 | * writer, you don't need extra locking to use these macro. | ||
| 467 | */ | ||
| 468 | #define kfifo_peek(fifo, val) \ | ||
| 469 | __kfifo_uint_must_check_helper( \ | ||
| 470 | ({ \ | ||
| 471 | typeof((fifo) + 1) __tmp = (fifo); \ | ||
| 472 | typeof((val) + 1) __val = (val); \ | ||
| 473 | unsigned int __ret; \ | ||
| 474 | const size_t __recsize = sizeof(*__tmp->rectype); \ | ||
| 475 | struct __kfifo *__kfifo = &__tmp->kfifo; \ | ||
| 476 | if (0) \ | ||
| 477 | __val = (typeof(__tmp->ptr))NULL; \ | ||
| 478 | if (__recsize) \ | ||
| 479 | __ret = __kfifo_out_peek_r(__kfifo, __val, sizeof(*__val), \ | ||
| 480 | __recsize); \ | ||
| 481 | else { \ | ||
| 482 | __ret = !kfifo_is_empty(__tmp); \ | ||
| 483 | if (__ret) { \ | ||
| 484 | *(typeof(__tmp->type))__val = \ | ||
| 485 | (__is_kfifo_ptr(__tmp) ? \ | ||
| 486 | ((typeof(__tmp->type))__kfifo->data) : \ | ||
| 487 | (__tmp->buf) \ | ||
| 488 | )[__kfifo->out & __tmp->kfifo.mask]; \ | ||
| 489 | smp_wmb(); \ | ||
| 490 | } \ | ||
| 491 | } \ | ||
| 492 | __ret; \ | ||
| 493 | }) \ | ||
| 494 | ) | ||
| 335 | 495 | ||
| 336 | static inline unsigned int __kfifo_in_rec(struct kfifo *fifo, | 496 | /** |
| 337 | const void *from, unsigned int n, unsigned int recsize) | 497 | * kfifo_in - put data into the fifo |
| 338 | { | 498 | * @fifo: address of the fifo to be used |
| 339 | unsigned int ret; | 499 | * @buf: the data to be added |
| 500 | * @n: number of elements to be added | ||
| 501 | * | ||
| 502 | * This macro copies the given buffer into the fifo and returns the | ||
| 503 | * number of copied elements. | ||
| 504 | * | ||
| 505 | * Note that with only one concurrent reader and one concurrent | ||
| 506 | * writer, you don't need extra locking to use these macro. | ||
| 507 | */ | ||
| 508 | #define kfifo_in(fifo, buf, n) \ | ||
| 509 | ({ \ | ||
| 510 | typeof((fifo) + 1) __tmp = (fifo); \ | ||
| 511 | typeof((buf) + 1) __buf = (buf); \ | ||
| 512 | unsigned long __n = (n); \ | ||
| 513 | const size_t __recsize = sizeof(*__tmp->rectype); \ | ||
| 514 | struct __kfifo *__kfifo = &__tmp->kfifo; \ | ||
| 515 | if (0) { \ | ||
| 516 | typeof(__tmp->ptr_const) __dummy __attribute__ ((unused)); \ | ||
| 517 | __dummy = (typeof(__buf))NULL; \ | ||
| 518 | } \ | ||
| 519 | (__recsize) ?\ | ||
| 520 | __kfifo_in_r(__kfifo, __buf, __n, __recsize) : \ | ||
| 521 | __kfifo_in(__kfifo, __buf, __n); \ | ||
| 522 | }) | ||
| 340 | 523 | ||
| 341 | ret = __kfifo_in_n(fifo, from, n, recsize); | 524 | /** |
| 525 | * kfifo_in_spinlocked - put data into the fifo using a spinlock for locking | ||
| 526 | * @fifo: address of the fifo to be used | ||
| 527 | * @buf: the data to be added | ||
| 528 | * @n: number of elements to be added | ||
| 529 | * @lock: pointer to the spinlock to use for locking | ||
| 530 | * | ||
| 531 | * This macro copies the given values buffer into the fifo and returns the | ||
| 532 | * number of copied elements. | ||
| 533 | */ | ||
| 534 | #define kfifo_in_spinlocked(fifo, buf, n, lock) \ | ||
| 535 | ({ \ | ||
| 536 | unsigned long __flags; \ | ||
| 537 | unsigned int __ret; \ | ||
| 538 | spin_lock_irqsave(lock, __flags); \ | ||
| 539 | __ret = kfifo_in(fifo, buf, n); \ | ||
| 540 | spin_unlock_irqrestore(lock, __flags); \ | ||
| 541 | __ret; \ | ||
| 542 | }) | ||
| 543 | |||
| 544 | /* alias for kfifo_in_spinlocked, will be removed in a future release */ | ||
| 545 | #define kfifo_in_locked(fifo, buf, n, lock) \ | ||
| 546 | kfifo_in_spinlocked(fifo, buf, n, lock) | ||
| 342 | 547 | ||
| 343 | if (likely(ret == 0)) { | 548 | /** |
| 344 | if (recsize) | 549 | * kfifo_out - get data from the fifo |
| 345 | __kfifo_poke_n(fifo, recsize, n); | 550 | * @fifo: address of the fifo to be used |
| 346 | __kfifo_add_in(fifo, n + recsize); | 551 | * @buf: pointer to the storage buffer |
| 347 | } | 552 | * @n: max. number of elements to get |
| 348 | return ret; | 553 | * |
| 349 | } | 554 | * This macro get some data from the fifo and return the numbers of elements |
| 555 | * copied. | ||
| 556 | * | ||
| 557 | * Note that with only one concurrent reader and one concurrent | ||
| 558 | * writer, you don't need extra locking to use these macro. | ||
| 559 | */ | ||
| 560 | #define kfifo_out(fifo, buf, n) \ | ||
| 561 | __kfifo_uint_must_check_helper( \ | ||
| 562 | ({ \ | ||
| 563 | typeof((fifo) + 1) __tmp = (fifo); \ | ||
| 564 | typeof((buf) + 1) __buf = (buf); \ | ||
| 565 | unsigned long __n = (n); \ | ||
| 566 | const size_t __recsize = sizeof(*__tmp->rectype); \ | ||
| 567 | struct __kfifo *__kfifo = &__tmp->kfifo; \ | ||
| 568 | if (0) { \ | ||
| 569 | typeof(__tmp->ptr) __dummy = NULL; \ | ||
| 570 | __buf = __dummy; \ | ||
| 571 | } \ | ||
| 572 | (__recsize) ?\ | ||
| 573 | __kfifo_out_r(__kfifo, __buf, __n, __recsize) : \ | ||
| 574 | __kfifo_out(__kfifo, __buf, __n); \ | ||
| 575 | }) \ | ||
| 576 | ) | ||
| 577 | |||
| 578 | /** | ||
| 579 | * kfifo_out_spinlocked - get data from the fifo using a spinlock for locking | ||
| 580 | * @fifo: address of the fifo to be used | ||
| 581 | * @buf: pointer to the storage buffer | ||
| 582 | * @n: max. number of elements to get | ||
| 583 | * @lock: pointer to the spinlock to use for locking | ||
| 584 | * | ||
| 585 | * This macro get the data from the fifo and return the numbers of elements | ||
| 586 | * copied. | ||
| 587 | */ | ||
| 588 | #define kfifo_out_spinlocked(fifo, buf, n, lock) \ | ||
| 589 | __kfifo_uint_must_check_helper( \ | ||
| 590 | ({ \ | ||
| 591 | unsigned long __flags; \ | ||
| 592 | unsigned int __ret; \ | ||
| 593 | spin_lock_irqsave(lock, __flags); \ | ||
| 594 | __ret = kfifo_out(fifo, buf, n); \ | ||
| 595 | spin_unlock_irqrestore(lock, __flags); \ | ||
| 596 | __ret; \ | ||
| 597 | }) \ | ||
| 598 | ) | ||
| 599 | |||
| 600 | /* alias for kfifo_out_spinlocked, will be removed in a future release */ | ||
| 601 | #define kfifo_out_locked(fifo, buf, n, lock) \ | ||
| 602 | kfifo_out_spinlocked(fifo, buf, n, lock) | ||
| 350 | 603 | ||
| 351 | /** | 604 | /** |
| 352 | * kfifo_in_rec - puts some record data into the FIFO | 605 | * kfifo_from_user - puts some data from user space into the fifo |
| 353 | * @fifo: the fifo to be used. | 606 | * @fifo: address of the fifo to be used |
| 354 | * @from: the data to be added. | 607 | * @from: pointer to the data to be added |
| 355 | * @n: the length of the data to be added. | 608 | * @len: the length of the data to be added |
| 356 | * @recsize: size of record field | 609 | * @copied: pointer to output variable to store the number of copied bytes |
| 357 | * | 610 | * |
| 358 | * This function copies @n bytes from the @from into the FIFO and returns | 611 | * This macro copies at most @len bytes from the @from into the |
| 359 | * the number of bytes which cannot be copied. | 612 | * fifo, depending of the available space and returns -EFAULT/0. |
| 360 | * A returned value greater than the @n value means that the record doesn't | ||
| 361 | * fit into the buffer. | ||
| 362 | * | 613 | * |
| 363 | * Note that with only one concurrent reader and one concurrent | 614 | * Note that with only one concurrent reader and one concurrent |
| 364 | * writer, you don't need extra locking to use these functions. | 615 | * writer, you don't need extra locking to use these macro. |
| 365 | */ | 616 | */ |
| 366 | static inline __must_check unsigned int kfifo_in_rec(struct kfifo *fifo, | 617 | #define kfifo_from_user(fifo, from, len, copied) \ |
| 367 | void *from, unsigned int n, unsigned int recsize) | 618 | __kfifo_uint_must_check_helper( \ |
| 368 | { | 619 | ({ \ |
| 369 | if (!__builtin_constant_p(recsize)) | 620 | typeof((fifo) + 1) __tmp = (fifo); \ |
| 370 | return __kfifo_in_generic(fifo, from, n, recsize); | 621 | const void __user *__from = (from); \ |
| 371 | return __kfifo_in_rec(fifo, from, n, recsize); | 622 | unsigned int __len = (len); \ |
| 372 | } | 623 | unsigned int *__copied = (copied); \ |
| 624 | const size_t __recsize = sizeof(*__tmp->rectype); \ | ||
| 625 | struct __kfifo *__kfifo = &__tmp->kfifo; \ | ||
| 626 | (__recsize) ? \ | ||
| 627 | __kfifo_from_user_r(__kfifo, __from, __len, __copied, __recsize) : \ | ||
| 628 | __kfifo_from_user(__kfifo, __from, __len, __copied); \ | ||
| 629 | }) \ | ||
| 630 | ) | ||
| 373 | 631 | ||
| 374 | /* | 632 | /** |
| 375 | * __kfifo_out_... internal functions for get date from the fifo | 633 | * kfifo_to_user - copies data from the fifo into user space |
| 376 | * do not call it directly, use kfifo_out_rec() instead | 634 | * @fifo: address of the fifo to be used |
| 377 | */ | 635 | * @to: where the data must be copied |
| 378 | extern unsigned int __kfifo_out_n(struct kfifo *fifo, | 636 | * @len: the size of the destination buffer |
| 379 | void *to, unsigned int reclen, unsigned int recsize); | 637 | * @copied: pointer to output variable to store the number of copied bytes |
| 638 | * | ||
| 639 | * This macro copies at most @len bytes from the fifo into the | ||
| 640 | * @to buffer and returns -EFAULT/0. | ||
| 641 | * | ||
| 642 | * Note that with only one concurrent reader and one concurrent | ||
| 643 | * writer, you don't need extra locking to use these macro. | ||
| 644 | */ | ||
| 645 | #define kfifo_to_user(fifo, to, len, copied) \ | ||
| 646 | __kfifo_uint_must_check_helper( \ | ||
| 647 | ({ \ | ||
| 648 | typeof((fifo) + 1) __tmp = (fifo); \ | ||
| 649 | void __user *__to = (to); \ | ||
| 650 | unsigned int __len = (len); \ | ||
| 651 | unsigned int *__copied = (copied); \ | ||
| 652 | const size_t __recsize = sizeof(*__tmp->rectype); \ | ||
| 653 | struct __kfifo *__kfifo = &__tmp->kfifo; \ | ||
| 654 | (__recsize) ? \ | ||
| 655 | __kfifo_to_user_r(__kfifo, __to, __len, __copied, __recsize) : \ | ||
| 656 | __kfifo_to_user(__kfifo, __to, __len, __copied); \ | ||
| 657 | }) \ | ||
| 658 | ) | ||
| 659 | |||
| 660 | /** | ||
| 661 | * kfifo_dma_in_prepare - setup a scatterlist for DMA input | ||
| 662 | * @fifo: address of the fifo to be used | ||
| 663 | * @sgl: pointer to the scatterlist array | ||
| 664 | * @nents: number of entries in the scatterlist array | ||
| 665 | * @len: number of elements to transfer | ||
| 666 | * | ||
| 667 | * This macro fills a scatterlist for DMA input. | ||
| 668 | * It returns the number entries in the scatterlist array. | ||
| 669 | * | ||
| 670 | * Note that with only one concurrent reader and one concurrent | ||
| 671 | * writer, you don't need extra locking to use these macros. | ||
| 672 | */ | ||
| 673 | #define kfifo_dma_in_prepare(fifo, sgl, nents, len) \ | ||
| 674 | ({ \ | ||
| 675 | typeof((fifo) + 1) __tmp = (fifo); \ | ||
| 676 | struct scatterlist *__sgl = (sgl); \ | ||
| 677 | int __nents = (nents); \ | ||
| 678 | unsigned int __len = (len); \ | ||
| 679 | const size_t __recsize = sizeof(*__tmp->rectype); \ | ||
| 680 | struct __kfifo *__kfifo = &__tmp->kfifo; \ | ||
| 681 | (__recsize) ? \ | ||
| 682 | __kfifo_dma_in_prepare_r(__kfifo, __sgl, __nents, __len, __recsize) : \ | ||
| 683 | __kfifo_dma_in_prepare(__kfifo, __sgl, __nents, __len); \ | ||
| 684 | }) | ||
| 380 | 685 | ||
| 381 | extern unsigned int __kfifo_out_generic(struct kfifo *fifo, | 686 | /** |
| 382 | void *to, unsigned int n, | 687 | * kfifo_dma_in_finish - finish a DMA IN operation |
| 383 | unsigned int recsize, unsigned int *total); | 688 | * @fifo: address of the fifo to be used |
| 689 | * @len: number of bytes to received | ||
| 690 | * | ||
| 691 | * This macro finish a DMA IN operation. The in counter will be updated by | ||
| 692 | * the len parameter. No error checking will be done. | ||
| 693 | * | ||
| 694 | * Note that with only one concurrent reader and one concurrent | ||
| 695 | * writer, you don't need extra locking to use these macros. | ||
| 696 | */ | ||
| 697 | #define kfifo_dma_in_finish(fifo, len) \ | ||
| 698 | (void)({ \ | ||
| 699 | typeof((fifo) + 1) __tmp = (fifo); \ | ||
| 700 | unsigned int __len = (len); \ | ||
| 701 | const size_t __recsize = sizeof(*__tmp->rectype); \ | ||
| 702 | struct __kfifo *__kfifo = &__tmp->kfifo; \ | ||
| 703 | if (__recsize) \ | ||
| 704 | __kfifo_dma_in_finish_r(__kfifo, __len, __recsize); \ | ||
| 705 | else \ | ||
| 706 | __kfifo->in += __len / sizeof(*__tmp->type); \ | ||
| 707 | }) | ||
| 384 | 708 | ||
| 385 | static inline unsigned int __kfifo_out_rec(struct kfifo *fifo, | 709 | /** |
| 386 | void *to, unsigned int n, unsigned int recsize, | 710 | * kfifo_dma_out_prepare - setup a scatterlist for DMA output |
| 387 | unsigned int *total) | 711 | * @fifo: address of the fifo to be used |
| 388 | { | 712 | * @sgl: pointer to the scatterlist array |
| 389 | unsigned int l; | 713 | * @nents: number of entries in the scatterlist array |
| 390 | 714 | * @len: number of elements to transfer | |
| 391 | if (!recsize) { | 715 | * |
| 392 | l = n; | 716 | * This macro fills a scatterlist for DMA output which at most @len bytes |
| 393 | if (total) | 717 | * to transfer. |
| 394 | *total = l; | 718 | * It returns the number entries in the scatterlist array. |
| 395 | } else { | 719 | * A zero means there is no space available and the scatterlist is not filled. |
| 396 | l = __kfifo_peek_n(fifo, recsize); | 720 | * |
| 397 | if (total) | 721 | * Note that with only one concurrent reader and one concurrent |
| 398 | *total = l; | 722 | * writer, you don't need extra locking to use these macros. |
| 399 | if (n < l) | 723 | */ |
| 400 | return l; | 724 | #define kfifo_dma_out_prepare(fifo, sgl, nents, len) \ |
| 401 | } | 725 | ({ \ |
| 726 | typeof((fifo) + 1) __tmp = (fifo); \ | ||
| 727 | struct scatterlist *__sgl = (sgl); \ | ||
| 728 | int __nents = (nents); \ | ||
| 729 | unsigned int __len = (len); \ | ||
| 730 | const size_t __recsize = sizeof(*__tmp->rectype); \ | ||
| 731 | struct __kfifo *__kfifo = &__tmp->kfifo; \ | ||
| 732 | (__recsize) ? \ | ||
| 733 | __kfifo_dma_out_prepare_r(__kfifo, __sgl, __nents, __len, __recsize) : \ | ||
| 734 | __kfifo_dma_out_prepare(__kfifo, __sgl, __nents, __len); \ | ||
| 735 | }) | ||
| 402 | 736 | ||
| 403 | return __kfifo_out_n(fifo, to, l, recsize); | 737 | /** |
| 404 | } | 738 | * kfifo_dma_out_finish - finish a DMA OUT operation |
| 739 | * @fifo: address of the fifo to be used | ||
| 740 | * @len: number of bytes transferd | ||
| 741 | * | ||
| 742 | * This macro finish a DMA OUT operation. The out counter will be updated by | ||
| 743 | * the len parameter. No error checking will be done. | ||
| 744 | * | ||
| 745 | * Note that with only one concurrent reader and one concurrent | ||
| 746 | * writer, you don't need extra locking to use these macros. | ||
| 747 | */ | ||
| 748 | #define kfifo_dma_out_finish(fifo, len) \ | ||
| 749 | (void)({ \ | ||
| 750 | typeof((fifo) + 1) __tmp = (fifo); \ | ||
| 751 | unsigned int __len = (len); \ | ||
| 752 | const size_t __recsize = sizeof(*__tmp->rectype); \ | ||
| 753 | struct __kfifo *__kfifo = &__tmp->kfifo; \ | ||
| 754 | if (__recsize) \ | ||
| 755 | __kfifo_dma_out_finish_r(__kfifo, __recsize); \ | ||
| 756 | else \ | ||
| 757 | __kfifo->out += __len / sizeof(*__tmp->type); \ | ||
| 758 | }) | ||
| 405 | 759 | ||
| 406 | /** | 760 | /** |
| 407 | * kfifo_out_rec - gets some record data from the FIFO | 761 | * kfifo_out_peek - gets some data from the fifo |
| 408 | * @fifo: the fifo to be used. | 762 | * @fifo: address of the fifo to be used |
| 409 | * @to: where the data must be copied. | 763 | * @buf: pointer to the storage buffer |
| 410 | * @n: the size of the destination buffer. | 764 | * @n: max. number of elements to get |
| 411 | * @recsize: size of record field | ||
| 412 | * @total: pointer where the total number of to copied bytes should stored | ||
| 413 | * | 765 | * |
| 414 | * This function copies at most @n bytes from the FIFO to @to and returns the | 766 | * This macro get the data from the fifo and return the numbers of elements |
| 415 | * number of bytes which cannot be copied. | 767 | * copied. The data is not removed from the fifo. |
| 416 | * A returned value greater than the @n value means that the record doesn't | ||
| 417 | * fit into the @to buffer. | ||
| 418 | * | 768 | * |
| 419 | * Note that with only one concurrent reader and one concurrent | 769 | * Note that with only one concurrent reader and one concurrent |
| 420 | * writer, you don't need extra locking to use these functions. | 770 | * writer, you don't need extra locking to use these macro. |
| 421 | */ | 771 | */ |
| 422 | static inline __must_check unsigned int kfifo_out_rec(struct kfifo *fifo, | 772 | #define kfifo_out_peek(fifo, buf, n) \ |
| 423 | void *to, unsigned int n, unsigned int recsize, | 773 | __kfifo_uint_must_check_helper( \ |
| 424 | unsigned int *total) | 774 | ({ \ |
| 775 | typeof((fifo) + 1) __tmp = (fifo); \ | ||
| 776 | typeof((buf) + 1) __buf = (buf); \ | ||
| 777 | unsigned long __n = (n); \ | ||
| 778 | const size_t __recsize = sizeof(*__tmp->rectype); \ | ||
| 779 | struct __kfifo *__kfifo = &__tmp->kfifo; \ | ||
| 780 | if (0) { \ | ||
| 781 | typeof(__tmp->ptr) __dummy __attribute__ ((unused)) = NULL; \ | ||
| 782 | __buf = __dummy; \ | ||
| 783 | } \ | ||
| 784 | (__recsize) ? \ | ||
| 785 | __kfifo_out_peek_r(__kfifo, __buf, __n, __recsize) : \ | ||
| 786 | __kfifo_out_peek(__kfifo, __buf, __n); \ | ||
| 787 | }) \ | ||
| 788 | ) | ||
| 425 | 789 | ||
| 426 | { | 790 | extern int __kfifo_alloc(struct __kfifo *fifo, unsigned int size, |
| 427 | if (!__builtin_constant_p(recsize)) | 791 | size_t esize, gfp_t gfp_mask); |
| 428 | return __kfifo_out_generic(fifo, to, n, recsize, total); | ||
| 429 | return __kfifo_out_rec(fifo, to, n, recsize, total); | ||
| 430 | } | ||
| 431 | 792 | ||
| 432 | /* | 793 | extern void __kfifo_free(struct __kfifo *fifo); |
| 433 | * __kfifo_from_user_... internal functions for transfer from user space into | ||
| 434 | * the fifo. do not call it directly, use kfifo_from_user_rec() instead | ||
| 435 | */ | ||
| 436 | extern unsigned int __kfifo_from_user_n(struct kfifo *fifo, | ||
| 437 | const void __user *from, unsigned int n, unsigned int recsize); | ||
| 438 | 794 | ||
| 439 | extern unsigned int __kfifo_from_user_generic(struct kfifo *fifo, | 795 | extern int __kfifo_init(struct __kfifo *fifo, void *buffer, |
| 440 | const void __user *from, unsigned int n, unsigned int recsize); | 796 | unsigned int size, size_t esize); |
| 441 | 797 | ||
| 442 | static inline unsigned int __kfifo_from_user_rec(struct kfifo *fifo, | 798 | extern unsigned int __kfifo_in(struct __kfifo *fifo, |
| 443 | const void __user *from, unsigned int n, unsigned int recsize) | 799 | const void *buf, unsigned int len); |
| 444 | { | ||
| 445 | unsigned int ret; | ||
| 446 | 800 | ||
| 447 | ret = __kfifo_from_user_n(fifo, from, n, recsize); | 801 | extern unsigned int __kfifo_out(struct __kfifo *fifo, |
| 802 | void *buf, unsigned int len); | ||
| 448 | 803 | ||
| 449 | if (likely(ret == 0)) { | 804 | extern int __kfifo_from_user(struct __kfifo *fifo, |
| 450 | if (recsize) | 805 | const void __user *from, unsigned long len, unsigned int *copied); |
| 451 | __kfifo_poke_n(fifo, recsize, n); | ||
| 452 | __kfifo_add_in(fifo, n + recsize); | ||
| 453 | } | ||
| 454 | return ret; | ||
| 455 | } | ||
| 456 | 806 | ||
| 457 | /** | 807 | extern int __kfifo_to_user(struct __kfifo *fifo, |
| 458 | * kfifo_from_user_rec - puts some data from user space into the FIFO | 808 | void __user *to, unsigned long len, unsigned int *copied); |
| 459 | * @fifo: the fifo to be used. | ||
| 460 | * @from: pointer to the data to be added. | ||
| 461 | * @n: the length of the data to be added. | ||
| 462 | * @recsize: size of record field | ||
| 463 | * | ||
| 464 | * This function copies @n bytes from the @from into the | ||
| 465 | * FIFO and returns the number of bytes which cannot be copied. | ||
| 466 | * | ||
| 467 | * If the returned value is equal or less the @n value, the copy_from_user() | ||
| 468 | * functions has failed. Otherwise the record doesn't fit into the buffer. | ||
| 469 | * | ||
| 470 | * Note that with only one concurrent reader and one concurrent | ||
| 471 | * writer, you don't need extra locking to use these functions. | ||
| 472 | */ | ||
| 473 | static inline __must_check unsigned int kfifo_from_user_rec(struct kfifo *fifo, | ||
| 474 | const void __user *from, unsigned int n, unsigned int recsize) | ||
| 475 | { | ||
| 476 | if (!__builtin_constant_p(recsize)) | ||
| 477 | return __kfifo_from_user_generic(fifo, from, n, recsize); | ||
| 478 | return __kfifo_from_user_rec(fifo, from, n, recsize); | ||
| 479 | } | ||
| 480 | 809 | ||
| 481 | /* | 810 | extern unsigned int __kfifo_dma_in_prepare(struct __kfifo *fifo, |
| 482 | * __kfifo_to_user_... internal functions for transfer fifo data into user space | 811 | struct scatterlist *sgl, int nents, unsigned int len); |
| 483 | * do not call it directly, use kfifo_to_user_rec() instead | ||
| 484 | */ | ||
| 485 | extern unsigned int __kfifo_to_user_n(struct kfifo *fifo, | ||
| 486 | void __user *to, unsigned int n, unsigned int reclen, | ||
| 487 | unsigned int recsize); | ||
| 488 | 812 | ||
| 489 | extern unsigned int __kfifo_to_user_generic(struct kfifo *fifo, | 813 | extern unsigned int __kfifo_dma_out_prepare(struct __kfifo *fifo, |
| 490 | void __user *to, unsigned int n, unsigned int recsize, | 814 | struct scatterlist *sgl, int nents, unsigned int len); |
| 491 | unsigned int *total); | ||
| 492 | 815 | ||
| 493 | static inline unsigned int __kfifo_to_user_rec(struct kfifo *fifo, | 816 | extern unsigned int __kfifo_out_peek(struct __kfifo *fifo, |
| 494 | void __user *to, unsigned int n, | 817 | void *buf, unsigned int len); |
| 495 | unsigned int recsize, unsigned int *total) | ||
| 496 | { | ||
| 497 | unsigned int l; | ||
| 498 | |||
| 499 | if (!recsize) { | ||
| 500 | l = n; | ||
| 501 | if (total) | ||
| 502 | *total = l; | ||
| 503 | } else { | ||
| 504 | l = __kfifo_peek_n(fifo, recsize); | ||
| 505 | if (total) | ||
| 506 | *total = l; | ||
| 507 | if (n < l) | ||
| 508 | return l; | ||
| 509 | } | ||
| 510 | 818 | ||
| 511 | return __kfifo_to_user_n(fifo, to, n, l, recsize); | 819 | extern unsigned int __kfifo_in_r(struct __kfifo *fifo, |
| 512 | } | 820 | const void *buf, unsigned int len, size_t recsize); |
| 513 | 821 | ||
| 514 | /** | 822 | extern unsigned int __kfifo_out_r(struct __kfifo *fifo, |
| 515 | * kfifo_to_user_rec - gets data from the FIFO and write it to user space | 823 | void *buf, unsigned int len, size_t recsize); |
| 516 | * @fifo: the fifo to be used. | ||
| 517 | * @to: where the data must be copied. | ||
| 518 | * @n: the size of the destination buffer. | ||
| 519 | * @recsize: size of record field | ||
| 520 | * @total: pointer where the total number of to copied bytes should stored | ||
| 521 | * | ||
| 522 | * This function copies at most @n bytes from the FIFO to the @to. | ||
| 523 | * In case of an error, the function returns the number of bytes which cannot | ||
| 524 | * be copied. | ||
| 525 | * If the returned value is equal or less the @n value, the copy_to_user() | ||
| 526 | * functions has failed. Otherwise the record doesn't fit into the @to buffer. | ||
| 527 | * | ||
| 528 | * Note that with only one concurrent reader and one concurrent | ||
| 529 | * writer, you don't need extra locking to use these functions. | ||
| 530 | */ | ||
| 531 | static inline __must_check unsigned int kfifo_to_user_rec(struct kfifo *fifo, | ||
| 532 | void __user *to, unsigned int n, unsigned int recsize, | ||
| 533 | unsigned int *total) | ||
| 534 | { | ||
| 535 | if (!__builtin_constant_p(recsize)) | ||
| 536 | return __kfifo_to_user_generic(fifo, to, n, recsize, total); | ||
| 537 | return __kfifo_to_user_rec(fifo, to, n, recsize, total); | ||
| 538 | } | ||
| 539 | 824 | ||
| 540 | /* | 825 | extern int __kfifo_from_user_r(struct __kfifo *fifo, |
| 541 | * __kfifo_peek_... internal functions for peek into the next fifo record | 826 | const void __user *from, unsigned long len, unsigned int *copied, |
| 542 | * do not call it directly, use kfifo_peek_rec() instead | 827 | size_t recsize); |
| 543 | */ | ||
| 544 | extern unsigned int __kfifo_peek_generic(struct kfifo *fifo, | ||
| 545 | unsigned int recsize); | ||
| 546 | 828 | ||
| 547 | /** | 829 | extern int __kfifo_to_user_r(struct __kfifo *fifo, void __user *to, |
| 548 | * kfifo_peek_rec - gets the size of the next FIFO record data | 830 | unsigned long len, unsigned int *copied, size_t recsize); |
| 549 | * @fifo: the fifo to be used. | ||
| 550 | * @recsize: size of record field | ||
| 551 | * | ||
| 552 | * This function returns the size of the next FIFO record in number of bytes | ||
| 553 | */ | ||
| 554 | static inline __must_check unsigned int kfifo_peek_rec(struct kfifo *fifo, | ||
| 555 | unsigned int recsize) | ||
| 556 | { | ||
| 557 | if (!__builtin_constant_p(recsize)) | ||
| 558 | return __kfifo_peek_generic(fifo, recsize); | ||
| 559 | if (!recsize) | ||
| 560 | return kfifo_len(fifo); | ||
| 561 | return __kfifo_peek_n(fifo, recsize); | ||
| 562 | } | ||
| 563 | 831 | ||
| 564 | /* | 832 | extern unsigned int __kfifo_dma_in_prepare_r(struct __kfifo *fifo, |
| 565 | * __kfifo_skip_... internal functions for skip the next fifo record | 833 | struct scatterlist *sgl, int nents, unsigned int len, size_t recsize); |
| 566 | * do not call it directly, use kfifo_skip_rec() instead | ||
| 567 | */ | ||
| 568 | extern void __kfifo_skip_generic(struct kfifo *fifo, unsigned int recsize); | ||
| 569 | 834 | ||
| 570 | static inline void __kfifo_skip_rec(struct kfifo *fifo, | 835 | extern void __kfifo_dma_in_finish_r(struct __kfifo *fifo, |
| 571 | unsigned int recsize) | 836 | unsigned int len, size_t recsize); |
| 572 | { | ||
| 573 | unsigned int l; | ||
| 574 | 837 | ||
| 575 | if (recsize) { | 838 | extern unsigned int __kfifo_dma_out_prepare_r(struct __kfifo *fifo, |
| 576 | l = __kfifo_peek_n(fifo, recsize); | 839 | struct scatterlist *sgl, int nents, unsigned int len, size_t recsize); |
| 577 | 840 | ||
| 578 | if (l + recsize <= kfifo_len(fifo)) { | 841 | extern void __kfifo_dma_out_finish_r(struct __kfifo *fifo, size_t recsize); |
| 579 | __kfifo_add_out(fifo, l + recsize); | ||
| 580 | return; | ||
| 581 | } | ||
| 582 | } | ||
| 583 | kfifo_reset_out(fifo); | ||
| 584 | } | ||
| 585 | 842 | ||
| 586 | /** | 843 | extern unsigned int __kfifo_len_r(struct __kfifo *fifo, size_t recsize); |
| 587 | * kfifo_skip_rec - skip the next fifo out record | ||
| 588 | * @fifo: the fifo to be used. | ||
| 589 | * @recsize: size of record field | ||
| 590 | * | ||
| 591 | * This function skips the next FIFO record | ||
| 592 | */ | ||
| 593 | static inline void kfifo_skip_rec(struct kfifo *fifo, | ||
| 594 | unsigned int recsize) | ||
| 595 | { | ||
| 596 | if (!__builtin_constant_p(recsize)) | ||
| 597 | __kfifo_skip_generic(fifo, recsize); | ||
| 598 | else | ||
| 599 | __kfifo_skip_rec(fifo, recsize); | ||
| 600 | } | ||
| 601 | 844 | ||
| 602 | /** | 845 | extern void __kfifo_skip_r(struct __kfifo *fifo, size_t recsize); |
| 603 | * kfifo_avail_rec - returns the number of bytes available in a record FIFO | ||
| 604 | * @fifo: the fifo to be used. | ||
| 605 | * @recsize: size of record field | ||
| 606 | */ | ||
| 607 | static inline __must_check unsigned int kfifo_avail_rec(struct kfifo *fifo, | ||
| 608 | unsigned int recsize) | ||
| 609 | { | ||
| 610 | unsigned int l = kfifo_size(fifo) - kfifo_len(fifo); | ||
| 611 | 846 | ||
| 612 | return (l > recsize) ? l - recsize : 0; | 847 | extern unsigned int __kfifo_out_peek_r(struct __kfifo *fifo, |
| 613 | } | 848 | void *buf, unsigned int len, size_t recsize); |
| 849 | |||
| 850 | extern unsigned int __kfifo_max_r(unsigned int len, size_t recsize); | ||
| 614 | 851 | ||
| 615 | #endif | 852 | #endif |
diff --git a/include/linux/kgdb.h b/include/linux/kgdb.h index 9340f34d1bb5..cc96f0f23e04 100644 --- a/include/linux/kgdb.h +++ b/include/linux/kgdb.h | |||
| @@ -90,6 +90,19 @@ struct kgdb_bkpt { | |||
| 90 | enum kgdb_bpstate state; | 90 | enum kgdb_bpstate state; |
| 91 | }; | 91 | }; |
| 92 | 92 | ||
| 93 | struct dbg_reg_def_t { | ||
| 94 | char *name; | ||
| 95 | int size; | ||
| 96 | int offset; | ||
| 97 | }; | ||
| 98 | |||
| 99 | #ifndef DBG_MAX_REG_NUM | ||
| 100 | #define DBG_MAX_REG_NUM 0 | ||
| 101 | #else | ||
| 102 | extern struct dbg_reg_def_t dbg_reg_def[]; | ||
| 103 | extern char *dbg_get_reg(int regno, void *mem, struct pt_regs *regs); | ||
| 104 | extern int dbg_set_reg(int regno, void *mem, struct pt_regs *regs); | ||
| 105 | #endif | ||
| 93 | #ifndef KGDB_MAX_BREAKPOINTS | 106 | #ifndef KGDB_MAX_BREAKPOINTS |
| 94 | # define KGDB_MAX_BREAKPOINTS 1000 | 107 | # define KGDB_MAX_BREAKPOINTS 1000 |
| 95 | #endif | 108 | #endif |
| @@ -281,7 +294,7 @@ extern void kgdb_unregister_io_module(struct kgdb_io *local_kgdb_io_ops); | |||
| 281 | extern struct kgdb_io *dbg_io_ops; | 294 | extern struct kgdb_io *dbg_io_ops; |
| 282 | 295 | ||
| 283 | extern int kgdb_hex2long(char **ptr, unsigned long *long_val); | 296 | extern int kgdb_hex2long(char **ptr, unsigned long *long_val); |
| 284 | extern int kgdb_mem2hex(char *mem, char *buf, int count); | 297 | extern char *kgdb_mem2hex(char *mem, char *buf, int count); |
| 285 | extern int kgdb_hex2mem(char *buf, char *mem, int count); | 298 | extern int kgdb_hex2mem(char *buf, char *mem, int count); |
| 286 | 299 | ||
| 287 | extern int kgdb_isremovedbreak(unsigned long addr); | 300 | extern int kgdb_isremovedbreak(unsigned long addr); |
diff --git a/include/linux/kmemtrace.h b/include/linux/kmemtrace.h deleted file mode 100644 index b616d3930c3b..000000000000 --- a/include/linux/kmemtrace.h +++ /dev/null | |||
| @@ -1,25 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2008 Eduard - Gabriel Munteanu | ||
| 3 | * | ||
| 4 | * This file is released under GPL version 2. | ||
| 5 | */ | ||
| 6 | |||
| 7 | #ifndef _LINUX_KMEMTRACE_H | ||
| 8 | #define _LINUX_KMEMTRACE_H | ||
| 9 | |||
| 10 | #ifdef __KERNEL__ | ||
| 11 | |||
| 12 | #include <trace/events/kmem.h> | ||
| 13 | |||
| 14 | #ifdef CONFIG_KMEMTRACE | ||
| 15 | extern void kmemtrace_init(void); | ||
| 16 | #else | ||
| 17 | static inline void kmemtrace_init(void) | ||
| 18 | { | ||
| 19 | } | ||
| 20 | #endif | ||
| 21 | |||
| 22 | #endif /* __KERNEL__ */ | ||
| 23 | |||
| 24 | #endif /* _LINUX_KMEMTRACE_H */ | ||
| 25 | |||
diff --git a/include/linux/kobject.h b/include/linux/kobject.h index cf343a852534..8f6d12151048 100644 --- a/include/linux/kobject.h +++ b/include/linux/kobject.h | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | #include <linux/compiler.h> | 22 | #include <linux/compiler.h> |
| 23 | #include <linux/spinlock.h> | 23 | #include <linux/spinlock.h> |
| 24 | #include <linux/kref.h> | 24 | #include <linux/kref.h> |
| 25 | #include <linux/kobject_ns.h> | ||
| 25 | #include <linux/kernel.h> | 26 | #include <linux/kernel.h> |
| 26 | #include <linux/wait.h> | 27 | #include <linux/wait.h> |
| 27 | #include <asm/atomic.h> | 28 | #include <asm/atomic.h> |
| @@ -136,42 +137,8 @@ struct kobj_attribute { | |||
| 136 | 137 | ||
| 137 | extern const struct sysfs_ops kobj_sysfs_ops; | 138 | extern const struct sysfs_ops kobj_sysfs_ops; |
| 138 | 139 | ||
| 139 | /* | ||
| 140 | * Namespace types which are used to tag kobjects and sysfs entries. | ||
| 141 | * Network namespace will likely be the first. | ||
| 142 | */ | ||
| 143 | enum kobj_ns_type { | ||
| 144 | KOBJ_NS_TYPE_NONE = 0, | ||
| 145 | KOBJ_NS_TYPE_NET, | ||
| 146 | KOBJ_NS_TYPES | ||
| 147 | }; | ||
| 148 | |||
| 149 | struct sock; | 140 | struct sock; |
| 150 | 141 | ||
| 151 | /* | ||
| 152 | * Callbacks so sysfs can determine namespaces | ||
| 153 | * @current_ns: return calling task's namespace | ||
| 154 | * @netlink_ns: return namespace to which a sock belongs (right?) | ||
| 155 | * @initial_ns: return the initial namespace (i.e. init_net_ns) | ||
| 156 | */ | ||
| 157 | struct kobj_ns_type_operations { | ||
| 158 | enum kobj_ns_type type; | ||
| 159 | const void *(*current_ns)(void); | ||
| 160 | const void *(*netlink_ns)(struct sock *sk); | ||
| 161 | const void *(*initial_ns)(void); | ||
| 162 | }; | ||
| 163 | |||
| 164 | int kobj_ns_type_register(const struct kobj_ns_type_operations *ops); | ||
| 165 | int kobj_ns_type_registered(enum kobj_ns_type type); | ||
| 166 | const struct kobj_ns_type_operations *kobj_child_ns_ops(struct kobject *parent); | ||
| 167 | const struct kobj_ns_type_operations *kobj_ns_ops(struct kobject *kobj); | ||
| 168 | |||
| 169 | const void *kobj_ns_current(enum kobj_ns_type type); | ||
| 170 | const void *kobj_ns_netlink(enum kobj_ns_type type, struct sock *sk); | ||
| 171 | const void *kobj_ns_initial(enum kobj_ns_type type); | ||
| 172 | void kobj_ns_exit(enum kobj_ns_type type, const void *ns); | ||
| 173 | |||
| 174 | |||
| 175 | /** | 142 | /** |
| 176 | * struct kset - a set of kobjects of a specific type, belonging to a specific subsystem. | 143 | * struct kset - a set of kobjects of a specific type, belonging to a specific subsystem. |
| 177 | * | 144 | * |
| @@ -224,6 +191,8 @@ static inline struct kobj_type *get_ktype(struct kobject *kobj) | |||
| 224 | } | 191 | } |
| 225 | 192 | ||
| 226 | extern struct kobject *kset_find_obj(struct kset *, const char *); | 193 | extern struct kobject *kset_find_obj(struct kset *, const char *); |
| 194 | extern struct kobject *kset_find_obj_hinted(struct kset *, const char *, | ||
| 195 | struct kobject *); | ||
| 227 | 196 | ||
| 228 | /* The global /sys/kernel/ kobject for people to chain off of */ | 197 | /* The global /sys/kernel/ kobject for people to chain off of */ |
| 229 | extern struct kobject *kernel_kobj; | 198 | extern struct kobject *kernel_kobj; |
diff --git a/include/linux/kobject_ns.h b/include/linux/kobject_ns.h new file mode 100644 index 000000000000..82cb5bf461fb --- /dev/null +++ b/include/linux/kobject_ns.h | |||
| @@ -0,0 +1,56 @@ | |||
| 1 | /* Kernel object name space definitions | ||
| 2 | * | ||
| 3 | * Copyright (c) 2002-2003 Patrick Mochel | ||
| 4 | * Copyright (c) 2002-2003 Open Source Development Labs | ||
| 5 | * Copyright (c) 2006-2008 Greg Kroah-Hartman <greg@kroah.com> | ||
| 6 | * Copyright (c) 2006-2008 Novell Inc. | ||
| 7 | * | ||
| 8 | * Split from kobject.h by David Howells (dhowells@redhat.com) | ||
| 9 | * | ||
| 10 | * This file is released under the GPLv2. | ||
| 11 | * | ||
| 12 | * Please read Documentation/kobject.txt before using the kobject | ||
| 13 | * interface, ESPECIALLY the parts about reference counts and object | ||
| 14 | * destructors. | ||
| 15 | */ | ||
| 16 | |||
| 17 | #ifndef _LINUX_KOBJECT_NS_H | ||
| 18 | #define _LINUX_KOBJECT_NS_H | ||
| 19 | |||
| 20 | struct sock; | ||
| 21 | struct kobject; | ||
| 22 | |||
| 23 | /* | ||
| 24 | * Namespace types which are used to tag kobjects and sysfs entries. | ||
| 25 | * Network namespace will likely be the first. | ||
| 26 | */ | ||
| 27 | enum kobj_ns_type { | ||
| 28 | KOBJ_NS_TYPE_NONE = 0, | ||
| 29 | KOBJ_NS_TYPE_NET, | ||
| 30 | KOBJ_NS_TYPES | ||
| 31 | }; | ||
| 32 | |||
| 33 | /* | ||
| 34 | * Callbacks so sysfs can determine namespaces | ||
| 35 | * @current_ns: return calling task's namespace | ||
| 36 | * @netlink_ns: return namespace to which a sock belongs (right?) | ||
| 37 | * @initial_ns: return the initial namespace (i.e. init_net_ns) | ||
| 38 | */ | ||
| 39 | struct kobj_ns_type_operations { | ||
| 40 | enum kobj_ns_type type; | ||
| 41 | const void *(*current_ns)(void); | ||
| 42 | const void *(*netlink_ns)(struct sock *sk); | ||
| 43 | const void *(*initial_ns)(void); | ||
| 44 | }; | ||
| 45 | |||
| 46 | int kobj_ns_type_register(const struct kobj_ns_type_operations *ops); | ||
| 47 | int kobj_ns_type_registered(enum kobj_ns_type type); | ||
| 48 | const struct kobj_ns_type_operations *kobj_child_ns_ops(struct kobject *parent); | ||
| 49 | const struct kobj_ns_type_operations *kobj_ns_ops(struct kobject *kobj); | ||
| 50 | |||
| 51 | const void *kobj_ns_current(enum kobj_ns_type type); | ||
| 52 | const void *kobj_ns_netlink(enum kobj_ns_type type, struct sock *sk); | ||
| 53 | const void *kobj_ns_initial(enum kobj_ns_type type); | ||
| 54 | void kobj_ns_exit(enum kobj_ns_type type, const void *ns); | ||
| 55 | |||
| 56 | #endif /* _LINUX_KOBJECT_NS_H */ | ||
diff --git a/include/linux/ks8842.h b/include/linux/ks8842.h index da0341b8ca0a..14ba4452296e 100644 --- a/include/linux/ks8842.h +++ b/include/linux/ks8842.h | |||
| @@ -25,10 +25,14 @@ | |||
| 25 | * struct ks8842_platform_data - Platform data of the KS8842 network driver | 25 | * struct ks8842_platform_data - Platform data of the KS8842 network driver |
| 26 | * @macaddr: The MAC address of the device, set to all 0:s to use the on in | 26 | * @macaddr: The MAC address of the device, set to all 0:s to use the on in |
| 27 | * the chip. | 27 | * the chip. |
| 28 | * @rx_dma_channel: The DMA channel to use for RX, -1 for none. | ||
| 29 | * @tx_dma_channel: The DMA channel to use for TX, -1 for none. | ||
| 28 | * | 30 | * |
| 29 | */ | 31 | */ |
| 30 | struct ks8842_platform_data { | 32 | struct ks8842_platform_data { |
| 31 | u8 macaddr[ETH_ALEN]; | 33 | u8 macaddr[ETH_ALEN]; |
| 34 | int rx_dma_channel; | ||
| 35 | int tx_dma_channel; | ||
| 32 | }; | 36 | }; |
| 33 | 37 | ||
| 34 | #endif | 38 | #endif |
diff --git a/include/linux/ksm.h b/include/linux/ksm.h index 43bdab769fc3..3319a6967626 100644 --- a/include/linux/ksm.h +++ b/include/linux/ksm.h | |||
| @@ -16,6 +16,9 @@ | |||
| 16 | struct stable_node; | 16 | struct stable_node; |
| 17 | struct mem_cgroup; | 17 | struct mem_cgroup; |
| 18 | 18 | ||
| 19 | struct page *ksm_does_need_to_copy(struct page *page, | ||
| 20 | struct vm_area_struct *vma, unsigned long address); | ||
| 21 | |||
| 19 | #ifdef CONFIG_KSM | 22 | #ifdef CONFIG_KSM |
| 20 | int ksm_madvise(struct vm_area_struct *vma, unsigned long start, | 23 | int ksm_madvise(struct vm_area_struct *vma, unsigned long start, |
| 21 | unsigned long end, int advice, unsigned long *vm_flags); | 24 | unsigned long end, int advice, unsigned long *vm_flags); |
| @@ -70,19 +73,14 @@ static inline void set_page_stable_node(struct page *page, | |||
| 70 | * We'd like to make this conditional on vma->vm_flags & VM_MERGEABLE, | 73 | * We'd like to make this conditional on vma->vm_flags & VM_MERGEABLE, |
| 71 | * but what if the vma was unmerged while the page was swapped out? | 74 | * but what if the vma was unmerged while the page was swapped out? |
| 72 | */ | 75 | */ |
| 73 | struct page *ksm_does_need_to_copy(struct page *page, | 76 | static inline int ksm_might_need_to_copy(struct page *page, |
| 74 | struct vm_area_struct *vma, unsigned long address); | ||
| 75 | static inline struct page *ksm_might_need_to_copy(struct page *page, | ||
| 76 | struct vm_area_struct *vma, unsigned long address) | 77 | struct vm_area_struct *vma, unsigned long address) |
| 77 | { | 78 | { |
| 78 | struct anon_vma *anon_vma = page_anon_vma(page); | 79 | struct anon_vma *anon_vma = page_anon_vma(page); |
| 79 | 80 | ||
| 80 | if (!anon_vma || | 81 | return anon_vma && |
| 81 | (anon_vma == vma->anon_vma && | 82 | (anon_vma->root != vma->anon_vma->root || |
| 82 | page->index == linear_page_index(vma, address))) | 83 | page->index != linear_page_index(vma, address)); |
| 83 | return page; | ||
| 84 | |||
| 85 | return ksm_does_need_to_copy(page, vma, address); | ||
| 86 | } | 84 | } |
| 87 | 85 | ||
| 88 | int page_referenced_ksm(struct page *page, | 86 | int page_referenced_ksm(struct page *page, |
| @@ -115,10 +113,10 @@ static inline int ksm_madvise(struct vm_area_struct *vma, unsigned long start, | |||
| 115 | return 0; | 113 | return 0; |
| 116 | } | 114 | } |
| 117 | 115 | ||
| 118 | static inline struct page *ksm_might_need_to_copy(struct page *page, | 116 | static inline int ksm_might_need_to_copy(struct page *page, |
| 119 | struct vm_area_struct *vma, unsigned long address) | 117 | struct vm_area_struct *vma, unsigned long address) |
| 120 | { | 118 | { |
| 121 | return page; | 119 | return 0; |
| 122 | } | 120 | } |
| 123 | 121 | ||
| 124 | static inline int page_referenced_ksm(struct page *page, | 122 | static inline int page_referenced_ksm(struct page *page, |
diff --git a/include/linux/kthread.h b/include/linux/kthread.h index aabc8a13ba71..685ea65eb803 100644 --- a/include/linux/kthread.h +++ b/include/linux/kthread.h | |||
| @@ -30,8 +30,73 @@ struct task_struct *kthread_create(int (*threadfn)(void *data), | |||
| 30 | void kthread_bind(struct task_struct *k, unsigned int cpu); | 30 | void kthread_bind(struct task_struct *k, unsigned int cpu); |
| 31 | int kthread_stop(struct task_struct *k); | 31 | int kthread_stop(struct task_struct *k); |
| 32 | int kthread_should_stop(void); | 32 | int kthread_should_stop(void); |
| 33 | void *kthread_data(struct task_struct *k); | ||
| 33 | 34 | ||
| 34 | int kthreadd(void *unused); | 35 | int kthreadd(void *unused); |
| 35 | extern struct task_struct *kthreadd_task; | 36 | extern struct task_struct *kthreadd_task; |
| 36 | 37 | ||
| 38 | /* | ||
| 39 | * Simple work processor based on kthread. | ||
| 40 | * | ||
| 41 | * This provides easier way to make use of kthreads. A kthread_work | ||
| 42 | * can be queued and flushed using queue/flush_kthread_work() | ||
| 43 | * respectively. Queued kthread_works are processed by a kthread | ||
| 44 | * running kthread_worker_fn(). | ||
| 45 | * | ||
| 46 | * A kthread_work can't be freed while it is executing. | ||
| 47 | */ | ||
| 48 | struct kthread_work; | ||
| 49 | typedef void (*kthread_work_func_t)(struct kthread_work *work); | ||
| 50 | |||
| 51 | struct kthread_worker { | ||
| 52 | spinlock_t lock; | ||
| 53 | struct list_head work_list; | ||
| 54 | struct task_struct *task; | ||
| 55 | }; | ||
| 56 | |||
| 57 | struct kthread_work { | ||
| 58 | struct list_head node; | ||
| 59 | kthread_work_func_t func; | ||
| 60 | wait_queue_head_t done; | ||
| 61 | atomic_t flushing; | ||
| 62 | int queue_seq; | ||
| 63 | int done_seq; | ||
| 64 | }; | ||
| 65 | |||
| 66 | #define KTHREAD_WORKER_INIT(worker) { \ | ||
| 67 | .lock = SPIN_LOCK_UNLOCKED, \ | ||
| 68 | .work_list = LIST_HEAD_INIT((worker).work_list), \ | ||
| 69 | } | ||
| 70 | |||
| 71 | #define KTHREAD_WORK_INIT(work, fn) { \ | ||
| 72 | .node = LIST_HEAD_INIT((work).node), \ | ||
| 73 | .func = (fn), \ | ||
| 74 | .done = __WAIT_QUEUE_HEAD_INITIALIZER((work).done), \ | ||
| 75 | .flushing = ATOMIC_INIT(0), \ | ||
| 76 | } | ||
| 77 | |||
| 78 | #define DEFINE_KTHREAD_WORKER(worker) \ | ||
| 79 | struct kthread_worker worker = KTHREAD_WORKER_INIT(worker) | ||
| 80 | |||
| 81 | #define DEFINE_KTHREAD_WORK(work, fn) \ | ||
| 82 | struct kthread_work work = KTHREAD_WORK_INIT(work, fn) | ||
| 83 | |||
| 84 | static inline void init_kthread_worker(struct kthread_worker *worker) | ||
| 85 | { | ||
| 86 | *worker = (struct kthread_worker)KTHREAD_WORKER_INIT(*worker); | ||
| 87 | } | ||
| 88 | |||
| 89 | static inline void init_kthread_work(struct kthread_work *work, | ||
| 90 | kthread_work_func_t fn) | ||
| 91 | { | ||
| 92 | *work = (struct kthread_work)KTHREAD_WORK_INIT(*work, fn); | ||
| 93 | } | ||
| 94 | |||
| 95 | int kthread_worker_fn(void *worker_ptr); | ||
| 96 | |||
| 97 | bool queue_kthread_work(struct kthread_worker *worker, | ||
| 98 | struct kthread_work *work); | ||
| 99 | void flush_kthread_work(struct kthread_work *work); | ||
| 100 | void flush_kthread_worker(struct kthread_worker *worker); | ||
| 101 | |||
| 37 | #endif /* _LINUX_KTHREAD_H */ | 102 | #endif /* _LINUX_KTHREAD_H */ |
diff --git a/include/linux/kvm.h b/include/linux/kvm.h index 23ea02253900..919ae53adc5c 100644 --- a/include/linux/kvm.h +++ b/include/linux/kvm.h | |||
| @@ -414,6 +414,14 @@ struct kvm_enable_cap { | |||
| 414 | __u8 pad[64]; | 414 | __u8 pad[64]; |
| 415 | }; | 415 | }; |
| 416 | 416 | ||
| 417 | /* for KVM_PPC_GET_PVINFO */ | ||
| 418 | struct kvm_ppc_pvinfo { | ||
| 419 | /* out */ | ||
| 420 | __u32 flags; | ||
| 421 | __u32 hcall[4]; | ||
| 422 | __u8 pad[108]; | ||
| 423 | }; | ||
| 424 | |||
| 417 | #define KVMIO 0xAE | 425 | #define KVMIO 0xAE |
| 418 | 426 | ||
| 419 | /* | 427 | /* |
| @@ -524,6 +532,14 @@ struct kvm_enable_cap { | |||
| 524 | #define KVM_CAP_PPC_OSI 52 | 532 | #define KVM_CAP_PPC_OSI 52 |
| 525 | #define KVM_CAP_PPC_UNSET_IRQ 53 | 533 | #define KVM_CAP_PPC_UNSET_IRQ 53 |
| 526 | #define KVM_CAP_ENABLE_CAP 54 | 534 | #define KVM_CAP_ENABLE_CAP 54 |
| 535 | #ifdef __KVM_HAVE_XSAVE | ||
| 536 | #define KVM_CAP_XSAVE 55 | ||
| 537 | #endif | ||
| 538 | #ifdef __KVM_HAVE_XCRS | ||
| 539 | #define KVM_CAP_XCRS 56 | ||
| 540 | #endif | ||
| 541 | #define KVM_CAP_PPC_GET_PVINFO 57 | ||
| 542 | #define KVM_CAP_PPC_IRQ_LEVEL 58 | ||
| 527 | 543 | ||
| 528 | #ifdef KVM_CAP_IRQ_ROUTING | 544 | #ifdef KVM_CAP_IRQ_ROUTING |
| 529 | 545 | ||
| @@ -613,6 +629,7 @@ struct kvm_clock_data { | |||
| 613 | */ | 629 | */ |
| 614 | #define KVM_CREATE_VCPU _IO(KVMIO, 0x41) | 630 | #define KVM_CREATE_VCPU _IO(KVMIO, 0x41) |
| 615 | #define KVM_GET_DIRTY_LOG _IOW(KVMIO, 0x42, struct kvm_dirty_log) | 631 | #define KVM_GET_DIRTY_LOG _IOW(KVMIO, 0x42, struct kvm_dirty_log) |
| 632 | /* KVM_SET_MEMORY_ALIAS is obsolete: */ | ||
| 616 | #define KVM_SET_MEMORY_ALIAS _IOW(KVMIO, 0x43, struct kvm_memory_alias) | 633 | #define KVM_SET_MEMORY_ALIAS _IOW(KVMIO, 0x43, struct kvm_memory_alias) |
| 617 | #define KVM_SET_NR_MMU_PAGES _IO(KVMIO, 0x44) | 634 | #define KVM_SET_NR_MMU_PAGES _IO(KVMIO, 0x44) |
| 618 | #define KVM_GET_NR_MMU_PAGES _IO(KVMIO, 0x45) | 635 | #define KVM_GET_NR_MMU_PAGES _IO(KVMIO, 0x45) |
| @@ -657,6 +674,8 @@ struct kvm_clock_data { | |||
| 657 | /* Available with KVM_CAP_PIT_STATE2 */ | 674 | /* Available with KVM_CAP_PIT_STATE2 */ |
| 658 | #define KVM_GET_PIT2 _IOR(KVMIO, 0x9f, struct kvm_pit_state2) | 675 | #define KVM_GET_PIT2 _IOR(KVMIO, 0x9f, struct kvm_pit_state2) |
| 659 | #define KVM_SET_PIT2 _IOW(KVMIO, 0xa0, struct kvm_pit_state2) | 676 | #define KVM_SET_PIT2 _IOW(KVMIO, 0xa0, struct kvm_pit_state2) |
| 677 | /* Available with KVM_CAP_PPC_GET_PVINFO */ | ||
| 678 | #define KVM_PPC_GET_PVINFO _IOW(KVMIO, 0xa1, struct kvm_ppc_pvinfo) | ||
| 660 | 679 | ||
| 661 | /* | 680 | /* |
| 662 | * ioctls for vcpu fds | 681 | * ioctls for vcpu fds |
| @@ -714,6 +733,12 @@ struct kvm_clock_data { | |||
| 714 | #define KVM_GET_DEBUGREGS _IOR(KVMIO, 0xa1, struct kvm_debugregs) | 733 | #define KVM_GET_DEBUGREGS _IOR(KVMIO, 0xa1, struct kvm_debugregs) |
| 715 | #define KVM_SET_DEBUGREGS _IOW(KVMIO, 0xa2, struct kvm_debugregs) | 734 | #define KVM_SET_DEBUGREGS _IOW(KVMIO, 0xa2, struct kvm_debugregs) |
| 716 | #define KVM_ENABLE_CAP _IOW(KVMIO, 0xa3, struct kvm_enable_cap) | 735 | #define KVM_ENABLE_CAP _IOW(KVMIO, 0xa3, struct kvm_enable_cap) |
| 736 | /* Available with KVM_CAP_XSAVE */ | ||
| 737 | #define KVM_GET_XSAVE _IOR(KVMIO, 0xa4, struct kvm_xsave) | ||
| 738 | #define KVM_SET_XSAVE _IOW(KVMIO, 0xa5, struct kvm_xsave) | ||
| 739 | /* Available with KVM_CAP_XCRS */ | ||
| 740 | #define KVM_GET_XCRS _IOR(KVMIO, 0xa6, struct kvm_xcrs) | ||
| 741 | #define KVM_SET_XCRS _IOW(KVMIO, 0xa7, struct kvm_xcrs) | ||
| 717 | 742 | ||
| 718 | #define KVM_DEV_ASSIGN_ENABLE_IOMMU (1 << 0) | 743 | #define KVM_DEV_ASSIGN_ENABLE_IOMMU (1 << 0) |
| 719 | 744 | ||
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 7cb116afa1cd..a0557422715e 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h | |||
| @@ -36,9 +36,10 @@ | |||
| 36 | #define KVM_REQ_PENDING_TIMER 5 | 36 | #define KVM_REQ_PENDING_TIMER 5 |
| 37 | #define KVM_REQ_UNHALT 6 | 37 | #define KVM_REQ_UNHALT 6 |
| 38 | #define KVM_REQ_MMU_SYNC 7 | 38 | #define KVM_REQ_MMU_SYNC 7 |
| 39 | #define KVM_REQ_KVMCLOCK_UPDATE 8 | 39 | #define KVM_REQ_CLOCK_UPDATE 8 |
| 40 | #define KVM_REQ_KICK 9 | 40 | #define KVM_REQ_KICK 9 |
| 41 | #define KVM_REQ_DEACTIVATE_FPU 10 | 41 | #define KVM_REQ_DEACTIVATE_FPU 10 |
| 42 | #define KVM_REQ_EVENT 11 | ||
| 42 | 43 | ||
| 43 | #define KVM_USERSPACE_IRQ_SOURCE_ID 0 | 44 | #define KVM_USERSPACE_IRQ_SOURCE_ID 0 |
| 44 | 45 | ||
| @@ -81,13 +82,14 @@ struct kvm_vcpu { | |||
| 81 | int vcpu_id; | 82 | int vcpu_id; |
| 82 | struct mutex mutex; | 83 | struct mutex mutex; |
| 83 | int cpu; | 84 | int cpu; |
| 85 | atomic_t guest_mode; | ||
| 84 | struct kvm_run *run; | 86 | struct kvm_run *run; |
| 85 | unsigned long requests; | 87 | unsigned long requests; |
| 86 | unsigned long guest_debug; | 88 | unsigned long guest_debug; |
| 87 | int srcu_idx; | 89 | int srcu_idx; |
| 88 | 90 | ||
| 89 | int fpu_active; | 91 | int fpu_active; |
| 90 | int guest_fpu_loaded; | 92 | int guest_fpu_loaded, guest_xcr0_loaded; |
| 91 | wait_queue_head_t wq; | 93 | wait_queue_head_t wq; |
| 92 | int sigset_active; | 94 | int sigset_active; |
| 93 | sigset_t sigset; | 95 | sigset_t sigset; |
| @@ -123,6 +125,7 @@ struct kvm_memory_slot { | |||
| 123 | } *lpage_info[KVM_NR_PAGE_SIZES - 1]; | 125 | } *lpage_info[KVM_NR_PAGE_SIZES - 1]; |
| 124 | unsigned long userspace_addr; | 126 | unsigned long userspace_addr; |
| 125 | int user_alloc; | 127 | int user_alloc; |
| 128 | int id; | ||
| 126 | }; | 129 | }; |
| 127 | 130 | ||
| 128 | static inline unsigned long kvm_dirty_bitmap_bytes(struct kvm_memory_slot *memslot) | 131 | static inline unsigned long kvm_dirty_bitmap_bytes(struct kvm_memory_slot *memslot) |
| @@ -203,7 +206,7 @@ struct kvm { | |||
| 203 | 206 | ||
| 204 | struct mutex irq_lock; | 207 | struct mutex irq_lock; |
| 205 | #ifdef CONFIG_HAVE_KVM_IRQCHIP | 208 | #ifdef CONFIG_HAVE_KVM_IRQCHIP |
| 206 | struct kvm_irq_routing_table *irq_routing; | 209 | struct kvm_irq_routing_table __rcu *irq_routing; |
| 207 | struct hlist_head mask_notifier_list; | 210 | struct hlist_head mask_notifier_list; |
| 208 | struct hlist_head irq_ack_notifier_list; | 211 | struct hlist_head irq_ack_notifier_list; |
| 209 | #endif | 212 | #endif |
| @@ -266,6 +269,8 @@ extern pfn_t bad_pfn; | |||
| 266 | 269 | ||
| 267 | int is_error_page(struct page *page); | 270 | int is_error_page(struct page *page); |
| 268 | int is_error_pfn(pfn_t pfn); | 271 | int is_error_pfn(pfn_t pfn); |
| 272 | int is_hwpoison_pfn(pfn_t pfn); | ||
| 273 | int is_fault_pfn(pfn_t pfn); | ||
| 269 | int kvm_is_error_hva(unsigned long addr); | 274 | int kvm_is_error_hva(unsigned long addr); |
| 270 | int kvm_set_memory_region(struct kvm *kvm, | 275 | int kvm_set_memory_region(struct kvm *kvm, |
| 271 | struct kvm_userspace_memory_region *mem, | 276 | struct kvm_userspace_memory_region *mem, |
| @@ -284,8 +289,9 @@ void kvm_arch_commit_memory_region(struct kvm *kvm, | |||
| 284 | int user_alloc); | 289 | int user_alloc); |
| 285 | void kvm_disable_largepages(void); | 290 | void kvm_disable_largepages(void); |
| 286 | void kvm_arch_flush_shadow(struct kvm *kvm); | 291 | void kvm_arch_flush_shadow(struct kvm *kvm); |
| 287 | gfn_t unalias_gfn(struct kvm *kvm, gfn_t gfn); | 292 | |
| 288 | gfn_t unalias_gfn_instantiation(struct kvm *kvm, gfn_t gfn); | 293 | int gfn_to_page_many_atomic(struct kvm *kvm, gfn_t gfn, struct page **pages, |
| 294 | int nr_pages); | ||
| 289 | 295 | ||
| 290 | struct page *gfn_to_page(struct kvm *kvm, gfn_t gfn); | 296 | struct page *gfn_to_page(struct kvm *kvm, gfn_t gfn); |
| 291 | unsigned long gfn_to_hva(struct kvm *kvm, gfn_t gfn); | 297 | unsigned long gfn_to_hva(struct kvm *kvm, gfn_t gfn); |
| @@ -294,6 +300,8 @@ void kvm_release_page_dirty(struct page *page); | |||
| 294 | void kvm_set_page_dirty(struct page *page); | 300 | void kvm_set_page_dirty(struct page *page); |
| 295 | void kvm_set_page_accessed(struct page *page); | 301 | void kvm_set_page_accessed(struct page *page); |
| 296 | 302 | ||
| 303 | pfn_t hva_to_pfn_atomic(struct kvm *kvm, unsigned long addr); | ||
| 304 | pfn_t gfn_to_pfn_atomic(struct kvm *kvm, gfn_t gfn); | ||
| 297 | pfn_t gfn_to_pfn(struct kvm *kvm, gfn_t gfn); | 305 | pfn_t gfn_to_pfn(struct kvm *kvm, gfn_t gfn); |
| 298 | pfn_t gfn_to_pfn_memslot(struct kvm *kvm, | 306 | pfn_t gfn_to_pfn_memslot(struct kvm *kvm, |
| 299 | struct kvm_memory_slot *slot, gfn_t gfn); | 307 | struct kvm_memory_slot *slot, gfn_t gfn); |
| @@ -445,7 +453,8 @@ void kvm_register_irq_mask_notifier(struct kvm *kvm, int irq, | |||
| 445 | struct kvm_irq_mask_notifier *kimn); | 453 | struct kvm_irq_mask_notifier *kimn); |
| 446 | void kvm_unregister_irq_mask_notifier(struct kvm *kvm, int irq, | 454 | void kvm_unregister_irq_mask_notifier(struct kvm *kvm, int irq, |
| 447 | struct kvm_irq_mask_notifier *kimn); | 455 | struct kvm_irq_mask_notifier *kimn); |
| 448 | void kvm_fire_mask_notifiers(struct kvm *kvm, int irq, bool mask); | 456 | void kvm_fire_mask_notifiers(struct kvm *kvm, unsigned irqchip, unsigned pin, |
| 457 | bool mask); | ||
| 449 | 458 | ||
| 450 | #ifdef __KVM_HAVE_IOAPIC | 459 | #ifdef __KVM_HAVE_IOAPIC |
| 451 | void kvm_get_intr_delivery_bitmask(struct kvm_ioapic *ioapic, | 460 | void kvm_get_intr_delivery_bitmask(struct kvm_ioapic *ioapic, |
| @@ -474,8 +483,7 @@ int kvm_deassign_device(struct kvm *kvm, | |||
| 474 | struct kvm_assigned_dev_kernel *assigned_dev); | 483 | struct kvm_assigned_dev_kernel *assigned_dev); |
| 475 | #else /* CONFIG_IOMMU_API */ | 484 | #else /* CONFIG_IOMMU_API */ |
| 476 | static inline int kvm_iommu_map_pages(struct kvm *kvm, | 485 | static inline int kvm_iommu_map_pages(struct kvm *kvm, |
| 477 | gfn_t base_gfn, | 486 | struct kvm_memory_slot *slot) |
| 478 | unsigned long npages) | ||
| 479 | { | 487 | { |
| 480 | return 0; | 488 | return 0; |
| 481 | } | 489 | } |
| @@ -515,11 +523,22 @@ static inline void kvm_guest_exit(void) | |||
| 515 | current->flags &= ~PF_VCPU; | 523 | current->flags &= ~PF_VCPU; |
| 516 | } | 524 | } |
| 517 | 525 | ||
| 526 | static inline unsigned long gfn_to_hva_memslot(struct kvm_memory_slot *slot, | ||
| 527 | gfn_t gfn) | ||
| 528 | { | ||
| 529 | return slot->userspace_addr + (gfn - slot->base_gfn) * PAGE_SIZE; | ||
| 530 | } | ||
| 531 | |||
| 518 | static inline gpa_t gfn_to_gpa(gfn_t gfn) | 532 | static inline gpa_t gfn_to_gpa(gfn_t gfn) |
| 519 | { | 533 | { |
| 520 | return (gpa_t)gfn << PAGE_SHIFT; | 534 | return (gpa_t)gfn << PAGE_SHIFT; |
| 521 | } | 535 | } |
| 522 | 536 | ||
| 537 | static inline gfn_t gpa_to_gfn(gpa_t gpa) | ||
| 538 | { | ||
| 539 | return (gfn_t)(gpa >> PAGE_SHIFT); | ||
| 540 | } | ||
| 541 | |||
| 523 | static inline hpa_t pfn_to_hpa(pfn_t pfn) | 542 | static inline hpa_t pfn_to_hpa(pfn_t pfn) |
| 524 | { | 543 | { |
| 525 | return (hpa_t)pfn << PAGE_SHIFT; | 544 | return (hpa_t)pfn << PAGE_SHIFT; |
| @@ -562,10 +581,6 @@ static inline int mmu_notifier_retry(struct kvm_vcpu *vcpu, unsigned long mmu_se | |||
| 562 | } | 581 | } |
| 563 | #endif | 582 | #endif |
| 564 | 583 | ||
| 565 | #ifndef KVM_ARCH_HAS_UNALIAS_INSTANTIATION | ||
| 566 | #define unalias_gfn_instantiation unalias_gfn | ||
| 567 | #endif | ||
| 568 | |||
| 569 | #ifdef CONFIG_HAVE_KVM_IRQCHIP | 584 | #ifdef CONFIG_HAVE_KVM_IRQCHIP |
| 570 | 585 | ||
| 571 | #define KVM_MAX_IRQ_ROUTES 1024 | 586 | #define KVM_MAX_IRQ_ROUTES 1024 |
| @@ -628,5 +643,25 @@ static inline long kvm_vm_ioctl_assigned_device(struct kvm *kvm, unsigned ioctl, | |||
| 628 | 643 | ||
| 629 | #endif | 644 | #endif |
| 630 | 645 | ||
| 646 | static inline void kvm_make_request(int req, struct kvm_vcpu *vcpu) | ||
| 647 | { | ||
| 648 | set_bit(req, &vcpu->requests); | ||
| 649 | } | ||
| 650 | |||
| 651 | static inline bool kvm_make_check_request(int req, struct kvm_vcpu *vcpu) | ||
| 652 | { | ||
| 653 | return test_and_set_bit(req, &vcpu->requests); | ||
| 654 | } | ||
| 655 | |||
| 656 | static inline bool kvm_check_request(int req, struct kvm_vcpu *vcpu) | ||
| 657 | { | ||
| 658 | if (test_bit(req, &vcpu->requests)) { | ||
| 659 | clear_bit(req, &vcpu->requests); | ||
| 660 | return true; | ||
| 661 | } else { | ||
| 662 | return false; | ||
| 663 | } | ||
| 664 | } | ||
| 665 | |||
| 631 | #endif | 666 | #endif |
| 632 | 667 | ||
diff --git a/include/linux/kvm_para.h b/include/linux/kvm_para.h index d73109243fda..47a070b0520e 100644 --- a/include/linux/kvm_para.h +++ b/include/linux/kvm_para.h | |||
| @@ -17,6 +17,8 @@ | |||
| 17 | 17 | ||
| 18 | #define KVM_HC_VAPIC_POLL_IRQ 1 | 18 | #define KVM_HC_VAPIC_POLL_IRQ 1 |
| 19 | #define KVM_HC_MMU_OP 2 | 19 | #define KVM_HC_MMU_OP 2 |
| 20 | #define KVM_HC_FEATURES 3 | ||
| 21 | #define KVM_HC_PPC_MAP_MAGIC_PAGE 4 | ||
| 20 | 22 | ||
| 21 | /* | 23 | /* |
| 22 | * hypercalls use architecture specific | 24 | * hypercalls use architecture specific |
| @@ -24,11 +26,6 @@ | |||
| 24 | #include <asm/kvm_para.h> | 26 | #include <asm/kvm_para.h> |
| 25 | 27 | ||
| 26 | #ifdef __KERNEL__ | 28 | #ifdef __KERNEL__ |
| 27 | #ifdef CONFIG_KVM_GUEST | ||
| 28 | void __init kvm_guest_init(void); | ||
| 29 | #else | ||
| 30 | #define kvm_guest_init() do { } while (0) | ||
| 31 | #endif | ||
| 32 | 29 | ||
| 33 | static inline int kvm_para_has_feature(unsigned int feature) | 30 | static inline int kvm_para_has_feature(unsigned int feature) |
| 34 | { | 31 | { |
diff --git a/include/linux/kvm_types.h b/include/linux/kvm_types.h index fb46efbeabec..7ac0d4eee430 100644 --- a/include/linux/kvm_types.h +++ b/include/linux/kvm_types.h | |||
| @@ -32,11 +32,11 @@ | |||
| 32 | 32 | ||
| 33 | typedef unsigned long gva_t; | 33 | typedef unsigned long gva_t; |
| 34 | typedef u64 gpa_t; | 34 | typedef u64 gpa_t; |
| 35 | typedef unsigned long gfn_t; | 35 | typedef u64 gfn_t; |
| 36 | 36 | ||
| 37 | typedef unsigned long hva_t; | 37 | typedef unsigned long hva_t; |
| 38 | typedef u64 hpa_t; | 38 | typedef u64 hpa_t; |
| 39 | typedef unsigned long hfn_t; | 39 | typedef u64 hfn_t; |
| 40 | 40 | ||
| 41 | typedef hfn_t pfn_t; | 41 | typedef hfn_t pfn_t; |
| 42 | 42 | ||
diff --git a/include/linux/lglock.h b/include/linux/lglock.h new file mode 100644 index 000000000000..f549056fb20b --- /dev/null +++ b/include/linux/lglock.h | |||
| @@ -0,0 +1,172 @@ | |||
| 1 | /* | ||
| 2 | * Specialised local-global spinlock. Can only be declared as global variables | ||
| 3 | * to avoid overhead and keep things simple (and we don't want to start using | ||
| 4 | * these inside dynamically allocated structures). | ||
| 5 | * | ||
| 6 | * "local/global locks" (lglocks) can be used to: | ||
| 7 | * | ||
| 8 | * - Provide fast exclusive access to per-CPU data, with exclusive access to | ||
| 9 | * another CPU's data allowed but possibly subject to contention, and to | ||
| 10 | * provide very slow exclusive access to all per-CPU data. | ||
| 11 | * - Or to provide very fast and scalable read serialisation, and to provide | ||
| 12 | * very slow exclusive serialisation of data (not necessarily per-CPU data). | ||
| 13 | * | ||
| 14 | * Brlocks are also implemented as a short-hand notation for the latter use | ||
| 15 | * case. | ||
| 16 | * | ||
| 17 | * Copyright 2009, 2010, Nick Piggin, Novell Inc. | ||
| 18 | */ | ||
| 19 | #ifndef __LINUX_LGLOCK_H | ||
| 20 | #define __LINUX_LGLOCK_H | ||
| 21 | |||
| 22 | #include <linux/spinlock.h> | ||
| 23 | #include <linux/lockdep.h> | ||
| 24 | #include <linux/percpu.h> | ||
| 25 | |||
| 26 | /* can make br locks by using local lock for read side, global lock for write */ | ||
| 27 | #define br_lock_init(name) name##_lock_init() | ||
| 28 | #define br_read_lock(name) name##_local_lock() | ||
| 29 | #define br_read_unlock(name) name##_local_unlock() | ||
| 30 | #define br_write_lock(name) name##_global_lock_online() | ||
| 31 | #define br_write_unlock(name) name##_global_unlock_online() | ||
| 32 | |||
| 33 | #define DECLARE_BRLOCK(name) DECLARE_LGLOCK(name) | ||
| 34 | #define DEFINE_BRLOCK(name) DEFINE_LGLOCK(name) | ||
| 35 | |||
| 36 | |||
| 37 | #define lg_lock_init(name) name##_lock_init() | ||
| 38 | #define lg_local_lock(name) name##_local_lock() | ||
| 39 | #define lg_local_unlock(name) name##_local_unlock() | ||
| 40 | #define lg_local_lock_cpu(name, cpu) name##_local_lock_cpu(cpu) | ||
| 41 | #define lg_local_unlock_cpu(name, cpu) name##_local_unlock_cpu(cpu) | ||
| 42 | #define lg_global_lock(name) name##_global_lock() | ||
| 43 | #define lg_global_unlock(name) name##_global_unlock() | ||
| 44 | #define lg_global_lock_online(name) name##_global_lock_online() | ||
| 45 | #define lg_global_unlock_online(name) name##_global_unlock_online() | ||
| 46 | |||
| 47 | #ifdef CONFIG_DEBUG_LOCK_ALLOC | ||
| 48 | #define LOCKDEP_INIT_MAP lockdep_init_map | ||
| 49 | |||
| 50 | #define DEFINE_LGLOCK_LOCKDEP(name) \ | ||
| 51 | struct lock_class_key name##_lock_key; \ | ||
| 52 | struct lockdep_map name##_lock_dep_map; \ | ||
| 53 | EXPORT_SYMBOL(name##_lock_dep_map) | ||
| 54 | |||
| 55 | #else | ||
| 56 | #define LOCKDEP_INIT_MAP(a, b, c, d) | ||
| 57 | |||
| 58 | #define DEFINE_LGLOCK_LOCKDEP(name) | ||
| 59 | #endif | ||
| 60 | |||
| 61 | |||
| 62 | #define DECLARE_LGLOCK(name) \ | ||
| 63 | extern void name##_lock_init(void); \ | ||
| 64 | extern void name##_local_lock(void); \ | ||
| 65 | extern void name##_local_unlock(void); \ | ||
| 66 | extern void name##_local_lock_cpu(int cpu); \ | ||
| 67 | extern void name##_local_unlock_cpu(int cpu); \ | ||
| 68 | extern void name##_global_lock(void); \ | ||
| 69 | extern void name##_global_unlock(void); \ | ||
| 70 | extern void name##_global_lock_online(void); \ | ||
| 71 | extern void name##_global_unlock_online(void); \ | ||
| 72 | |||
| 73 | #define DEFINE_LGLOCK(name) \ | ||
| 74 | \ | ||
| 75 | DEFINE_PER_CPU(arch_spinlock_t, name##_lock); \ | ||
| 76 | DEFINE_LGLOCK_LOCKDEP(name); \ | ||
| 77 | \ | ||
| 78 | void name##_lock_init(void) { \ | ||
| 79 | int i; \ | ||
| 80 | LOCKDEP_INIT_MAP(&name##_lock_dep_map, #name, &name##_lock_key, 0); \ | ||
| 81 | for_each_possible_cpu(i) { \ | ||
| 82 | arch_spinlock_t *lock; \ | ||
| 83 | lock = &per_cpu(name##_lock, i); \ | ||
| 84 | *lock = (arch_spinlock_t)__ARCH_SPIN_LOCK_UNLOCKED; \ | ||
| 85 | } \ | ||
| 86 | } \ | ||
| 87 | EXPORT_SYMBOL(name##_lock_init); \ | ||
| 88 | \ | ||
| 89 | void name##_local_lock(void) { \ | ||
| 90 | arch_spinlock_t *lock; \ | ||
| 91 | preempt_disable(); \ | ||
| 92 | rwlock_acquire_read(&name##_lock_dep_map, 0, 0, _THIS_IP_); \ | ||
| 93 | lock = &__get_cpu_var(name##_lock); \ | ||
| 94 | arch_spin_lock(lock); \ | ||
| 95 | } \ | ||
| 96 | EXPORT_SYMBOL(name##_local_lock); \ | ||
| 97 | \ | ||
| 98 | void name##_local_unlock(void) { \ | ||
| 99 | arch_spinlock_t *lock; \ | ||
| 100 | rwlock_release(&name##_lock_dep_map, 1, _THIS_IP_); \ | ||
| 101 | lock = &__get_cpu_var(name##_lock); \ | ||
| 102 | arch_spin_unlock(lock); \ | ||
| 103 | preempt_enable(); \ | ||
| 104 | } \ | ||
| 105 | EXPORT_SYMBOL(name##_local_unlock); \ | ||
| 106 | \ | ||
| 107 | void name##_local_lock_cpu(int cpu) { \ | ||
| 108 | arch_spinlock_t *lock; \ | ||
| 109 | preempt_disable(); \ | ||
| 110 | rwlock_acquire_read(&name##_lock_dep_map, 0, 0, _THIS_IP_); \ | ||
| 111 | lock = &per_cpu(name##_lock, cpu); \ | ||
| 112 | arch_spin_lock(lock); \ | ||
| 113 | } \ | ||
| 114 | EXPORT_SYMBOL(name##_local_lock_cpu); \ | ||
| 115 | \ | ||
| 116 | void name##_local_unlock_cpu(int cpu) { \ | ||
| 117 | arch_spinlock_t *lock; \ | ||
| 118 | rwlock_release(&name##_lock_dep_map, 1, _THIS_IP_); \ | ||
| 119 | lock = &per_cpu(name##_lock, cpu); \ | ||
| 120 | arch_spin_unlock(lock); \ | ||
| 121 | preempt_enable(); \ | ||
| 122 | } \ | ||
| 123 | EXPORT_SYMBOL(name##_local_unlock_cpu); \ | ||
| 124 | \ | ||
| 125 | void name##_global_lock_online(void) { \ | ||
| 126 | int i; \ | ||
| 127 | preempt_disable(); \ | ||
| 128 | rwlock_acquire(&name##_lock_dep_map, 0, 0, _RET_IP_); \ | ||
| 129 | for_each_online_cpu(i) { \ | ||
| 130 | arch_spinlock_t *lock; \ | ||
| 131 | lock = &per_cpu(name##_lock, i); \ | ||
| 132 | arch_spin_lock(lock); \ | ||
| 133 | } \ | ||
| 134 | } \ | ||
| 135 | EXPORT_SYMBOL(name##_global_lock_online); \ | ||
| 136 | \ | ||
| 137 | void name##_global_unlock_online(void) { \ | ||
| 138 | int i; \ | ||
| 139 | rwlock_release(&name##_lock_dep_map, 1, _RET_IP_); \ | ||
| 140 | for_each_online_cpu(i) { \ | ||
| 141 | arch_spinlock_t *lock; \ | ||
| 142 | lock = &per_cpu(name##_lock, i); \ | ||
| 143 | arch_spin_unlock(lock); \ | ||
| 144 | } \ | ||
| 145 | preempt_enable(); \ | ||
| 146 | } \ | ||
| 147 | EXPORT_SYMBOL(name##_global_unlock_online); \ | ||
| 148 | \ | ||
| 149 | void name##_global_lock(void) { \ | ||
| 150 | int i; \ | ||
| 151 | preempt_disable(); \ | ||
| 152 | rwlock_acquire(&name##_lock_dep_map, 0, 0, _RET_IP_); \ | ||
| 153 | for_each_possible_cpu(i) { \ | ||
| 154 | arch_spinlock_t *lock; \ | ||
| 155 | lock = &per_cpu(name##_lock, i); \ | ||
| 156 | arch_spin_lock(lock); \ | ||
| 157 | } \ | ||
| 158 | } \ | ||
| 159 | EXPORT_SYMBOL(name##_global_lock); \ | ||
| 160 | \ | ||
| 161 | void name##_global_unlock(void) { \ | ||
| 162 | int i; \ | ||
| 163 | rwlock_release(&name##_lock_dep_map, 1, _RET_IP_); \ | ||
| 164 | for_each_possible_cpu(i) { \ | ||
| 165 | arch_spinlock_t *lock; \ | ||
| 166 | lock = &per_cpu(name##_lock, i); \ | ||
| 167 | arch_spin_unlock(lock); \ | ||
| 168 | } \ | ||
| 169 | preempt_enable(); \ | ||
| 170 | } \ | ||
| 171 | EXPORT_SYMBOL(name##_global_unlock); | ||
| 172 | #endif | ||
diff --git a/include/linux/libata.h b/include/linux/libata.h index b85f3ff34d7d..15b77b8dc7e1 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h | |||
| @@ -37,6 +37,7 @@ | |||
| 37 | #include <scsi/scsi_host.h> | 37 | #include <scsi/scsi_host.h> |
| 38 | #include <linux/acpi.h> | 38 | #include <linux/acpi.h> |
| 39 | #include <linux/cdrom.h> | 39 | #include <linux/cdrom.h> |
| 40 | #include <linux/sched.h> | ||
| 40 | 41 | ||
| 41 | /* | 42 | /* |
| 42 | * Define if arch has non-standard setup. This is a _PCI_ standard | 43 | * Define if arch has non-standard setup. This is a _PCI_ standard |
| @@ -172,6 +173,7 @@ enum { | |||
| 172 | ATA_LFLAG_NO_RETRY = (1 << 5), /* don't retry this link */ | 173 | ATA_LFLAG_NO_RETRY = (1 << 5), /* don't retry this link */ |
| 173 | ATA_LFLAG_DISABLED = (1 << 6), /* link is disabled */ | 174 | ATA_LFLAG_DISABLED = (1 << 6), /* link is disabled */ |
| 174 | ATA_LFLAG_SW_ACTIVITY = (1 << 7), /* keep activity stats */ | 175 | ATA_LFLAG_SW_ACTIVITY = (1 << 7), /* keep activity stats */ |
| 176 | ATA_LFLAG_NO_LPM = (1 << 8), /* disable LPM on this link */ | ||
| 175 | 177 | ||
| 176 | /* struct ata_port flags */ | 178 | /* struct ata_port flags */ |
| 177 | ATA_FLAG_SLAVE_POSS = (1 << 0), /* host supports slave dev */ | 179 | ATA_FLAG_SLAVE_POSS = (1 << 0), /* host supports slave dev */ |
| @@ -196,7 +198,7 @@ enum { | |||
| 196 | ATA_FLAG_ACPI_SATA = (1 << 17), /* need native SATA ACPI layout */ | 198 | ATA_FLAG_ACPI_SATA = (1 << 17), /* need native SATA ACPI layout */ |
| 197 | ATA_FLAG_AN = (1 << 18), /* controller supports AN */ | 199 | ATA_FLAG_AN = (1 << 18), /* controller supports AN */ |
| 198 | ATA_FLAG_PMP = (1 << 19), /* controller supports PMP */ | 200 | ATA_FLAG_PMP = (1 << 19), /* controller supports PMP */ |
| 199 | ATA_FLAG_IPM = (1 << 20), /* driver can handle IPM */ | 201 | ATA_FLAG_LPM = (1 << 20), /* driver can handle LPM */ |
| 200 | ATA_FLAG_EM = (1 << 21), /* driver supports enclosure | 202 | ATA_FLAG_EM = (1 << 21), /* driver supports enclosure |
| 201 | * management */ | 203 | * management */ |
| 202 | ATA_FLAG_SW_ACTIVITY = (1 << 22), /* driver supports sw activity | 204 | ATA_FLAG_SW_ACTIVITY = (1 << 22), /* driver supports sw activity |
| @@ -324,23 +326,23 @@ enum { | |||
| 324 | ATA_EH_HARDRESET = (1 << 2), /* meaningful only in ->prereset */ | 326 | ATA_EH_HARDRESET = (1 << 2), /* meaningful only in ->prereset */ |
| 325 | ATA_EH_RESET = ATA_EH_SOFTRESET | ATA_EH_HARDRESET, | 327 | ATA_EH_RESET = ATA_EH_SOFTRESET | ATA_EH_HARDRESET, |
| 326 | ATA_EH_ENABLE_LINK = (1 << 3), | 328 | ATA_EH_ENABLE_LINK = (1 << 3), |
| 327 | ATA_EH_LPM = (1 << 4), /* link power management action */ | ||
| 328 | ATA_EH_PARK = (1 << 5), /* unload heads and stop I/O */ | 329 | ATA_EH_PARK = (1 << 5), /* unload heads and stop I/O */ |
| 329 | 330 | ||
| 330 | ATA_EH_PERDEV_MASK = ATA_EH_REVALIDATE | ATA_EH_PARK, | 331 | ATA_EH_PERDEV_MASK = ATA_EH_REVALIDATE | ATA_EH_PARK, |
| 331 | ATA_EH_ALL_ACTIONS = ATA_EH_REVALIDATE | ATA_EH_RESET | | 332 | ATA_EH_ALL_ACTIONS = ATA_EH_REVALIDATE | ATA_EH_RESET | |
| 332 | ATA_EH_ENABLE_LINK | ATA_EH_LPM, | 333 | ATA_EH_ENABLE_LINK, |
| 333 | 334 | ||
| 334 | /* ata_eh_info->flags */ | 335 | /* ata_eh_info->flags */ |
| 335 | ATA_EHI_HOTPLUGGED = (1 << 0), /* could have been hotplugged */ | 336 | ATA_EHI_HOTPLUGGED = (1 << 0), /* could have been hotplugged */ |
| 336 | ATA_EHI_NO_AUTOPSY = (1 << 2), /* no autopsy */ | 337 | ATA_EHI_NO_AUTOPSY = (1 << 2), /* no autopsy */ |
| 337 | ATA_EHI_QUIET = (1 << 3), /* be quiet */ | 338 | ATA_EHI_QUIET = (1 << 3), /* be quiet */ |
| 339 | ATA_EHI_NO_RECOVERY = (1 << 4), /* no recovery */ | ||
| 338 | 340 | ||
| 339 | ATA_EHI_DID_SOFTRESET = (1 << 16), /* already soft-reset this port */ | 341 | ATA_EHI_DID_SOFTRESET = (1 << 16), /* already soft-reset this port */ |
| 340 | ATA_EHI_DID_HARDRESET = (1 << 17), /* already soft-reset this port */ | 342 | ATA_EHI_DID_HARDRESET = (1 << 17), /* already soft-reset this port */ |
| 341 | ATA_EHI_PRINTINFO = (1 << 18), /* print configuration info */ | 343 | ATA_EHI_PRINTINFO = (1 << 18), /* print configuration info */ |
| 342 | ATA_EHI_SETMODE = (1 << 19), /* configure transfer mode */ | 344 | ATA_EHI_SETMODE = (1 << 19), /* configure transfer mode */ |
| 343 | ATA_EHI_POST_SETMODE = (1 << 20), /* revaildating after setmode */ | 345 | ATA_EHI_POST_SETMODE = (1 << 20), /* revalidating after setmode */ |
| 344 | 346 | ||
| 345 | ATA_EHI_DID_RESET = ATA_EHI_DID_SOFTRESET | ATA_EHI_DID_HARDRESET, | 347 | ATA_EHI_DID_RESET = ATA_EHI_DID_SOFTRESET | ATA_EHI_DID_HARDRESET, |
| 346 | 348 | ||
| @@ -376,7 +378,6 @@ enum { | |||
| 376 | ATA_HORKAGE_BROKEN_HPA = (1 << 4), /* Broken HPA */ | 378 | ATA_HORKAGE_BROKEN_HPA = (1 << 4), /* Broken HPA */ |
| 377 | ATA_HORKAGE_DISABLE = (1 << 5), /* Disable it */ | 379 | ATA_HORKAGE_DISABLE = (1 << 5), /* Disable it */ |
| 378 | ATA_HORKAGE_HPA_SIZE = (1 << 6), /* native size off by one */ | 380 | ATA_HORKAGE_HPA_SIZE = (1 << 6), /* native size off by one */ |
| 379 | ATA_HORKAGE_IPM = (1 << 7), /* Link PM problems */ | ||
| 380 | ATA_HORKAGE_IVB = (1 << 8), /* cbl det validity bit bugs */ | 381 | ATA_HORKAGE_IVB = (1 << 8), /* cbl det validity bit bugs */ |
| 381 | ATA_HORKAGE_STUCK_ERR = (1 << 9), /* stuck ERR on next PACKET */ | 382 | ATA_HORKAGE_STUCK_ERR = (1 << 9), /* stuck ERR on next PACKET */ |
| 382 | ATA_HORKAGE_BRIDGE_OK = (1 << 10), /* no bridge limits */ | 383 | ATA_HORKAGE_BRIDGE_OK = (1 << 10), /* no bridge limits */ |
| @@ -463,6 +464,22 @@ enum ata_completion_errors { | |||
| 463 | AC_ERR_NCQ = (1 << 10), /* marker for offending NCQ qc */ | 464 | AC_ERR_NCQ = (1 << 10), /* marker for offending NCQ qc */ |
| 464 | }; | 465 | }; |
| 465 | 466 | ||
| 467 | /* | ||
| 468 | * Link power management policy: If you alter this, you also need to | ||
| 469 | * alter libata-scsi.c (for the ascii descriptions) | ||
| 470 | */ | ||
| 471 | enum ata_lpm_policy { | ||
| 472 | ATA_LPM_UNKNOWN, | ||
| 473 | ATA_LPM_MAX_POWER, | ||
| 474 | ATA_LPM_MED_POWER, | ||
| 475 | ATA_LPM_MIN_POWER, | ||
| 476 | }; | ||
| 477 | |||
| 478 | enum ata_lpm_hints { | ||
| 479 | ATA_LPM_EMPTY = (1 << 0), /* port empty/probing */ | ||
| 480 | ATA_LPM_HIPM = (1 << 1), /* may use HIPM */ | ||
| 481 | }; | ||
| 482 | |||
| 466 | /* forward declarations */ | 483 | /* forward declarations */ |
| 467 | struct scsi_device; | 484 | struct scsi_device; |
| 468 | struct ata_port_operations; | 485 | struct ata_port_operations; |
| @@ -477,16 +494,6 @@ typedef int (*ata_reset_fn_t)(struct ata_link *link, unsigned int *classes, | |||
| 477 | unsigned long deadline); | 494 | unsigned long deadline); |
| 478 | typedef void (*ata_postreset_fn_t)(struct ata_link *link, unsigned int *classes); | 495 | typedef void (*ata_postreset_fn_t)(struct ata_link *link, unsigned int *classes); |
| 479 | 496 | ||
| 480 | /* | ||
| 481 | * host pm policy: If you alter this, you also need to alter libata-scsi.c | ||
| 482 | * (for the ascii descriptions) | ||
| 483 | */ | ||
| 484 | enum link_pm { | ||
| 485 | NOT_AVAILABLE, | ||
| 486 | MIN_POWER, | ||
| 487 | MAX_PERFORMANCE, | ||
| 488 | MEDIUM_POWER, | ||
| 489 | }; | ||
| 490 | extern struct device_attribute dev_attr_link_power_management_policy; | 497 | extern struct device_attribute dev_attr_link_power_management_policy; |
| 491 | extern struct device_attribute dev_attr_unload_heads; | 498 | extern struct device_attribute dev_attr_unload_heads; |
| 492 | extern struct device_attribute dev_attr_em_message_type; | 499 | extern struct device_attribute dev_attr_em_message_type; |
| @@ -529,6 +536,10 @@ struct ata_host { | |||
| 529 | void *private_data; | 536 | void *private_data; |
| 530 | struct ata_port_operations *ops; | 537 | struct ata_port_operations *ops; |
| 531 | unsigned long flags; | 538 | unsigned long flags; |
| 539 | |||
| 540 | struct mutex eh_mutex; | ||
| 541 | struct task_struct *eh_owner; | ||
| 542 | |||
| 532 | #ifdef CONFIG_ATA_ACPI | 543 | #ifdef CONFIG_ATA_ACPI |
| 533 | acpi_handle acpi_handle; | 544 | acpi_handle acpi_handle; |
| 534 | #endif | 545 | #endif |
| @@ -559,13 +570,13 @@ struct ata_queued_cmd { | |||
| 559 | unsigned int extrabytes; | 570 | unsigned int extrabytes; |
| 560 | unsigned int curbytes; | 571 | unsigned int curbytes; |
| 561 | 572 | ||
| 562 | struct scatterlist *cursg; | ||
| 563 | unsigned int cursg_ofs; | ||
| 564 | |||
| 565 | struct scatterlist sgent; | 573 | struct scatterlist sgent; |
| 566 | 574 | ||
| 567 | struct scatterlist *sg; | 575 | struct scatterlist *sg; |
| 568 | 576 | ||
| 577 | struct scatterlist *cursg; | ||
| 578 | unsigned int cursg_ofs; | ||
| 579 | |||
| 569 | unsigned int err_mask; | 580 | unsigned int err_mask; |
| 570 | struct ata_taskfile result_tf; | 581 | struct ata_taskfile result_tf; |
| 571 | ata_qc_cb_t complete_fn; | 582 | ata_qc_cb_t complete_fn; |
| @@ -603,6 +614,7 @@ struct ata_device { | |||
| 603 | union acpi_object *gtf_cache; | 614 | union acpi_object *gtf_cache; |
| 604 | unsigned int gtf_filter; | 615 | unsigned int gtf_filter; |
| 605 | #endif | 616 | #endif |
| 617 | struct device tdev; | ||
| 606 | /* n_sector is CLEAR_BEGIN, read comment above CLEAR_BEGIN */ | 618 | /* n_sector is CLEAR_BEGIN, read comment above CLEAR_BEGIN */ |
| 607 | u64 n_sectors; /* size of device, if ATA */ | 619 | u64 n_sectors; /* size of device, if ATA */ |
| 608 | u64 n_native_sectors; /* native size, if ATA */ | 620 | u64 n_native_sectors; /* native size, if ATA */ |
| @@ -689,6 +701,7 @@ struct ata_link { | |||
| 689 | struct ata_port *ap; | 701 | struct ata_port *ap; |
| 690 | int pmp; /* port multiplier port # */ | 702 | int pmp; /* port multiplier port # */ |
| 691 | 703 | ||
| 704 | struct device tdev; | ||
| 692 | unsigned int active_tag; /* active tag on this link */ | 705 | unsigned int active_tag; /* active tag on this link */ |
| 693 | u32 sactive; /* active NCQ commands */ | 706 | u32 sactive; /* active NCQ commands */ |
| 694 | 707 | ||
| @@ -698,6 +711,7 @@ struct ata_link { | |||
| 698 | unsigned int hw_sata_spd_limit; | 711 | unsigned int hw_sata_spd_limit; |
| 699 | unsigned int sata_spd_limit; | 712 | unsigned int sata_spd_limit; |
| 700 | unsigned int sata_spd; /* current SATA PHY speed */ | 713 | unsigned int sata_spd; /* current SATA PHY speed */ |
| 714 | enum ata_lpm_policy lpm_policy; | ||
| 701 | 715 | ||
| 702 | /* record runtime error info, protected by host_set lock */ | 716 | /* record runtime error info, protected by host_set lock */ |
| 703 | struct ata_eh_info eh_info; | 717 | struct ata_eh_info eh_info; |
| @@ -706,6 +720,8 @@ struct ata_link { | |||
| 706 | 720 | ||
| 707 | struct ata_device device[ATA_MAX_DEVICES]; | 721 | struct ata_device device[ATA_MAX_DEVICES]; |
| 708 | }; | 722 | }; |
| 723 | #define ATA_LINK_CLEAR_BEGIN offsetof(struct ata_link, active_tag) | ||
| 724 | #define ATA_LINK_CLEAR_END offsetof(struct ata_link, device[0]) | ||
| 709 | 725 | ||
| 710 | struct ata_port { | 726 | struct ata_port { |
| 711 | struct Scsi_Host *scsi_host; /* our co-allocated scsi host */ | 727 | struct Scsi_Host *scsi_host; /* our co-allocated scsi host */ |
| @@ -723,6 +739,7 @@ struct ata_port { | |||
| 723 | struct ata_ioports ioaddr; /* ATA cmd/ctl/dma register blocks */ | 739 | struct ata_ioports ioaddr; /* ATA cmd/ctl/dma register blocks */ |
| 724 | u8 ctl; /* cache of ATA control register */ | 740 | u8 ctl; /* cache of ATA control register */ |
| 725 | u8 last_ctl; /* Cache last written value */ | 741 | u8 last_ctl; /* Cache last written value */ |
| 742 | struct ata_link* sff_pio_task_link; /* link currently used */ | ||
| 726 | struct delayed_work sff_pio_task; | 743 | struct delayed_work sff_pio_task; |
| 727 | #ifdef CONFIG_ATA_BMDMA | 744 | #ifdef CONFIG_ATA_BMDMA |
| 728 | struct ata_bmdma_prd *bmdma_prd; /* BMDMA SG list */ | 745 | struct ata_bmdma_prd *bmdma_prd; /* BMDMA SG list */ |
| @@ -750,7 +767,9 @@ struct ata_port { | |||
| 750 | struct ata_port_stats stats; | 767 | struct ata_port_stats stats; |
| 751 | struct ata_host *host; | 768 | struct ata_host *host; |
| 752 | struct device *dev; | 769 | struct device *dev; |
| 770 | struct device tdev; | ||
| 753 | 771 | ||
| 772 | struct mutex scsi_scan_mutex; | ||
| 754 | struct delayed_work hotplug_task; | 773 | struct delayed_work hotplug_task; |
| 755 | struct work_struct scsi_rescan_task; | 774 | struct work_struct scsi_rescan_task; |
| 756 | 775 | ||
| @@ -764,7 +783,7 @@ struct ata_port { | |||
| 764 | 783 | ||
| 765 | pm_message_t pm_mesg; | 784 | pm_message_t pm_mesg; |
| 766 | int *pm_result; | 785 | int *pm_result; |
| 767 | enum link_pm pm_policy; | 786 | enum ata_lpm_policy target_lpm_policy; |
| 768 | 787 | ||
| 769 | struct timer_list fastdrain_timer; | 788 | struct timer_list fastdrain_timer; |
| 770 | unsigned long fastdrain_cnt; | 789 | unsigned long fastdrain_cnt; |
| @@ -830,8 +849,8 @@ struct ata_port_operations { | |||
| 830 | int (*scr_write)(struct ata_link *link, unsigned int sc_reg, u32 val); | 849 | int (*scr_write)(struct ata_link *link, unsigned int sc_reg, u32 val); |
| 831 | void (*pmp_attach)(struct ata_port *ap); | 850 | void (*pmp_attach)(struct ata_port *ap); |
| 832 | void (*pmp_detach)(struct ata_port *ap); | 851 | void (*pmp_detach)(struct ata_port *ap); |
| 833 | int (*enable_pm)(struct ata_port *ap, enum link_pm policy); | 852 | int (*set_lpm)(struct ata_link *link, enum ata_lpm_policy policy, |
| 834 | void (*disable_pm)(struct ata_port *ap); | 853 | unsigned hints); |
| 835 | 854 | ||
| 836 | /* | 855 | /* |
| 837 | * Start, stop, suspend and resume | 856 | * Start, stop, suspend and resume |
| @@ -943,6 +962,8 @@ extern int sata_link_debounce(struct ata_link *link, | |||
| 943 | const unsigned long *params, unsigned long deadline); | 962 | const unsigned long *params, unsigned long deadline); |
| 944 | extern int sata_link_resume(struct ata_link *link, const unsigned long *params, | 963 | extern int sata_link_resume(struct ata_link *link, const unsigned long *params, |
| 945 | unsigned long deadline); | 964 | unsigned long deadline); |
| 965 | extern int sata_link_scr_lpm(struct ata_link *link, enum ata_lpm_policy policy, | ||
| 966 | bool spm_wakeup); | ||
| 946 | extern int sata_link_hardreset(struct ata_link *link, | 967 | extern int sata_link_hardreset(struct ata_link *link, |
| 947 | const unsigned long *timing, unsigned long deadline, | 968 | const unsigned long *timing, unsigned long deadline, |
| 948 | bool *online, int (*check_ready)(struct ata_link *)); | 969 | bool *online, int (*check_ready)(struct ata_link *)); |
| @@ -988,8 +1009,9 @@ extern int ata_host_suspend(struct ata_host *host, pm_message_t mesg); | |||
| 988 | extern void ata_host_resume(struct ata_host *host); | 1009 | extern void ata_host_resume(struct ata_host *host); |
| 989 | #endif | 1010 | #endif |
| 990 | extern int ata_ratelimit(void); | 1011 | extern int ata_ratelimit(void); |
| 991 | extern u32 ata_wait_register(void __iomem *reg, u32 mask, u32 val, | 1012 | extern void ata_msleep(struct ata_port *ap, unsigned int msecs); |
| 992 | unsigned long interval, unsigned long timeout); | 1013 | extern u32 ata_wait_register(struct ata_port *ap, void __iomem *reg, u32 mask, |
| 1014 | u32 val, unsigned long interval, unsigned long timeout); | ||
| 993 | extern int atapi_cmd_type(u8 opcode); | 1015 | extern int atapi_cmd_type(u8 opcode); |
| 994 | extern void ata_tf_to_fis(const struct ata_taskfile *tf, | 1016 | extern void ata_tf_to_fis(const struct ata_taskfile *tf, |
| 995 | u8 pmp, int is_cmd, u8 *fis); | 1017 | u8 pmp, int is_cmd, u8 *fis); |
| @@ -1593,7 +1615,7 @@ extern void ata_sff_irq_on(struct ata_port *ap); | |||
| 1593 | extern void ata_sff_irq_clear(struct ata_port *ap); | 1615 | extern void ata_sff_irq_clear(struct ata_port *ap); |
| 1594 | extern int ata_sff_hsm_move(struct ata_port *ap, struct ata_queued_cmd *qc, | 1616 | extern int ata_sff_hsm_move(struct ata_port *ap, struct ata_queued_cmd *qc, |
| 1595 | u8 status, int in_wq); | 1617 | u8 status, int in_wq); |
| 1596 | extern void ata_sff_queue_pio_task(struct ata_port *ap, unsigned long delay); | 1618 | extern void ata_sff_queue_pio_task(struct ata_link *link, unsigned long delay); |
| 1597 | extern unsigned int ata_sff_qc_issue(struct ata_queued_cmd *qc); | 1619 | extern unsigned int ata_sff_qc_issue(struct ata_queued_cmd *qc); |
| 1598 | extern bool ata_sff_qc_fill_rtf(struct ata_queued_cmd *qc); | 1620 | extern bool ata_sff_qc_fill_rtf(struct ata_queued_cmd *qc); |
| 1599 | extern unsigned int ata_sff_port_intr(struct ata_port *ap, | 1621 | extern unsigned int ata_sff_port_intr(struct ata_port *ap, |
diff --git a/include/linux/lis3lv02d.h b/include/linux/lis3lv02d.h index 0e8a346424bb..d4292c8431e0 100644 --- a/include/linux/lis3lv02d.h +++ b/include/linux/lis3lv02d.h | |||
| @@ -1,6 +1,52 @@ | |||
| 1 | #ifndef __LIS3LV02D_H_ | 1 | #ifndef __LIS3LV02D_H_ |
| 2 | #define __LIS3LV02D_H_ | 2 | #define __LIS3LV02D_H_ |
| 3 | 3 | ||
| 4 | /** | ||
| 5 | * struct lis3lv02d_platform_data - lis3 chip family platform data | ||
| 6 | * @click_flags: Click detection unit configuration | ||
| 7 | * @click_thresh_x: Click detection unit x axis threshold | ||
| 8 | * @click_thresh_y: Click detection unit y axis threshold | ||
| 9 | * @click_thresh_z: Click detection unit z axis threshold | ||
| 10 | * @click_time_limit: Click detection unit time parameter | ||
| 11 | * @click_latency: Click detection unit latency parameter | ||
| 12 | * @click_window: Click detection unit window parameter | ||
| 13 | * @irq_cfg: On chip irq source and type configuration (click / | ||
| 14 | * data available / wake up, open drain, polarity) | ||
| 15 | * @irq_flags1: Additional irq triggering flags for irq channel 0 | ||
| 16 | * @irq_flags2: Additional irq triggering flags for irq channel 1 | ||
| 17 | * @duration1: Wake up unit 1 duration parameter | ||
| 18 | * @duration2: Wake up unit 2 duration parameter | ||
| 19 | * @wakeup_flags: Wake up unit 1 flags | ||
| 20 | * @wakeup_thresh: Wake up unit 1 threshold value | ||
| 21 | * @wakeup_flags2: Wake up unit 2 flags | ||
| 22 | * @wakeup_thresh2: Wake up unit 2 threshold value | ||
| 23 | * @hipass_ctrl: High pass filter control (enable / disable, cut off | ||
| 24 | * frequency) | ||
| 25 | * @axis_x: Sensor orientation remapping for x-axis | ||
| 26 | * @axis_y: Sensor orientation remapping for y-axis | ||
| 27 | * @axis_z: Sensor orientation remapping for z-axis | ||
| 28 | * @driver_features: Enable bits for different features. Disabled by default | ||
| 29 | * @default_rate: Default sampling rate. 0 means reset default | ||
| 30 | * @setup_resources: Interrupt line setup call back function | ||
| 31 | * @release_resources: Interrupt line release call back function | ||
| 32 | * @st_min_limits[3]: Selftest acceptance minimum values | ||
| 33 | * @st_max_limits[3]: Selftest acceptance maximum values | ||
| 34 | * @irq2: Irq line 2 number | ||
| 35 | * | ||
| 36 | * Platform data is used to setup the sensor chip. Meaning of the different | ||
| 37 | * chip features can be found from the data sheet. It is publicly available | ||
| 38 | * at www.st.com web pages. Currently the platform data is used | ||
| 39 | * only for the 8 bit device. The 8 bit device has two wake up / free fall | ||
| 40 | * detection units and click detection unit. There are plenty of ways to | ||
| 41 | * configure the chip which makes is quite hard to explain deeper meaning of | ||
| 42 | * the fields here. Behaviour of the detection blocks varies heavily depending | ||
| 43 | * on the configuration. For example, interrupt detection block can use high | ||
| 44 | * pass filtered data which makes it react to the changes in the acceleration. | ||
| 45 | * Irq_flags can be used to enable interrupt detection on the both edges. | ||
| 46 | * With proper chip configuration this produces interrupt when some trigger | ||
| 47 | * starts and when it goes away. | ||
| 48 | */ | ||
| 49 | |||
| 4 | struct lis3lv02d_platform_data { | 50 | struct lis3lv02d_platform_data { |
| 5 | /* please note: the 'click' feature is only supported for | 51 | /* please note: the 'click' feature is only supported for |
| 6 | * LIS[32]02DL variants of the chip and will be ignored for | 52 | * LIS[32]02DL variants of the chip and will be ignored for |
| @@ -36,7 +82,10 @@ struct lis3lv02d_platform_data { | |||
| 36 | #define LIS3_IRQ_OPEN_DRAIN (1 << 6) | 82 | #define LIS3_IRQ_OPEN_DRAIN (1 << 6) |
| 37 | #define LIS3_IRQ_ACTIVE_LOW (1 << 7) | 83 | #define LIS3_IRQ_ACTIVE_LOW (1 << 7) |
| 38 | unsigned char irq_cfg; | 84 | unsigned char irq_cfg; |
| 39 | 85 | unsigned char irq_flags1; /* Additional irq edge / level flags */ | |
| 86 | unsigned char irq_flags2; /* Additional irq edge / level flags */ | ||
| 87 | unsigned char duration1; | ||
| 88 | unsigned char duration2; | ||
| 40 | #define LIS3_WAKEUP_X_LO (1 << 0) | 89 | #define LIS3_WAKEUP_X_LO (1 << 0) |
| 41 | #define LIS3_WAKEUP_X_HI (1 << 1) | 90 | #define LIS3_WAKEUP_X_HI (1 << 1) |
| 42 | #define LIS3_WAKEUP_Y_LO (1 << 2) | 91 | #define LIS3_WAKEUP_Y_LO (1 << 2) |
| @@ -64,6 +113,10 @@ struct lis3lv02d_platform_data { | |||
| 64 | s8 axis_x; | 113 | s8 axis_x; |
| 65 | s8 axis_y; | 114 | s8 axis_y; |
| 66 | s8 axis_z; | 115 | s8 axis_z; |
| 116 | #define LIS3_USE_REGULATOR_CTRL 0x01 | ||
| 117 | #define LIS3_USE_BLOCK_READ 0x02 | ||
| 118 | u16 driver_features; | ||
| 119 | int default_rate; | ||
| 67 | int (*setup_resources)(void); | 120 | int (*setup_resources)(void); |
| 68 | int (*release_resources)(void); | 121 | int (*release_resources)(void); |
| 69 | /* Limits for selftest are specified in chip data sheet */ | 122 | /* Limits for selftest are specified in chip data sheet */ |
diff --git a/include/linux/list.h b/include/linux/list.h index 5d57a3a1fa1b..9a5f8a71810c 100644 --- a/include/linux/list.h +++ b/include/linux/list.h | |||
| @@ -1,10 +1,10 @@ | |||
| 1 | #ifndef _LINUX_LIST_H | 1 | #ifndef _LINUX_LIST_H |
| 2 | #define _LINUX_LIST_H | 2 | #define _LINUX_LIST_H |
| 3 | 3 | ||
| 4 | #include <linux/types.h> | ||
| 4 | #include <linux/stddef.h> | 5 | #include <linux/stddef.h> |
| 5 | #include <linux/poison.h> | 6 | #include <linux/poison.h> |
| 6 | #include <linux/prefetch.h> | 7 | #include <linux/prefetch.h> |
| 7 | #include <asm/system.h> | ||
| 8 | 8 | ||
| 9 | /* | 9 | /* |
| 10 | * Simple doubly linked list implementation. | 10 | * Simple doubly linked list implementation. |
| @@ -16,10 +16,6 @@ | |||
| 16 | * using the generic single-entry routines. | 16 | * using the generic single-entry routines. |
| 17 | */ | 17 | */ |
| 18 | 18 | ||
| 19 | struct list_head { | ||
| 20 | struct list_head *next, *prev; | ||
| 21 | }; | ||
| 22 | |||
| 23 | #define LIST_HEAD_INIT(name) { &(name), &(name) } | 19 | #define LIST_HEAD_INIT(name) { &(name), &(name) } |
| 24 | 20 | ||
| 25 | #define LIST_HEAD(name) \ | 21 | #define LIST_HEAD(name) \ |
| @@ -566,14 +562,6 @@ static inline void list_splice_tail_init(struct list_head *list, | |||
| 566 | * You lose the ability to access the tail in O(1). | 562 | * You lose the ability to access the tail in O(1). |
| 567 | */ | 563 | */ |
| 568 | 564 | ||
| 569 | struct hlist_head { | ||
| 570 | struct hlist_node *first; | ||
| 571 | }; | ||
| 572 | |||
| 573 | struct hlist_node { | ||
| 574 | struct hlist_node *next, **pprev; | ||
| 575 | }; | ||
| 576 | |||
| 577 | #define HLIST_HEAD_INIT { .first = NULL } | 565 | #define HLIST_HEAD_INIT { .first = NULL } |
| 578 | #define HLIST_HEAD(name) struct hlist_head name = { .first = NULL } | 566 | #define HLIST_HEAD(name) struct hlist_head name = { .first = NULL } |
| 579 | #define INIT_HLIST_HEAD(ptr) ((ptr)->first = NULL) | 567 | #define INIT_HLIST_HEAD(ptr) ((ptr)->first = NULL) |
| @@ -648,6 +636,12 @@ static inline void hlist_add_after(struct hlist_node *n, | |||
| 648 | next->next->pprev = &next->next; | 636 | next->next->pprev = &next->next; |
| 649 | } | 637 | } |
| 650 | 638 | ||
| 639 | /* after that we'll appear to be on some hlist and hlist_del will work */ | ||
| 640 | static inline void hlist_add_fake(struct hlist_node *n) | ||
| 641 | { | ||
| 642 | n->pprev = &n->next; | ||
| 643 | } | ||
| 644 | |||
| 651 | /* | 645 | /* |
| 652 | * Move a list from one list head to another. Fixup the pprev | 646 | * Move a list from one list head to another. Fixup the pprev |
| 653 | * reference of the first entry if it exists. | 647 | * reference of the first entry if it exists. |
diff --git a/include/linux/lockdep.h b/include/linux/lockdep.h index 06aed8305bf3..71c09b26c759 100644 --- a/include/linux/lockdep.h +++ b/include/linux/lockdep.h | |||
| @@ -32,6 +32,17 @@ extern int lock_stat; | |||
| 32 | #define MAX_LOCKDEP_SUBCLASSES 8UL | 32 | #define MAX_LOCKDEP_SUBCLASSES 8UL |
| 33 | 33 | ||
| 34 | /* | 34 | /* |
| 35 | * NR_LOCKDEP_CACHING_CLASSES ... Number of classes | ||
| 36 | * cached in the instance of lockdep_map | ||
| 37 | * | ||
| 38 | * Currently main class (subclass == 0) and signle depth subclass | ||
| 39 | * are cached in lockdep_map. This optimization is mainly targeting | ||
| 40 | * on rq->lock. double_rq_lock() acquires this highly competitive with | ||
| 41 | * single depth. | ||
| 42 | */ | ||
| 43 | #define NR_LOCKDEP_CACHING_CLASSES 2 | ||
| 44 | |||
| 45 | /* | ||
| 35 | * Lock-classes are keyed via unique addresses, by embedding the | 46 | * Lock-classes are keyed via unique addresses, by embedding the |
| 36 | * lockclass-key into the kernel (or module) .data section. (For | 47 | * lockclass-key into the kernel (or module) .data section. (For |
| 37 | * static locks we use the lock address itself as the key.) | 48 | * static locks we use the lock address itself as the key.) |
| @@ -138,7 +149,7 @@ void clear_lock_stats(struct lock_class *class); | |||
| 138 | */ | 149 | */ |
| 139 | struct lockdep_map { | 150 | struct lockdep_map { |
| 140 | struct lock_class_key *key; | 151 | struct lock_class_key *key; |
| 141 | struct lock_class *class_cache; | 152 | struct lock_class *class_cache[NR_LOCKDEP_CACHING_CLASSES]; |
| 142 | const char *name; | 153 | const char *name; |
| 143 | #ifdef CONFIG_LOCK_STAT | 154 | #ifdef CONFIG_LOCK_STAT |
| 144 | int cpu; | 155 | int cpu; |
| @@ -424,14 +435,6 @@ do { \ | |||
| 424 | 435 | ||
| 425 | #endif /* CONFIG_LOCKDEP */ | 436 | #endif /* CONFIG_LOCKDEP */ |
| 426 | 437 | ||
| 427 | #ifdef CONFIG_GENERIC_HARDIRQS | ||
| 428 | extern void early_init_irq_lock_class(void); | ||
| 429 | #else | ||
| 430 | static inline void early_init_irq_lock_class(void) | ||
| 431 | { | ||
| 432 | } | ||
| 433 | #endif | ||
| 434 | |||
| 435 | #ifdef CONFIG_TRACE_IRQFLAGS | 438 | #ifdef CONFIG_TRACE_IRQFLAGS |
| 436 | extern void early_boot_irqs_off(void); | 439 | extern void early_boot_irqs_off(void); |
| 437 | extern void early_boot_irqs_on(void); | 440 | extern void early_boot_irqs_on(void); |
diff --git a/include/linux/lru_cache.h b/include/linux/lru_cache.h index de48d167568b..78fbf24f357a 100644 --- a/include/linux/lru_cache.h +++ b/include/linux/lru_cache.h | |||
| @@ -262,7 +262,7 @@ extern void lc_seq_dump_details(struct seq_file *seq, struct lru_cache *lc, char | |||
| 262 | * @lc: the lru cache to operate on | 262 | * @lc: the lru cache to operate on |
| 263 | * | 263 | * |
| 264 | * Note that the reference counts and order on the active and lru lists may | 264 | * Note that the reference counts and order on the active and lru lists may |
| 265 | * still change. Returns true if we aquired the lock. | 265 | * still change. Returns true if we acquired the lock. |
| 266 | */ | 266 | */ |
| 267 | static inline int lc_try_lock(struct lru_cache *lc) | 267 | static inline int lc_try_lock(struct lru_cache *lc) |
| 268 | { | 268 | { |
diff --git a/include/linux/lsm_audit.h b/include/linux/lsm_audit.h index 6907251d5200..112a55033352 100644 --- a/include/linux/lsm_audit.h +++ b/include/linux/lsm_audit.h | |||
| @@ -90,10 +90,42 @@ struct common_audit_data { | |||
| 90 | u32 requested; | 90 | u32 requested; |
| 91 | u32 audited; | 91 | u32 audited; |
| 92 | u32 denied; | 92 | u32 denied; |
| 93 | /* | ||
| 94 | * auditdeny is a bit tricky and unintuitive. See the | ||
| 95 | * comments in avc.c for it's meaning and usage. | ||
| 96 | */ | ||
| 97 | u32 auditdeny; | ||
| 93 | struct av_decision *avd; | 98 | struct av_decision *avd; |
| 94 | int result; | 99 | int result; |
| 95 | } selinux_audit_data; | 100 | } selinux_audit_data; |
| 96 | #endif | 101 | #endif |
| 102 | #ifdef CONFIG_SECURITY_APPARMOR | ||
| 103 | struct { | ||
| 104 | int error; | ||
| 105 | int op; | ||
| 106 | int type; | ||
| 107 | void *profile; | ||
| 108 | const char *name; | ||
| 109 | const char *info; | ||
| 110 | union { | ||
| 111 | void *target; | ||
| 112 | struct { | ||
| 113 | long pos; | ||
| 114 | void *target; | ||
| 115 | } iface; | ||
| 116 | struct { | ||
| 117 | int rlim; | ||
| 118 | unsigned long max; | ||
| 119 | } rlim; | ||
| 120 | struct { | ||
| 121 | const char *target; | ||
| 122 | u32 request; | ||
| 123 | u32 denied; | ||
| 124 | uid_t ouid; | ||
| 125 | } fs; | ||
| 126 | }; | ||
| 127 | } apparmor_audit_data; | ||
| 128 | #endif | ||
| 97 | }; | 129 | }; |
| 98 | /* these callback will be implemented by a specific LSM */ | 130 | /* these callback will be implemented by a specific LSM */ |
| 99 | void (*lsm_pre_audit)(struct audit_buffer *, void *); | 131 | void (*lsm_pre_audit)(struct audit_buffer *, void *); |
diff --git a/include/linux/mISDNif.h b/include/linux/mISDNif.h index 78c3bed1c3f5..b5e7f2202484 100644 --- a/include/linux/mISDNif.h +++ b/include/linux/mISDNif.h | |||
| @@ -251,7 +251,7 @@ | |||
| 251 | struct mISDNhead { | 251 | struct mISDNhead { |
| 252 | unsigned int prim; | 252 | unsigned int prim; |
| 253 | unsigned int id; | 253 | unsigned int id; |
| 254 | } __attribute__((packed)); | 254 | } __packed; |
| 255 | 255 | ||
| 256 | #define MISDN_HEADER_LEN sizeof(struct mISDNhead) | 256 | #define MISDN_HEADER_LEN sizeof(struct mISDNhead) |
| 257 | #define MAX_DATA_SIZE 2048 | 257 | #define MAX_DATA_SIZE 2048 |
diff --git a/include/linux/magic.h b/include/linux/magic.h index eb9800f05782..ff690d05f129 100644 --- a/include/linux/magic.h +++ b/include/linux/magic.h | |||
| @@ -57,5 +57,6 @@ | |||
| 57 | 57 | ||
| 58 | #define DEVPTS_SUPER_MAGIC 0x1cd1 | 58 | #define DEVPTS_SUPER_MAGIC 0x1cd1 |
| 59 | #define SOCKFS_MAGIC 0x534F434B | 59 | #define SOCKFS_MAGIC 0x534F434B |
| 60 | #define V9FS_MAGIC 0x01021997 | ||
| 60 | 61 | ||
| 61 | #endif /* __LINUX_MAGIC_H__ */ | 62 | #endif /* __LINUX_MAGIC_H__ */ |
diff --git a/include/linux/marvell_phy.h b/include/linux/marvell_phy.h new file mode 100644 index 000000000000..d0f08018335d --- /dev/null +++ b/include/linux/marvell_phy.h | |||
| @@ -0,0 +1,21 @@ | |||
| 1 | #ifndef _MARVELL_PHY_H | ||
| 2 | #define _MARVELL_PHY_H | ||
| 3 | |||
| 4 | /* Mask used for ID comparisons */ | ||
| 5 | #define MARVELL_PHY_ID_MASK 0xfffffff0 | ||
| 6 | |||
| 7 | /* Known PHY IDs */ | ||
| 8 | #define MARVELL_PHY_ID_88E1101 0x01410c60 | ||
| 9 | #define MARVELL_PHY_ID_88E1112 0x01410c90 | ||
| 10 | #define MARVELL_PHY_ID_88E1111 0x01410cc0 | ||
| 11 | #define MARVELL_PHY_ID_88E1118 0x01410e10 | ||
| 12 | #define MARVELL_PHY_ID_88E1121R 0x01410cb0 | ||
| 13 | #define MARVELL_PHY_ID_88E1145 0x01410cd0 | ||
| 14 | #define MARVELL_PHY_ID_88E1240 0x01410e30 | ||
| 15 | #define MARVELL_PHY_ID_88EC048 0x01410e90 | ||
| 16 | |||
| 17 | /* struct phy_device dev_flags definitions */ | ||
| 18 | #define MARVELL_PHY_M1145_FLAGS_RESISTANCE 0x00000001 | ||
| 19 | #define MARVELL_PHY_M1118_DNS323_LEDS 0x00000002 | ||
| 20 | |||
| 21 | #endif /* _MARVELL_PHY_H */ | ||
diff --git a/include/linux/math64.h b/include/linux/math64.h index c87f1528703a..23fcdfcba81b 100644 --- a/include/linux/math64.h +++ b/include/linux/math64.h | |||
| @@ -35,6 +35,14 @@ static inline u64 div64_u64(u64 dividend, u64 divisor) | |||
| 35 | return dividend / divisor; | 35 | return dividend / divisor; |
| 36 | } | 36 | } |
| 37 | 37 | ||
| 38 | /** | ||
| 39 | * div64_s64 - signed 64bit divide with 64bit divisor | ||
| 40 | */ | ||
| 41 | static inline s64 div64_s64(s64 dividend, s64 divisor) | ||
| 42 | { | ||
| 43 | return dividend / divisor; | ||
| 44 | } | ||
| 45 | |||
| 38 | #elif BITS_PER_LONG == 32 | 46 | #elif BITS_PER_LONG == 32 |
| 39 | 47 | ||
| 40 | #ifndef div_u64_rem | 48 | #ifndef div_u64_rem |
| @@ -53,6 +61,10 @@ extern s64 div_s64_rem(s64 dividend, s32 divisor, s32 *remainder); | |||
| 53 | extern u64 div64_u64(u64 dividend, u64 divisor); | 61 | extern u64 div64_u64(u64 dividend, u64 divisor); |
| 54 | #endif | 62 | #endif |
| 55 | 63 | ||
| 64 | #ifndef div64_s64 | ||
| 65 | extern s64 div64_s64(s64 dividend, s64 divisor); | ||
| 66 | #endif | ||
| 67 | |||
| 56 | #endif /* BITS_PER_LONG */ | 68 | #endif /* BITS_PER_LONG */ |
| 57 | 69 | ||
| 58 | /** | 70 | /** |
diff --git a/include/linux/mbcache.h b/include/linux/mbcache.h index a09b84e4fdb4..54cbbac1e71d 100644 --- a/include/linux/mbcache.h +++ b/include/linux/mbcache.h | |||
| @@ -4,9 +4,6 @@ | |||
| 4 | (C) 2001 by Andreas Gruenbacher, <a.gruenbacher@computer.org> | 4 | (C) 2001 by Andreas Gruenbacher, <a.gruenbacher@computer.org> |
| 5 | */ | 5 | */ |
| 6 | 6 | ||
| 7 | /* Hardwire the number of additional indexes */ | ||
| 8 | #define MB_CACHE_INDEXES_COUNT 1 | ||
| 9 | |||
| 10 | struct mb_cache_entry { | 7 | struct mb_cache_entry { |
| 11 | struct list_head e_lru_list; | 8 | struct list_head e_lru_list; |
| 12 | struct mb_cache *e_cache; | 9 | struct mb_cache *e_cache; |
| @@ -18,17 +15,12 @@ struct mb_cache_entry { | |||
| 18 | struct { | 15 | struct { |
| 19 | struct list_head o_list; | 16 | struct list_head o_list; |
| 20 | unsigned int o_key; | 17 | unsigned int o_key; |
| 21 | } e_indexes[0]; | 18 | } e_index; |
| 22 | }; | ||
| 23 | |||
| 24 | struct mb_cache_op { | ||
| 25 | int (*free)(struct mb_cache_entry *, gfp_t); | ||
| 26 | }; | 19 | }; |
| 27 | 20 | ||
| 28 | /* Functions on caches */ | 21 | /* Functions on caches */ |
| 29 | 22 | ||
| 30 | struct mb_cache * mb_cache_create(const char *, struct mb_cache_op *, size_t, | 23 | struct mb_cache *mb_cache_create(const char *, int); |
| 31 | int, int); | ||
| 32 | void mb_cache_shrink(struct block_device *); | 24 | void mb_cache_shrink(struct block_device *); |
| 33 | void mb_cache_destroy(struct mb_cache *); | 25 | void mb_cache_destroy(struct mb_cache *); |
| 34 | 26 | ||
| @@ -36,17 +28,15 @@ void mb_cache_destroy(struct mb_cache *); | |||
| 36 | 28 | ||
| 37 | struct mb_cache_entry *mb_cache_entry_alloc(struct mb_cache *, gfp_t); | 29 | struct mb_cache_entry *mb_cache_entry_alloc(struct mb_cache *, gfp_t); |
| 38 | int mb_cache_entry_insert(struct mb_cache_entry *, struct block_device *, | 30 | int mb_cache_entry_insert(struct mb_cache_entry *, struct block_device *, |
| 39 | sector_t, unsigned int[]); | 31 | sector_t, unsigned int); |
| 40 | void mb_cache_entry_release(struct mb_cache_entry *); | 32 | void mb_cache_entry_release(struct mb_cache_entry *); |
| 41 | void mb_cache_entry_free(struct mb_cache_entry *); | 33 | void mb_cache_entry_free(struct mb_cache_entry *); |
| 42 | struct mb_cache_entry *mb_cache_entry_get(struct mb_cache *, | 34 | struct mb_cache_entry *mb_cache_entry_get(struct mb_cache *, |
| 43 | struct block_device *, | 35 | struct block_device *, |
| 44 | sector_t); | 36 | sector_t); |
| 45 | #if !defined(MB_CACHE_INDEXES_COUNT) || (MB_CACHE_INDEXES_COUNT > 0) | 37 | struct mb_cache_entry *mb_cache_entry_find_first(struct mb_cache *cache, |
| 46 | struct mb_cache_entry *mb_cache_entry_find_first(struct mb_cache *cache, int, | ||
| 47 | struct block_device *, | 38 | struct block_device *, |
| 48 | unsigned int); | 39 | unsigned int); |
| 49 | struct mb_cache_entry *mb_cache_entry_find_next(struct mb_cache_entry *, int, | 40 | struct mb_cache_entry *mb_cache_entry_find_next(struct mb_cache_entry *, |
| 50 | struct block_device *, | 41 | struct block_device *, |
| 51 | unsigned int); | 42 | unsigned int); |
| 52 | #endif | ||
diff --git a/include/linux/memblock.h b/include/linux/memblock.h index a59faf2b5edd..62a10c2a11f2 100644 --- a/include/linux/memblock.h +++ b/include/linux/memblock.h | |||
| @@ -2,6 +2,7 @@ | |||
| 2 | #define _LINUX_MEMBLOCK_H | 2 | #define _LINUX_MEMBLOCK_H |
| 3 | #ifdef __KERNEL__ | 3 | #ifdef __KERNEL__ |
| 4 | 4 | ||
| 5 | #ifdef CONFIG_HAVE_MEMBLOCK | ||
| 5 | /* | 6 | /* |
| 6 | * Logical memory blocks. | 7 | * Logical memory blocks. |
| 7 | * | 8 | * |
| @@ -16,73 +17,150 @@ | |||
| 16 | #include <linux/init.h> | 17 | #include <linux/init.h> |
| 17 | #include <linux/mm.h> | 18 | #include <linux/mm.h> |
| 18 | 19 | ||
| 19 | #define MAX_MEMBLOCK_REGIONS 128 | 20 | #include <asm/memblock.h> |
| 20 | 21 | ||
| 21 | struct memblock_property { | 22 | #define INIT_MEMBLOCK_REGIONS 128 |
| 22 | u64 base; | 23 | #define MEMBLOCK_ERROR 0 |
| 23 | u64 size; | ||
| 24 | }; | ||
| 25 | 24 | ||
| 26 | struct memblock_region { | 25 | struct memblock_region { |
| 27 | unsigned long cnt; | 26 | phys_addr_t base; |
| 28 | u64 size; | 27 | phys_addr_t size; |
| 29 | struct memblock_property region[MAX_MEMBLOCK_REGIONS+1]; | 28 | }; |
| 29 | |||
| 30 | struct memblock_type { | ||
| 31 | unsigned long cnt; /* number of regions */ | ||
| 32 | unsigned long max; /* size of the allocated array */ | ||
| 33 | struct memblock_region *regions; | ||
| 30 | }; | 34 | }; |
| 31 | 35 | ||
| 32 | struct memblock { | 36 | struct memblock { |
| 33 | unsigned long debug; | 37 | phys_addr_t current_limit; |
| 34 | u64 rmo_size; | 38 | phys_addr_t memory_size; /* Updated by memblock_analyze() */ |
| 35 | struct memblock_region memory; | 39 | struct memblock_type memory; |
| 36 | struct memblock_region reserved; | 40 | struct memblock_type reserved; |
| 37 | }; | 41 | }; |
| 38 | 42 | ||
| 39 | extern struct memblock memblock; | 43 | extern struct memblock memblock; |
| 44 | extern int memblock_debug; | ||
| 45 | extern int memblock_can_resize; | ||
| 40 | 46 | ||
| 41 | extern void __init memblock_init(void); | 47 | #define memblock_dbg(fmt, ...) \ |
| 42 | extern void __init memblock_analyze(void); | 48 | if (memblock_debug) printk(KERN_INFO pr_fmt(fmt), ##__VA_ARGS__) |
| 43 | extern long memblock_add(u64 base, u64 size); | 49 | |
| 44 | extern long memblock_remove(u64 base, u64 size); | 50 | u64 memblock_find_in_range(u64 start, u64 end, u64 size, u64 align); |
| 45 | extern long __init memblock_free(u64 base, u64 size); | 51 | int memblock_free_reserved_regions(void); |
| 46 | extern long __init memblock_reserve(u64 base, u64 size); | 52 | int memblock_reserve_reserved_regions(void); |
| 47 | extern u64 __init memblock_alloc_nid(u64 size, u64 align, int nid, | 53 | |
| 48 | u64 (*nid_range)(u64, u64, int *)); | 54 | extern void memblock_init(void); |
| 49 | extern u64 __init memblock_alloc(u64 size, u64 align); | 55 | extern void memblock_analyze(void); |
| 50 | extern u64 __init memblock_alloc_base(u64 size, | 56 | extern long memblock_add(phys_addr_t base, phys_addr_t size); |
| 51 | u64, u64 max_addr); | 57 | extern long memblock_remove(phys_addr_t base, phys_addr_t size); |
| 52 | extern u64 __init __memblock_alloc_base(u64 size, | 58 | extern long memblock_free(phys_addr_t base, phys_addr_t size); |
| 53 | u64 align, u64 max_addr); | 59 | extern long memblock_reserve(phys_addr_t base, phys_addr_t size); |
| 54 | extern u64 __init memblock_phys_mem_size(void); | 60 | |
| 55 | extern u64 memblock_end_of_DRAM(void); | 61 | /* The numa aware allocator is only available if |
| 56 | extern void __init memblock_enforce_memory_limit(u64 memory_limit); | 62 | * CONFIG_ARCH_POPULATES_NODE_MAP is set |
| 57 | extern int __init memblock_is_reserved(u64 addr); | 63 | */ |
| 58 | extern int memblock_is_region_reserved(u64 base, u64 size); | 64 | extern phys_addr_t memblock_alloc_nid(phys_addr_t size, phys_addr_t align, |
| 59 | extern int memblock_find(struct memblock_property *res); | 65 | int nid); |
| 66 | extern phys_addr_t memblock_alloc_try_nid(phys_addr_t size, phys_addr_t align, | ||
| 67 | int nid); | ||
| 68 | |||
| 69 | extern phys_addr_t memblock_alloc(phys_addr_t size, phys_addr_t align); | ||
| 70 | |||
| 71 | /* Flags for memblock_alloc_base() amd __memblock_alloc_base() */ | ||
| 72 | #define MEMBLOCK_ALLOC_ANYWHERE (~(phys_addr_t)0) | ||
| 73 | #define MEMBLOCK_ALLOC_ACCESSIBLE 0 | ||
| 74 | |||
| 75 | extern phys_addr_t memblock_alloc_base(phys_addr_t size, | ||
| 76 | phys_addr_t align, | ||
| 77 | phys_addr_t max_addr); | ||
| 78 | extern phys_addr_t __memblock_alloc_base(phys_addr_t size, | ||
| 79 | phys_addr_t align, | ||
| 80 | phys_addr_t max_addr); | ||
| 81 | extern phys_addr_t memblock_phys_mem_size(void); | ||
| 82 | extern phys_addr_t memblock_end_of_DRAM(void); | ||
| 83 | extern void memblock_enforce_memory_limit(phys_addr_t memory_limit); | ||
| 84 | extern int memblock_is_memory(phys_addr_t addr); | ||
| 85 | extern int memblock_is_region_memory(phys_addr_t base, phys_addr_t size); | ||
| 86 | extern int memblock_is_reserved(phys_addr_t addr); | ||
| 87 | extern int memblock_is_region_reserved(phys_addr_t base, phys_addr_t size); | ||
| 60 | 88 | ||
| 61 | extern void memblock_dump_all(void); | 89 | extern void memblock_dump_all(void); |
| 62 | 90 | ||
| 63 | static inline u64 | 91 | /* Provided by the architecture */ |
| 64 | memblock_size_bytes(struct memblock_region *type, unsigned long region_nr) | 92 | extern phys_addr_t memblock_nid_range(phys_addr_t start, phys_addr_t end, int *nid); |
| 93 | extern int memblock_memory_can_coalesce(phys_addr_t addr1, phys_addr_t size1, | ||
| 94 | phys_addr_t addr2, phys_addr_t size2); | ||
| 95 | |||
| 96 | /** | ||
| 97 | * memblock_set_current_limit - Set the current allocation limit to allow | ||
| 98 | * limiting allocations to what is currently | ||
| 99 | * accessible during boot | ||
| 100 | * @limit: New limit value (physical address) | ||
| 101 | */ | ||
| 102 | extern void memblock_set_current_limit(phys_addr_t limit); | ||
| 103 | |||
| 104 | |||
| 105 | /* | ||
| 106 | * pfn conversion functions | ||
| 107 | * | ||
| 108 | * While the memory MEMBLOCKs should always be page aligned, the reserved | ||
| 109 | * MEMBLOCKs may not be. This accessor attempt to provide a very clear | ||
| 110 | * idea of what they return for such non aligned MEMBLOCKs. | ||
| 111 | */ | ||
| 112 | |||
| 113 | /** | ||
| 114 | * memblock_region_memory_base_pfn - Return the lowest pfn intersecting with the memory region | ||
| 115 | * @reg: memblock_region structure | ||
| 116 | */ | ||
| 117 | static inline unsigned long memblock_region_memory_base_pfn(const struct memblock_region *reg) | ||
| 65 | { | 118 | { |
| 66 | return type->region[region_nr].size; | 119 | return PFN_UP(reg->base); |
| 67 | } | 120 | } |
| 68 | static inline u64 | 121 | |
| 69 | memblock_size_pages(struct memblock_region *type, unsigned long region_nr) | 122 | /** |
| 123 | * memblock_region_memory_end_pfn - Return the end_pfn this region | ||
| 124 | * @reg: memblock_region structure | ||
| 125 | */ | ||
| 126 | static inline unsigned long memblock_region_memory_end_pfn(const struct memblock_region *reg) | ||
| 70 | { | 127 | { |
| 71 | return memblock_size_bytes(type, region_nr) >> PAGE_SHIFT; | 128 | return PFN_DOWN(reg->base + reg->size); |
| 72 | } | 129 | } |
| 73 | static inline u64 | 130 | |
| 74 | memblock_start_pfn(struct memblock_region *type, unsigned long region_nr) | 131 | /** |
| 132 | * memblock_region_reserved_base_pfn - Return the lowest pfn intersecting with the reserved region | ||
| 133 | * @reg: memblock_region structure | ||
| 134 | */ | ||
| 135 | static inline unsigned long memblock_region_reserved_base_pfn(const struct memblock_region *reg) | ||
| 75 | { | 136 | { |
| 76 | return type->region[region_nr].base >> PAGE_SHIFT; | 137 | return PFN_DOWN(reg->base); |
| 77 | } | 138 | } |
| 78 | static inline u64 | 139 | |
| 79 | memblock_end_pfn(struct memblock_region *type, unsigned long region_nr) | 140 | /** |
| 141 | * memblock_region_reserved_end_pfn - Return the end_pfn this region | ||
| 142 | * @reg: memblock_region structure | ||
| 143 | */ | ||
| 144 | static inline unsigned long memblock_region_reserved_end_pfn(const struct memblock_region *reg) | ||
| 80 | { | 145 | { |
| 81 | return memblock_start_pfn(type, region_nr) + | 146 | return PFN_UP(reg->base + reg->size); |
| 82 | memblock_size_pages(type, region_nr); | ||
| 83 | } | 147 | } |
| 84 | 148 | ||
| 85 | #include <asm/memblock.h> | 149 | #define for_each_memblock(memblock_type, region) \ |
| 150 | for (region = memblock.memblock_type.regions; \ | ||
| 151 | region < (memblock.memblock_type.regions + memblock.memblock_type.cnt); \ | ||
| 152 | region++) | ||
| 153 | |||
| 154 | |||
| 155 | #ifdef ARCH_DISCARD_MEMBLOCK | ||
| 156 | #define __init_memblock __init | ||
| 157 | #define __initdata_memblock __initdata | ||
| 158 | #else | ||
| 159 | #define __init_memblock | ||
| 160 | #define __initdata_memblock | ||
| 161 | #endif | ||
| 162 | |||
| 163 | #endif /* CONFIG_HAVE_MEMBLOCK */ | ||
| 86 | 164 | ||
| 87 | #endif /* __KERNEL__ */ | 165 | #endif /* __KERNEL__ */ |
| 88 | 166 | ||
diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h index 9411d32840b0..159a0762aeaf 100644 --- a/include/linux/memcontrol.h +++ b/include/linux/memcontrol.h | |||
| @@ -98,11 +98,6 @@ extern void mem_cgroup_end_migration(struct mem_cgroup *mem, | |||
| 98 | /* | 98 | /* |
| 99 | * For memory reclaim. | 99 | * For memory reclaim. |
| 100 | */ | 100 | */ |
| 101 | extern int mem_cgroup_get_reclaim_priority(struct mem_cgroup *mem); | ||
| 102 | extern void mem_cgroup_note_reclaim_priority(struct mem_cgroup *mem, | ||
| 103 | int priority); | ||
| 104 | extern void mem_cgroup_record_reclaim_priority(struct mem_cgroup *mem, | ||
| 105 | int priority); | ||
| 106 | int mem_cgroup_inactive_anon_is_low(struct mem_cgroup *memcg); | 101 | int mem_cgroup_inactive_anon_is_low(struct mem_cgroup *memcg); |
| 107 | int mem_cgroup_inactive_file_is_low(struct mem_cgroup *memcg); | 102 | int mem_cgroup_inactive_file_is_low(struct mem_cgroup *memcg); |
| 108 | unsigned long mem_cgroup_zone_nr_pages(struct mem_cgroup *memcg, | 103 | unsigned long mem_cgroup_zone_nr_pages(struct mem_cgroup *memcg, |
| @@ -128,8 +123,9 @@ static inline bool mem_cgroup_disabled(void) | |||
| 128 | 123 | ||
| 129 | void mem_cgroup_update_file_mapped(struct page *page, int val); | 124 | void mem_cgroup_update_file_mapped(struct page *page, int val); |
| 130 | unsigned long mem_cgroup_soft_limit_reclaim(struct zone *zone, int order, | 125 | unsigned long mem_cgroup_soft_limit_reclaim(struct zone *zone, int order, |
| 131 | gfp_t gfp_mask, int nid, | 126 | gfp_t gfp_mask); |
| 132 | int zid); | 127 | u64 mem_cgroup_get_limit(struct mem_cgroup *mem); |
| 128 | |||
| 133 | #else /* CONFIG_CGROUP_MEM_RES_CTLR */ | 129 | #else /* CONFIG_CGROUP_MEM_RES_CTLR */ |
| 134 | struct mem_cgroup; | 130 | struct mem_cgroup; |
| 135 | 131 | ||
| @@ -304,7 +300,13 @@ static inline void mem_cgroup_update_file_mapped(struct page *page, | |||
| 304 | 300 | ||
| 305 | static inline | 301 | static inline |
| 306 | unsigned long mem_cgroup_soft_limit_reclaim(struct zone *zone, int order, | 302 | unsigned long mem_cgroup_soft_limit_reclaim(struct zone *zone, int order, |
| 307 | gfp_t gfp_mask, int nid, int zid) | 303 | gfp_t gfp_mask) |
| 304 | { | ||
| 305 | return 0; | ||
| 306 | } | ||
| 307 | |||
| 308 | static inline | ||
| 309 | u64 mem_cgroup_get_limit(struct mem_cgroup *mem) | ||
| 308 | { | 310 | { |
| 309 | return 0; | 311 | return 0; |
| 310 | } | 312 | } |
diff --git a/include/linux/memory.h b/include/linux/memory.h index 85582e1bcee9..06c1fa0a5c7b 100644 --- a/include/linux/memory.h +++ b/include/linux/memory.h | |||
| @@ -23,6 +23,8 @@ | |||
| 23 | struct memory_block { | 23 | struct memory_block { |
| 24 | unsigned long phys_index; | 24 | unsigned long phys_index; |
| 25 | unsigned long state; | 25 | unsigned long state; |
| 26 | int section_count; | ||
| 27 | |||
| 26 | /* | 28 | /* |
| 27 | * This serializes all state change requests. It isn't | 29 | * This serializes all state change requests. It isn't |
| 28 | * held during creation because the control files are | 30 | * held during creation because the control files are |
| @@ -113,6 +115,8 @@ extern int memory_dev_init(void); | |||
| 113 | extern int remove_memory_block(unsigned long, struct mem_section *, int); | 115 | extern int remove_memory_block(unsigned long, struct mem_section *, int); |
| 114 | extern int memory_notify(unsigned long val, void *v); | 116 | extern int memory_notify(unsigned long val, void *v); |
| 115 | extern int memory_isolate_notify(unsigned long val, void *v); | 117 | extern int memory_isolate_notify(unsigned long val, void *v); |
| 118 | extern struct memory_block *find_memory_block_hinted(struct mem_section *, | ||
| 119 | struct memory_block *); | ||
| 116 | extern struct memory_block *find_memory_block(struct mem_section *); | 120 | extern struct memory_block *find_memory_block(struct mem_section *); |
| 117 | #define CONFIG_MEM_BLOCK_SIZE (PAGES_PER_SECTION<<PAGE_SHIFT) | 121 | #define CONFIG_MEM_BLOCK_SIZE (PAGES_PER_SECTION<<PAGE_SHIFT) |
| 118 | enum mem_add_context { BOOT, HOTPLUG }; | 122 | enum mem_add_context { BOOT, HOTPLUG }; |
diff --git a/include/linux/memory_hotplug.h b/include/linux/memory_hotplug.h index 864035fb8f8a..4307231bd22f 100644 --- a/include/linux/memory_hotplug.h +++ b/include/linux/memory_hotplug.h | |||
| @@ -70,6 +70,10 @@ extern void online_page(struct page *page); | |||
| 70 | extern int online_pages(unsigned long, unsigned long); | 70 | extern int online_pages(unsigned long, unsigned long); |
| 71 | extern void __offline_isolated_pages(unsigned long, unsigned long); | 71 | extern void __offline_isolated_pages(unsigned long, unsigned long); |
| 72 | 72 | ||
| 73 | #ifdef CONFIG_MEMORY_HOTREMOVE | ||
| 74 | extern bool is_pageblock_removable_nolock(struct page *page); | ||
| 75 | #endif /* CONFIG_MEMORY_HOTREMOVE */ | ||
| 76 | |||
| 73 | /* reasonably generic interface to expand the physical pages in a zone */ | 77 | /* reasonably generic interface to expand the physical pages in a zone */ |
| 74 | extern int __add_pages(int nid, struct zone *zone, unsigned long start_pfn, | 78 | extern int __add_pages(int nid, struct zone *zone, unsigned long start_pfn, |
| 75 | unsigned long nr_pages); | 79 | unsigned long nr_pages); |
diff --git a/include/linux/mempolicy.h b/include/linux/mempolicy.h index 7b9ef6bf45aa..31ac26ca4acf 100644 --- a/include/linux/mempolicy.h +++ b/include/linux/mempolicy.h | |||
| @@ -210,6 +210,8 @@ extern struct zonelist *huge_zonelist(struct vm_area_struct *vma, | |||
| 210 | unsigned long addr, gfp_t gfp_flags, | 210 | unsigned long addr, gfp_t gfp_flags, |
| 211 | struct mempolicy **mpol, nodemask_t **nodemask); | 211 | struct mempolicy **mpol, nodemask_t **nodemask); |
| 212 | extern bool init_nodemask_of_mempolicy(nodemask_t *mask); | 212 | extern bool init_nodemask_of_mempolicy(nodemask_t *mask); |
| 213 | extern bool mempolicy_nodemask_intersects(struct task_struct *tsk, | ||
| 214 | const nodemask_t *mask); | ||
| 213 | extern unsigned slab_node(struct mempolicy *policy); | 215 | extern unsigned slab_node(struct mempolicy *policy); |
| 214 | 216 | ||
| 215 | extern enum zone_type policy_zone; | 217 | extern enum zone_type policy_zone; |
| @@ -338,7 +340,16 @@ static inline struct zonelist *huge_zonelist(struct vm_area_struct *vma, | |||
| 338 | return node_zonelist(0, gfp_flags); | 340 | return node_zonelist(0, gfp_flags); |
| 339 | } | 341 | } |
| 340 | 342 | ||
| 341 | static inline bool init_nodemask_of_mempolicy(nodemask_t *m) { return false; } | 343 | static inline bool init_nodemask_of_mempolicy(nodemask_t *m) |
| 344 | { | ||
| 345 | return false; | ||
| 346 | } | ||
| 347 | |||
| 348 | static inline bool mempolicy_nodemask_intersects(struct task_struct *tsk, | ||
| 349 | const nodemask_t *mask) | ||
| 350 | { | ||
| 351 | return false; | ||
| 352 | } | ||
| 342 | 353 | ||
| 343 | static inline int do_migrate_pages(struct mm_struct *mm, | 354 | static inline int do_migrate_pages(struct mm_struct *mm, |
| 344 | const nodemask_t *from_nodes, | 355 | const nodemask_t *from_nodes, |
diff --git a/include/linux/mfd/ab8500.h b/include/linux/mfd/ab8500.h index b63ff3ba3351..f5cec4500f38 100644 --- a/include/linux/mfd/ab8500.h +++ b/include/linux/mfd/ab8500.h | |||
| @@ -76,6 +76,8 @@ | |||
| 76 | #define AB8500_NR_IRQS 104 | 76 | #define AB8500_NR_IRQS 104 |
| 77 | #define AB8500_NUM_IRQ_REGS 13 | 77 | #define AB8500_NUM_IRQ_REGS 13 |
| 78 | 78 | ||
| 79 | #define AB8500_NUM_REGULATORS 15 | ||
| 80 | |||
| 79 | /** | 81 | /** |
| 80 | * struct ab8500 - ab8500 internal structure | 82 | * struct ab8500 - ab8500 internal structure |
| 81 | * @dev: parent device | 83 | * @dev: parent device |
| @@ -108,14 +110,18 @@ struct ab8500 { | |||
| 108 | u8 oldmask[AB8500_NUM_IRQ_REGS]; | 110 | u8 oldmask[AB8500_NUM_IRQ_REGS]; |
| 109 | }; | 111 | }; |
| 110 | 112 | ||
| 113 | struct regulator_init_data; | ||
| 114 | |||
| 111 | /** | 115 | /** |
| 112 | * struct ab8500_platform_data - AB8500 platform data | 116 | * struct ab8500_platform_data - AB8500 platform data |
| 113 | * @irq_base: start of AB8500 IRQs, AB8500_NR_IRQS will be used | 117 | * @irq_base: start of AB8500 IRQs, AB8500_NR_IRQS will be used |
| 114 | * @init: board-specific initialization after detection of ab8500 | 118 | * @init: board-specific initialization after detection of ab8500 |
| 119 | * @regulator: machine-specific constraints for regulators | ||
| 115 | */ | 120 | */ |
| 116 | struct ab8500_platform_data { | 121 | struct ab8500_platform_data { |
| 117 | int irq_base; | 122 | int irq_base; |
| 118 | void (*init) (struct ab8500 *); | 123 | void (*init) (struct ab8500 *); |
| 124 | struct regulator_init_data *regulator[AB8500_NUM_REGULATORS]; | ||
| 119 | }; | 125 | }; |
| 120 | 126 | ||
| 121 | extern int ab8500_write(struct ab8500 *a8500, u16 addr, u8 data); | 127 | extern int ab8500_write(struct ab8500 *a8500, u16 addr, u8 data); |
diff --git a/include/linux/mfd/max8998-private.h b/include/linux/mfd/max8998-private.h new file mode 100644 index 000000000000..6dc75b3e2d33 --- /dev/null +++ b/include/linux/mfd/max8998-private.h | |||
| @@ -0,0 +1,112 @@ | |||
| 1 | /* | ||
| 2 | * max8698.h - Voltage regulator driver for the Maxim 8998 | ||
| 3 | * | ||
| 4 | * Copyright (C) 2009-2010 Samsung Electrnoics | ||
| 5 | * Kyungmin Park <kyungmin.park@samsung.com> | ||
| 6 | * Marek Szyprowski <m.szyprowski@samsung.com> | ||
| 7 | * | ||
| 8 | * This program is free software; you can redistribute it and/or modify | ||
| 9 | * it under the terms of the GNU General Public License as published by | ||
| 10 | * the Free Software Foundation; either version 2 of the License, or | ||
| 11 | * (at your option) any later version. | ||
| 12 | * | ||
| 13 | * This program is distributed in the hope that it will be useful, | ||
| 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 16 | * GNU General Public License for more details. | ||
| 17 | * | ||
| 18 | * You should have received a copy of the GNU General Public License | ||
| 19 | * along with this program; if not, write to the Free Software | ||
| 20 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 21 | */ | ||
| 22 | |||
| 23 | #ifndef __LINUX_MFD_MAX8998_PRIV_H | ||
| 24 | #define __LINUX_MFD_MAX8998_PRIV_H | ||
| 25 | |||
| 26 | /* MAX 8998 registers */ | ||
| 27 | enum { | ||
| 28 | MAX8998_REG_IRQ1, | ||
| 29 | MAX8998_REG_IRQ2, | ||
| 30 | MAX8998_REG_IRQ3, | ||
| 31 | MAX8998_REG_IRQ4, | ||
| 32 | MAX8998_REG_IRQM1, | ||
| 33 | MAX8998_REG_IRQM2, | ||
| 34 | MAX8998_REG_IRQM3, | ||
| 35 | MAX8998_REG_IRQM4, | ||
| 36 | MAX8998_REG_STATUS1, | ||
| 37 | MAX8998_REG_STATUS2, | ||
| 38 | MAX8998_REG_STATUSM1, | ||
| 39 | MAX8998_REG_STATUSM2, | ||
| 40 | MAX8998_REG_CHGR1, | ||
| 41 | MAX8998_REG_CHGR2, | ||
| 42 | MAX8998_REG_LDO_ACTIVE_DISCHARGE1, | ||
| 43 | MAX8998_REG_LDO_ACTIVE_DISCHARGE2, | ||
| 44 | MAX8998_REG_BUCK_ACTIVE_DISCHARGE3, | ||
| 45 | MAX8998_REG_ONOFF1, | ||
| 46 | MAX8998_REG_ONOFF2, | ||
| 47 | MAX8998_REG_ONOFF3, | ||
| 48 | MAX8998_REG_ONOFF4, | ||
| 49 | MAX8998_REG_BUCK1_DVSARM1, | ||
| 50 | MAX8998_REG_BUCK1_DVSARM2, | ||
| 51 | MAX8998_REG_BUCK1_DVSARM3, | ||
| 52 | MAX8998_REG_BUCK1_DVSARM4, | ||
| 53 | MAX8998_REG_BUCK2_DVSINT1, | ||
| 54 | MAX8998_REG_BUCK2_DVSINT2, | ||
| 55 | MAX8998_REG_BUCK3, | ||
| 56 | MAX8998_REG_BUCK4, | ||
| 57 | MAX8998_REG_LDO2_LDO3, | ||
| 58 | MAX8998_REG_LDO4, | ||
| 59 | MAX8998_REG_LDO5, | ||
| 60 | MAX8998_REG_LDO6, | ||
| 61 | MAX8998_REG_LDO7, | ||
| 62 | MAX8998_REG_LDO8_LDO9, | ||
| 63 | MAX8998_REG_LDO10_LDO11, | ||
| 64 | MAX8998_REG_LDO12, | ||
| 65 | MAX8998_REG_LDO13, | ||
| 66 | MAX8998_REG_LDO14, | ||
| 67 | MAX8998_REG_LDO15, | ||
| 68 | MAX8998_REG_LDO16, | ||
| 69 | MAX8998_REG_LDO17, | ||
| 70 | MAX8998_REG_BKCHR, | ||
| 71 | MAX8998_REG_LBCNFG1, | ||
| 72 | MAX8998_REG_LBCNFG2, | ||
| 73 | }; | ||
| 74 | |||
| 75 | /** | ||
| 76 | * struct max8998_dev - max8998 master device for sub-drivers | ||
| 77 | * @dev: master device of the chip (can be used to access platform data) | ||
| 78 | * @i2c_client: i2c client private data | ||
| 79 | * @dev_read(): chip register read function | ||
| 80 | * @dev_write(): chip register write function | ||
| 81 | * @dev_update(): chip register update function | ||
| 82 | * @iolock: mutex for serializing io access | ||
| 83 | */ | ||
| 84 | |||
| 85 | struct max8998_dev { | ||
| 86 | struct device *dev; | ||
| 87 | struct i2c_client *i2c_client; | ||
| 88 | int (*dev_read)(struct max8998_dev *max8998, u8 reg, u8 *dest); | ||
| 89 | int (*dev_write)(struct max8998_dev *max8998, u8 reg, u8 val); | ||
| 90 | int (*dev_update)(struct max8998_dev *max8998, u8 reg, u8 val, u8 mask); | ||
| 91 | struct mutex iolock; | ||
| 92 | }; | ||
| 93 | |||
| 94 | static inline int max8998_read_reg(struct max8998_dev *max8998, u8 reg, | ||
| 95 | u8 *value) | ||
| 96 | { | ||
| 97 | return max8998->dev_read(max8998, reg, value); | ||
| 98 | } | ||
| 99 | |||
| 100 | static inline int max8998_write_reg(struct max8998_dev *max8998, u8 reg, | ||
| 101 | u8 value) | ||
| 102 | { | ||
| 103 | return max8998->dev_write(max8998, reg, value); | ||
| 104 | } | ||
| 105 | |||
| 106 | static inline int max8998_update_reg(struct max8998_dev *max8998, u8 reg, | ||
| 107 | u8 value, u8 mask) | ||
| 108 | { | ||
| 109 | return max8998->dev_update(max8998, reg, value, mask); | ||
| 110 | } | ||
| 111 | |||
| 112 | #endif /* __LINUX_MFD_MAX8998_PRIV_H */ | ||
diff --git a/include/linux/mfd/max8998.h b/include/linux/mfd/max8998.h new file mode 100644 index 000000000000..1d3601a2d853 --- /dev/null +++ b/include/linux/mfd/max8998.h | |||
| @@ -0,0 +1,78 @@ | |||
| 1 | /* | ||
| 2 | * max8698.h - Voltage regulator driver for the Maxim 8998 | ||
| 3 | * | ||
| 4 | * Copyright (C) 2009-2010 Samsung Electrnoics | ||
| 5 | * Kyungmin Park <kyungmin.park@samsung.com> | ||
| 6 | * Marek Szyprowski <m.szyprowski@samsung.com> | ||
| 7 | * | ||
| 8 | * This program is free software; you can redistribute it and/or modify | ||
| 9 | * it under the terms of the GNU General Public License as published by | ||
| 10 | * the Free Software Foundation; either version 2 of the License, or | ||
| 11 | * (at your option) any later version. | ||
| 12 | * | ||
| 13 | * This program is distributed in the hope that it will be useful, | ||
| 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 16 | * GNU General Public License for more details. | ||
| 17 | * | ||
| 18 | * You should have received a copy of the GNU General Public License | ||
| 19 | * along with this program; if not, write to the Free Software | ||
| 20 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 21 | */ | ||
| 22 | |||
| 23 | #ifndef __LINUX_MFD_MAX8998_H | ||
| 24 | #define __LINUX_MFD_MAX8998_H | ||
| 25 | |||
| 26 | #include <linux/regulator/machine.h> | ||
| 27 | |||
| 28 | /* MAX 8998 regulator ids */ | ||
| 29 | enum { | ||
| 30 | MAX8998_LDO2 = 2, | ||
| 31 | MAX8998_LDO3, | ||
| 32 | MAX8998_LDO4, | ||
| 33 | MAX8998_LDO5, | ||
| 34 | MAX8998_LDO6, | ||
| 35 | MAX8998_LDO7, | ||
| 36 | MAX8998_LDO8, | ||
| 37 | MAX8998_LDO9, | ||
| 38 | MAX8998_LDO10, | ||
| 39 | MAX8998_LDO11, | ||
| 40 | MAX8998_LDO12, | ||
| 41 | MAX8998_LDO13, | ||
| 42 | MAX8998_LDO14, | ||
| 43 | MAX8998_LDO15, | ||
| 44 | MAX8998_LDO16, | ||
| 45 | MAX8998_LDO17, | ||
| 46 | MAX8998_BUCK1, | ||
| 47 | MAX8998_BUCK2, | ||
| 48 | MAX8998_BUCK3, | ||
| 49 | MAX8998_BUCK4, | ||
| 50 | MAX8998_EN32KHZ_AP, | ||
| 51 | MAX8998_EN32KHZ_CP, | ||
| 52 | MAX8998_ENVICHG, | ||
| 53 | MAX8998_ESAFEOUT1, | ||
| 54 | MAX8998_ESAFEOUT2, | ||
| 55 | }; | ||
| 56 | |||
| 57 | /** | ||
| 58 | * max8998_regulator_data - regulator data | ||
| 59 | * @id: regulator id | ||
| 60 | * @initdata: regulator init data (contraints, supplies, ...) | ||
| 61 | */ | ||
| 62 | struct max8998_regulator_data { | ||
| 63 | int id; | ||
| 64 | struct regulator_init_data *initdata; | ||
| 65 | }; | ||
| 66 | |||
| 67 | /** | ||
| 68 | * struct max8998_board - packages regulator init data | ||
| 69 | * @num_regulators: number of regultors used | ||
| 70 | * @regulators: array of defined regulators | ||
| 71 | */ | ||
| 72 | |||
| 73 | struct max8998_platform_data { | ||
| 74 | int num_regulators; | ||
| 75 | struct max8998_regulator_data *regulators; | ||
| 76 | }; | ||
| 77 | |||
| 78 | #endif /* __LINUX_MFD_MAX8998_H */ | ||
diff --git a/include/linux/mfd/mc13783-private.h b/include/linux/mfd/mc13783-private.h deleted file mode 100644 index 95cf9360553f..000000000000 --- a/include/linux/mfd/mc13783-private.h +++ /dev/null | |||
| @@ -1,220 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2009 Pengutronix, Sascha Hauer <s.hauer@pengutronix.de> | ||
| 3 | * | ||
| 4 | * Initial development of this code was funded by | ||
| 5 | * Phytec Messtechnik GmbH, http://www.phytec.de | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License as published by | ||
| 9 | * the Free Software Foundation; either version 2 of the License, or | ||
| 10 | * (at your option) any later version. | ||
| 11 | * | ||
| 12 | * This program is distributed in the hope that it will be useful, | ||
| 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 15 | * GNU General Public License for more details. | ||
| 16 | * | ||
| 17 | * You should have received a copy of the GNU General Public License | ||
| 18 | * along with this program; if not, write to the Free Software | ||
| 19 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
| 20 | */ | ||
| 21 | |||
| 22 | #ifndef __LINUX_MFD_MC13783_PRIV_H | ||
| 23 | #define __LINUX_MFD_MC13783_PRIV_H | ||
| 24 | |||
| 25 | #include <linux/platform_device.h> | ||
| 26 | #include <linux/mfd/mc13783.h> | ||
| 27 | #include <linux/mutex.h> | ||
| 28 | #include <linux/interrupt.h> | ||
| 29 | |||
| 30 | struct mc13783 { | ||
| 31 | struct spi_device *spidev; | ||
| 32 | struct mutex lock; | ||
| 33 | int irq; | ||
| 34 | int flags; | ||
| 35 | |||
| 36 | irq_handler_t irqhandler[MC13783_NUM_IRQ]; | ||
| 37 | void *irqdata[MC13783_NUM_IRQ]; | ||
| 38 | |||
| 39 | /* XXX these should go as platformdata to the regulator subdevice */ | ||
| 40 | struct mc13783_regulator_init_data *regulators; | ||
| 41 | int num_regulators; | ||
| 42 | }; | ||
| 43 | |||
| 44 | #define MC13783_REG_INTERRUPT_STATUS_0 0 | ||
| 45 | #define MC13783_REG_INTERRUPT_MASK_0 1 | ||
| 46 | #define MC13783_REG_INTERRUPT_SENSE_0 2 | ||
| 47 | #define MC13783_REG_INTERRUPT_STATUS_1 3 | ||
| 48 | #define MC13783_REG_INTERRUPT_MASK_1 4 | ||
| 49 | #define MC13783_REG_INTERRUPT_SENSE_1 5 | ||
| 50 | #define MC13783_REG_POWER_UP_MODE_SENSE 6 | ||
| 51 | #define MC13783_REG_REVISION 7 | ||
| 52 | #define MC13783_REG_SEMAPHORE 8 | ||
| 53 | #define MC13783_REG_ARBITRATION_PERIPHERAL_AUDIO 9 | ||
| 54 | #define MC13783_REG_ARBITRATION_SWITCHERS 10 | ||
| 55 | #define MC13783_REG_ARBITRATION_REGULATORS_0 11 | ||
| 56 | #define MC13783_REG_ARBITRATION_REGULATORS_1 12 | ||
| 57 | #define MC13783_REG_POWER_CONTROL_0 13 | ||
| 58 | #define MC13783_REG_POWER_CONTROL_1 14 | ||
| 59 | #define MC13783_REG_POWER_CONTROL_2 15 | ||
| 60 | #define MC13783_REG_REGEN_ASSIGNMENT 16 | ||
| 61 | #define MC13783_REG_CONTROL_SPARE 17 | ||
| 62 | #define MC13783_REG_MEMORY_A 18 | ||
| 63 | #define MC13783_REG_MEMORY_B 19 | ||
| 64 | #define MC13783_REG_RTC_TIME 20 | ||
| 65 | #define MC13783_REG_RTC_ALARM 21 | ||
| 66 | #define MC13783_REG_RTC_DAY 22 | ||
| 67 | #define MC13783_REG_RTC_DAY_ALARM 23 | ||
| 68 | #define MC13783_REG_SWITCHERS_0 24 | ||
| 69 | #define MC13783_REG_SWITCHERS_1 25 | ||
| 70 | #define MC13783_REG_SWITCHERS_2 26 | ||
| 71 | #define MC13783_REG_SWITCHERS_3 27 | ||
| 72 | #define MC13783_REG_SWITCHERS_4 28 | ||
| 73 | #define MC13783_REG_SWITCHERS_5 29 | ||
| 74 | #define MC13783_REG_REGULATOR_SETTING_0 30 | ||
| 75 | #define MC13783_REG_REGULATOR_SETTING_1 31 | ||
| 76 | #define MC13783_REG_REGULATOR_MODE_0 32 | ||
| 77 | #define MC13783_REG_REGULATOR_MODE_1 33 | ||
| 78 | #define MC13783_REG_POWER_MISCELLANEOUS 34 | ||
| 79 | #define MC13783_REG_POWER_SPARE 35 | ||
| 80 | #define MC13783_REG_AUDIO_RX_0 36 | ||
| 81 | #define MC13783_REG_AUDIO_RX_1 37 | ||
| 82 | #define MC13783_REG_AUDIO_TX 38 | ||
| 83 | #define MC13783_REG_AUDIO_SSI_NETWORK 39 | ||
| 84 | #define MC13783_REG_AUDIO_CODEC 40 | ||
| 85 | #define MC13783_REG_AUDIO_STEREO_DAC 41 | ||
| 86 | #define MC13783_REG_AUDIO_SPARE 42 | ||
| 87 | #define MC13783_REG_ADC_0 43 | ||
| 88 | #define MC13783_REG_ADC_1 44 | ||
| 89 | #define MC13783_REG_ADC_2 45 | ||
| 90 | #define MC13783_REG_ADC_3 46 | ||
| 91 | #define MC13783_REG_ADC_4 47 | ||
| 92 | #define MC13783_REG_CHARGER 48 | ||
| 93 | #define MC13783_REG_USB 49 | ||
| 94 | #define MC13783_REG_CHARGE_USB_SPARE 50 | ||
| 95 | #define MC13783_REG_LED_CONTROL_0 51 | ||
| 96 | #define MC13783_REG_LED_CONTROL_1 52 | ||
| 97 | #define MC13783_REG_LED_CONTROL_2 53 | ||
| 98 | #define MC13783_REG_LED_CONTROL_3 54 | ||
| 99 | #define MC13783_REG_LED_CONTROL_4 55 | ||
| 100 | #define MC13783_REG_LED_CONTROL_5 56 | ||
| 101 | #define MC13783_REG_SPARE 57 | ||
| 102 | #define MC13783_REG_TRIM_0 58 | ||
| 103 | #define MC13783_REG_TRIM_1 59 | ||
| 104 | #define MC13783_REG_TEST_0 60 | ||
| 105 | #define MC13783_REG_TEST_1 61 | ||
| 106 | #define MC13783_REG_TEST_2 62 | ||
| 107 | #define MC13783_REG_TEST_3 63 | ||
| 108 | #define MC13783_REG_NB 64 | ||
| 109 | |||
| 110 | /* | ||
| 111 | * Reg Regulator Mode 0 | ||
| 112 | */ | ||
| 113 | #define MC13783_REGCTRL_VAUDIO_EN (1 << 0) | ||
| 114 | #define MC13783_REGCTRL_VAUDIO_STBY (1 << 1) | ||
| 115 | #define MC13783_REGCTRL_VAUDIO_MODE (1 << 2) | ||
| 116 | #define MC13783_REGCTRL_VIOHI_EN (1 << 3) | ||
| 117 | #define MC13783_REGCTRL_VIOHI_STBY (1 << 4) | ||
| 118 | #define MC13783_REGCTRL_VIOHI_MODE (1 << 5) | ||
| 119 | #define MC13783_REGCTRL_VIOLO_EN (1 << 6) | ||
| 120 | #define MC13783_REGCTRL_VIOLO_STBY (1 << 7) | ||
| 121 | #define MC13783_REGCTRL_VIOLO_MODE (1 << 8) | ||
| 122 | #define MC13783_REGCTRL_VDIG_EN (1 << 9) | ||
| 123 | #define MC13783_REGCTRL_VDIG_STBY (1 << 10) | ||
| 124 | #define MC13783_REGCTRL_VDIG_MODE (1 << 11) | ||
| 125 | #define MC13783_REGCTRL_VGEN_EN (1 << 12) | ||
| 126 | #define MC13783_REGCTRL_VGEN_STBY (1 << 13) | ||
| 127 | #define MC13783_REGCTRL_VGEN_MODE (1 << 14) | ||
| 128 | #define MC13783_REGCTRL_VRFDIG_EN (1 << 15) | ||
| 129 | #define MC13783_REGCTRL_VRFDIG_STBY (1 << 16) | ||
| 130 | #define MC13783_REGCTRL_VRFDIG_MODE (1 << 17) | ||
| 131 | #define MC13783_REGCTRL_VRFREF_EN (1 << 18) | ||
| 132 | #define MC13783_REGCTRL_VRFREF_STBY (1 << 19) | ||
| 133 | #define MC13783_REGCTRL_VRFREF_MODE (1 << 20) | ||
| 134 | #define MC13783_REGCTRL_VRFCP_EN (1 << 21) | ||
| 135 | #define MC13783_REGCTRL_VRFCP_STBY (1 << 22) | ||
| 136 | #define MC13783_REGCTRL_VRFCP_MODE (1 << 23) | ||
| 137 | |||
| 138 | /* | ||
| 139 | * Reg Regulator Mode 1 | ||
| 140 | */ | ||
| 141 | #define MC13783_REGCTRL_VSIM_EN (1 << 0) | ||
| 142 | #define MC13783_REGCTRL_VSIM_STBY (1 << 1) | ||
| 143 | #define MC13783_REGCTRL_VSIM_MODE (1 << 2) | ||
| 144 | #define MC13783_REGCTRL_VESIM_EN (1 << 3) | ||
| 145 | #define MC13783_REGCTRL_VESIM_STBY (1 << 4) | ||
| 146 | #define MC13783_REGCTRL_VESIM_MODE (1 << 5) | ||
| 147 | #define MC13783_REGCTRL_VCAM_EN (1 << 6) | ||
| 148 | #define MC13783_REGCTRL_VCAM_STBY (1 << 7) | ||
| 149 | #define MC13783_REGCTRL_VCAM_MODE (1 << 8) | ||
| 150 | #define MC13783_REGCTRL_VRFBG_EN (1 << 9) | ||
| 151 | #define MC13783_REGCTRL_VRFBG_STBY (1 << 10) | ||
| 152 | #define MC13783_REGCTRL_VVIB_EN (1 << 11) | ||
| 153 | #define MC13783_REGCTRL_VRF1_EN (1 << 12) | ||
| 154 | #define MC13783_REGCTRL_VRF1_STBY (1 << 13) | ||
| 155 | #define MC13783_REGCTRL_VRF1_MODE (1 << 14) | ||
| 156 | #define MC13783_REGCTRL_VRF2_EN (1 << 15) | ||
| 157 | #define MC13783_REGCTRL_VRF2_STBY (1 << 16) | ||
| 158 | #define MC13783_REGCTRL_VRF2_MODE (1 << 17) | ||
| 159 | #define MC13783_REGCTRL_VMMC1_EN (1 << 18) | ||
| 160 | #define MC13783_REGCTRL_VMMC1_STBY (1 << 19) | ||
| 161 | #define MC13783_REGCTRL_VMMC1_MODE (1 << 20) | ||
| 162 | #define MC13783_REGCTRL_VMMC2_EN (1 << 21) | ||
| 163 | #define MC13783_REGCTRL_VMMC2_STBY (1 << 22) | ||
| 164 | #define MC13783_REGCTRL_VMMC2_MODE (1 << 23) | ||
| 165 | |||
| 166 | /* | ||
| 167 | * Reg Regulator Misc. | ||
| 168 | */ | ||
| 169 | #define MC13783_REGCTRL_GPO1_EN (1 << 6) | ||
| 170 | #define MC13783_REGCTRL_GPO2_EN (1 << 8) | ||
| 171 | #define MC13783_REGCTRL_GPO3_EN (1 << 10) | ||
| 172 | #define MC13783_REGCTRL_GPO4_EN (1 << 12) | ||
| 173 | #define MC13783_REGCTRL_VIBPINCTRL (1 << 14) | ||
| 174 | |||
| 175 | /* | ||
| 176 | * Reg Switcher 4 | ||
| 177 | */ | ||
| 178 | #define MC13783_SWCTRL_SW1A_MODE (1 << 0) | ||
| 179 | #define MC13783_SWCTRL_SW1A_STBY_MODE (1 << 2) | ||
| 180 | #define MC13783_SWCTRL_SW1A_DVS_SPEED (1 << 6) | ||
| 181 | #define MC13783_SWCTRL_SW1A_PANIC_MODE (1 << 8) | ||
| 182 | #define MC13783_SWCTRL_SW1A_SOFTSTART (1 << 9) | ||
| 183 | #define MC13783_SWCTRL_SW1B_MODE (1 << 10) | ||
| 184 | #define MC13783_SWCTRL_SW1B_STBY_MODE (1 << 12) | ||
| 185 | #define MC13783_SWCTRL_SW1B_DVS_SPEED (1 << 14) | ||
| 186 | #define MC13783_SWCTRL_SW1B_PANIC_MODE (1 << 16) | ||
| 187 | #define MC13783_SWCTRL_SW1B_SOFTSTART (1 << 17) | ||
| 188 | #define MC13783_SWCTRL_PLL_EN (1 << 18) | ||
| 189 | #define MC13783_SWCTRL_PLL_FACTOR (1 << 19) | ||
| 190 | |||
| 191 | /* | ||
| 192 | * Reg Switcher 5 | ||
| 193 | */ | ||
| 194 | #define MC13783_SWCTRL_SW2A_MODE (1 << 0) | ||
| 195 | #define MC13783_SWCTRL_SW2A_STBY_MODE (1 << 2) | ||
| 196 | #define MC13783_SWCTRL_SW2A_DVS_SPEED (1 << 6) | ||
| 197 | #define MC13783_SWCTRL_SW2A_PANIC_MODE (1 << 8) | ||
| 198 | #define MC13783_SWCTRL_SW2A_SOFTSTART (1 << 9) | ||
| 199 | #define MC13783_SWCTRL_SW2B_MODE (1 << 10) | ||
| 200 | #define MC13783_SWCTRL_SW2B_STBY_MODE (1 << 12) | ||
| 201 | #define MC13783_SWCTRL_SW2B_DVS_SPEED (1 << 14) | ||
| 202 | #define MC13783_SWCTRL_SW2B_PANIC_MODE (1 << 16) | ||
| 203 | #define MC13783_SWCTRL_SW2B_SOFTSTART (1 << 17) | ||
| 204 | #define MC13783_SWSET_SW3 (1 << 18) | ||
| 205 | #define MC13783_SWCTRL_SW3_EN (1 << 20) | ||
| 206 | #define MC13783_SWCTRL_SW3_STBY (1 << 21) | ||
| 207 | #define MC13783_SWCTRL_SW3_MODE (1 << 22) | ||
| 208 | |||
| 209 | static inline int mc13783_set_bits(struct mc13783 *mc13783, unsigned int offset, | ||
| 210 | u32 mask, u32 val) | ||
| 211 | { | ||
| 212 | int ret; | ||
| 213 | mc13783_lock(mc13783); | ||
| 214 | ret = mc13783_reg_rmw(mc13783, offset, mask, val); | ||
| 215 | mc13783_unlock(mc13783); | ||
| 216 | |||
| 217 | return ret; | ||
| 218 | } | ||
| 219 | |||
| 220 | #endif /* __LINUX_MFD_MC13783_PRIV_H */ | ||
diff --git a/include/linux/mfd/mc13783.h b/include/linux/mfd/mc13783.h index 4a894f688549..0fa44fb8dd26 100644 --- a/include/linux/mfd/mc13783.h +++ b/include/linux/mfd/mc13783.h | |||
| @@ -21,6 +21,8 @@ int mc13783_reg_write(struct mc13783 *mc13783, unsigned int offset, u32 val); | |||
| 21 | int mc13783_reg_rmw(struct mc13783 *mc13783, unsigned int offset, | 21 | int mc13783_reg_rmw(struct mc13783 *mc13783, unsigned int offset, |
| 22 | u32 mask, u32 val); | 22 | u32 mask, u32 val); |
| 23 | 23 | ||
| 24 | int mc13783_get_flags(struct mc13783 *mc13783); | ||
| 25 | |||
| 24 | int mc13783_irq_request(struct mc13783 *mc13783, int irq, | 26 | int mc13783_irq_request(struct mc13783 *mc13783, int irq, |
| 25 | irq_handler_t handler, const char *name, void *dev); | 27 | irq_handler_t handler, const char *name, void *dev); |
| 26 | int mc13783_irq_request_nounmask(struct mc13783 *mc13783, int irq, | 28 | int mc13783_irq_request_nounmask(struct mc13783 *mc13783, int irq, |
diff --git a/include/linux/mfd/stmpe.h b/include/linux/mfd/stmpe.h new file mode 100644 index 000000000000..39ca7588659b --- /dev/null +++ b/include/linux/mfd/stmpe.h | |||
| @@ -0,0 +1,201 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) ST-Ericsson SA 2010 | ||
| 3 | * | ||
| 4 | * License Terms: GNU General Public License, version 2 | ||
| 5 | * Author: Rabin Vincent <rabin.vincent@stericsson.com> for ST-Ericsson | ||
| 6 | */ | ||
| 7 | |||
| 8 | #ifndef __LINUX_MFD_STMPE_H | ||
| 9 | #define __LINUX_MFD_STMPE_H | ||
| 10 | |||
| 11 | #include <linux/device.h> | ||
| 12 | |||
| 13 | enum stmpe_block { | ||
| 14 | STMPE_BLOCK_GPIO = 1 << 0, | ||
| 15 | STMPE_BLOCK_KEYPAD = 1 << 1, | ||
| 16 | STMPE_BLOCK_TOUCHSCREEN = 1 << 2, | ||
| 17 | STMPE_BLOCK_ADC = 1 << 3, | ||
| 18 | STMPE_BLOCK_PWM = 1 << 4, | ||
| 19 | STMPE_BLOCK_ROTATOR = 1 << 5, | ||
| 20 | }; | ||
| 21 | |||
| 22 | enum stmpe_partnum { | ||
| 23 | STMPE811, | ||
| 24 | STMPE1601, | ||
| 25 | STMPE2401, | ||
| 26 | STMPE2403, | ||
| 27 | }; | ||
| 28 | |||
| 29 | /* | ||
| 30 | * For registers whose locations differ on variants, the correct address is | ||
| 31 | * obtained by indexing stmpe->regs with one of the following. | ||
| 32 | */ | ||
| 33 | enum { | ||
| 34 | STMPE_IDX_CHIP_ID, | ||
| 35 | STMPE_IDX_ICR_LSB, | ||
| 36 | STMPE_IDX_IER_LSB, | ||
| 37 | STMPE_IDX_ISR_MSB, | ||
| 38 | STMPE_IDX_GPMR_LSB, | ||
| 39 | STMPE_IDX_GPSR_LSB, | ||
| 40 | STMPE_IDX_GPCR_LSB, | ||
| 41 | STMPE_IDX_GPDR_LSB, | ||
| 42 | STMPE_IDX_GPEDR_MSB, | ||
| 43 | STMPE_IDX_GPRER_LSB, | ||
| 44 | STMPE_IDX_GPFER_LSB, | ||
| 45 | STMPE_IDX_GPAFR_U_MSB, | ||
| 46 | STMPE_IDX_IEGPIOR_LSB, | ||
| 47 | STMPE_IDX_ISGPIOR_MSB, | ||
| 48 | STMPE_IDX_MAX, | ||
| 49 | }; | ||
| 50 | |||
| 51 | |||
| 52 | struct stmpe_variant_info; | ||
| 53 | |||
| 54 | /** | ||
| 55 | * struct stmpe - STMPE MFD structure | ||
| 56 | * @lock: lock protecting I/O operations | ||
| 57 | * @irq_lock: IRQ bus lock | ||
| 58 | * @dev: device, mostly for dev_dbg() | ||
| 59 | * @i2c: i2c client | ||
| 60 | * @variant: the detected STMPE model number | ||
| 61 | * @regs: list of addresses of registers which are at different addresses on | ||
| 62 | * different variants. Indexed by one of STMPE_IDX_*. | ||
| 63 | * @irq_base: starting IRQ number for internal IRQs | ||
| 64 | * @num_gpios: number of gpios, differs for variants | ||
| 65 | * @ier: cache of IER registers for bus_lock | ||
| 66 | * @oldier: cache of IER registers for bus_lock | ||
| 67 | * @pdata: platform data | ||
| 68 | */ | ||
| 69 | struct stmpe { | ||
| 70 | struct mutex lock; | ||
| 71 | struct mutex irq_lock; | ||
| 72 | struct device *dev; | ||
| 73 | struct i2c_client *i2c; | ||
| 74 | enum stmpe_partnum partnum; | ||
| 75 | struct stmpe_variant_info *variant; | ||
| 76 | const u8 *regs; | ||
| 77 | |||
| 78 | int irq_base; | ||
| 79 | int num_gpios; | ||
| 80 | u8 ier[2]; | ||
| 81 | u8 oldier[2]; | ||
| 82 | struct stmpe_platform_data *pdata; | ||
| 83 | }; | ||
| 84 | |||
| 85 | extern int stmpe_reg_write(struct stmpe *stmpe, u8 reg, u8 data); | ||
| 86 | extern int stmpe_reg_read(struct stmpe *stmpe, u8 reg); | ||
| 87 | extern int stmpe_block_read(struct stmpe *stmpe, u8 reg, u8 length, | ||
| 88 | u8 *values); | ||
| 89 | extern int stmpe_block_write(struct stmpe *stmpe, u8 reg, u8 length, | ||
| 90 | const u8 *values); | ||
| 91 | extern int stmpe_set_bits(struct stmpe *stmpe, u8 reg, u8 mask, u8 val); | ||
| 92 | extern int stmpe_set_altfunc(struct stmpe *stmpe, u32 pins, | ||
| 93 | enum stmpe_block block); | ||
| 94 | extern int stmpe_enable(struct stmpe *stmpe, unsigned int blocks); | ||
| 95 | extern int stmpe_disable(struct stmpe *stmpe, unsigned int blocks); | ||
| 96 | |||
| 97 | struct matrix_keymap_data; | ||
| 98 | |||
| 99 | /** | ||
| 100 | * struct stmpe_keypad_platform_data - STMPE keypad platform data | ||
| 101 | * @keymap_data: key map table and size | ||
| 102 | * @debounce_ms: debounce interval, in ms. Maximum is | ||
| 103 | * %STMPE_KEYPAD_MAX_DEBOUNCE. | ||
| 104 | * @scan_count: number of key scanning cycles to confirm key data. | ||
| 105 | * Maximum is %STMPE_KEYPAD_MAX_SCAN_COUNT. | ||
| 106 | * @no_autorepeat: disable key autorepeat | ||
| 107 | */ | ||
| 108 | struct stmpe_keypad_platform_data { | ||
| 109 | struct matrix_keymap_data *keymap_data; | ||
| 110 | unsigned int debounce_ms; | ||
| 111 | unsigned int scan_count; | ||
| 112 | bool no_autorepeat; | ||
| 113 | }; | ||
| 114 | |||
| 115 | /** | ||
| 116 | * struct stmpe_gpio_platform_data - STMPE GPIO platform data | ||
| 117 | * @gpio_base: first gpio number assigned. A maximum of | ||
| 118 | * %STMPE_NR_GPIOS GPIOs will be allocated. | ||
| 119 | */ | ||
| 120 | struct stmpe_gpio_platform_data { | ||
| 121 | int gpio_base; | ||
| 122 | void (*setup)(struct stmpe *stmpe, unsigned gpio_base); | ||
| 123 | void (*remove)(struct stmpe *stmpe, unsigned gpio_base); | ||
| 124 | }; | ||
| 125 | |||
| 126 | /** | ||
| 127 | * struct stmpe_ts_platform_data - stmpe811 touch screen controller platform | ||
| 128 | * data | ||
| 129 | * @sample_time: ADC converstion time in number of clock. | ||
| 130 | * (0 -> 36 clocks, 1 -> 44 clocks, 2 -> 56 clocks, 3 -> 64 clocks, | ||
| 131 | * 4 -> 80 clocks, 5 -> 96 clocks, 6 -> 144 clocks), | ||
| 132 | * recommended is 4. | ||
| 133 | * @mod_12b: ADC Bit mode (0 -> 10bit ADC, 1 -> 12bit ADC) | ||
| 134 | * @ref_sel: ADC reference source | ||
| 135 | * (0 -> internal reference, 1 -> external reference) | ||
| 136 | * @adc_freq: ADC Clock speed | ||
| 137 | * (0 -> 1.625 MHz, 1 -> 3.25 MHz, 2 || 3 -> 6.5 MHz) | ||
| 138 | * @ave_ctrl: Sample average control | ||
| 139 | * (0 -> 1 sample, 1 -> 2 samples, 2 -> 4 samples, 3 -> 8 samples) | ||
| 140 | * @touch_det_delay: Touch detect interrupt delay | ||
| 141 | * (0 -> 10 us, 1 -> 50 us, 2 -> 100 us, 3 -> 500 us, | ||
| 142 | * 4-> 1 ms, 5 -> 5 ms, 6 -> 10 ms, 7 -> 50 ms) | ||
| 143 | * recommended is 3 | ||
| 144 | * @settling: Panel driver settling time | ||
| 145 | * (0 -> 10 us, 1 -> 100 us, 2 -> 500 us, 3 -> 1 ms, | ||
| 146 | * 4 -> 5 ms, 5 -> 10 ms, 6 for 50 ms, 7 -> 100 ms) | ||
| 147 | * recommended is 2 | ||
| 148 | * @fraction_z: Length of the fractional part in z | ||
| 149 | * (fraction_z ([0..7]) = Count of the fractional part) | ||
| 150 | * recommended is 7 | ||
| 151 | * @i_drive: current limit value of the touchscreen drivers | ||
| 152 | * (0 -> 20 mA typical 35 mA max, 1 -> 50 mA typical 80 mA max) | ||
| 153 | * | ||
| 154 | * */ | ||
| 155 | struct stmpe_ts_platform_data { | ||
| 156 | u8 sample_time; | ||
| 157 | u8 mod_12b; | ||
| 158 | u8 ref_sel; | ||
| 159 | u8 adc_freq; | ||
| 160 | u8 ave_ctrl; | ||
| 161 | u8 touch_det_delay; | ||
| 162 | u8 settling; | ||
| 163 | u8 fraction_z; | ||
| 164 | u8 i_drive; | ||
| 165 | }; | ||
| 166 | |||
| 167 | /** | ||
| 168 | * struct stmpe_platform_data - STMPE platform data | ||
| 169 | * @id: device id to distinguish between multiple STMPEs on the same board | ||
| 170 | * @blocks: bitmask of blocks to enable (use STMPE_BLOCK_*) | ||
| 171 | * @irq_trigger: IRQ trigger to use for the interrupt to the host | ||
| 172 | * @irq_invert_polarity: IRQ line is connected with reversed polarity | ||
| 173 | * @autosleep: bool to enable/disable stmpe autosleep | ||
| 174 | * @autosleep_timeout: inactivity timeout in milliseconds for autosleep | ||
| 175 | * @irq_base: base IRQ number. %STMPE_NR_IRQS irqs will be used, or | ||
| 176 | * %STMPE_NR_INTERNAL_IRQS if the GPIO driver is not used. | ||
| 177 | * @gpio: GPIO-specific platform data | ||
| 178 | * @keypad: keypad-specific platform data | ||
| 179 | * @ts: touchscreen-specific platform data | ||
| 180 | */ | ||
| 181 | struct stmpe_platform_data { | ||
| 182 | int id; | ||
| 183 | unsigned int blocks; | ||
| 184 | int irq_base; | ||
| 185 | unsigned int irq_trigger; | ||
| 186 | bool irq_invert_polarity; | ||
| 187 | bool autosleep; | ||
| 188 | int autosleep_timeout; | ||
| 189 | |||
| 190 | struct stmpe_gpio_platform_data *gpio; | ||
| 191 | struct stmpe_keypad_platform_data *keypad; | ||
| 192 | struct stmpe_ts_platform_data *ts; | ||
| 193 | }; | ||
| 194 | |||
| 195 | #define STMPE_NR_INTERNAL_IRQS 9 | ||
| 196 | #define STMPE_INT_GPIO(x) (STMPE_NR_INTERNAL_IRQS + (x)) | ||
| 197 | |||
| 198 | #define STMPE_NR_GPIOS 24 | ||
| 199 | #define STMPE_NR_IRQS STMPE_INT_GPIO(STMPE_NR_GPIOS) | ||
| 200 | |||
| 201 | #endif | ||
diff --git a/include/linux/mfd/tc35892.h b/include/linux/mfd/tc35892.h index e47f770d3068..eff3094ca84e 100644 --- a/include/linux/mfd/tc35892.h +++ b/include/linux/mfd/tc35892.h | |||
| @@ -111,9 +111,13 @@ extern int tc35892_set_bits(struct tc35892 *tc35892, u8 reg, u8 mask, u8 val); | |||
| 111 | * struct tc35892_gpio_platform_data - TC35892 GPIO platform data | 111 | * struct tc35892_gpio_platform_data - TC35892 GPIO platform data |
| 112 | * @gpio_base: first gpio number assigned to TC35892. A maximum of | 112 | * @gpio_base: first gpio number assigned to TC35892. A maximum of |
| 113 | * %TC35892_NR_GPIOS GPIOs will be allocated. | 113 | * %TC35892_NR_GPIOS GPIOs will be allocated. |
| 114 | * @setup: callback for board-specific initialization | ||
| 115 | * @remove: callback for board-specific teardown | ||
| 114 | */ | 116 | */ |
| 115 | struct tc35892_gpio_platform_data { | 117 | struct tc35892_gpio_platform_data { |
| 116 | int gpio_base; | 118 | int gpio_base; |
| 119 | void (*setup)(struct tc35892 *tc35892, unsigned gpio_base); | ||
| 120 | void (*remove)(struct tc35892 *tc35892, unsigned gpio_base); | ||
| 117 | }; | 121 | }; |
| 118 | 122 | ||
| 119 | /** | 123 | /** |
diff --git a/include/linux/mfd/tps6586x.h b/include/linux/mfd/tps6586x.h new file mode 100644 index 000000000000..772b3ae640af --- /dev/null +++ b/include/linux/mfd/tps6586x.h | |||
| @@ -0,0 +1,47 @@ | |||
| 1 | #ifndef __LINUX_MFD_TPS6586X_H | ||
| 2 | #define __LINUX_MFD_TPS6586X_H | ||
| 3 | |||
| 4 | enum { | ||
| 5 | TPS6586X_ID_SM_0, | ||
| 6 | TPS6586X_ID_SM_1, | ||
| 7 | TPS6586X_ID_SM_2, | ||
| 8 | TPS6586X_ID_LDO_0, | ||
| 9 | TPS6586X_ID_LDO_1, | ||
| 10 | TPS6586X_ID_LDO_2, | ||
| 11 | TPS6586X_ID_LDO_3, | ||
| 12 | TPS6586X_ID_LDO_4, | ||
| 13 | TPS6586X_ID_LDO_5, | ||
| 14 | TPS6586X_ID_LDO_6, | ||
| 15 | TPS6586X_ID_LDO_7, | ||
| 16 | TPS6586X_ID_LDO_8, | ||
| 17 | TPS6586X_ID_LDO_9, | ||
| 18 | TPS6586X_ID_LDO_RTC, | ||
| 19 | }; | ||
| 20 | |||
| 21 | struct tps6586x_subdev_info { | ||
| 22 | int id; | ||
| 23 | const char *name; | ||
| 24 | void *platform_data; | ||
| 25 | }; | ||
| 26 | |||
| 27 | struct tps6586x_platform_data { | ||
| 28 | int num_subdevs; | ||
| 29 | struct tps6586x_subdev_info *subdevs; | ||
| 30 | |||
| 31 | int gpio_base; | ||
| 32 | }; | ||
| 33 | |||
| 34 | /* | ||
| 35 | * NOTE: the functions below are not intended for use outside | ||
| 36 | * of the TPS6586X sub-device drivers | ||
| 37 | */ | ||
| 38 | extern int tps6586x_write(struct device *dev, int reg, uint8_t val); | ||
| 39 | extern int tps6586x_writes(struct device *dev, int reg, int len, uint8_t *val); | ||
| 40 | extern int tps6586x_read(struct device *dev, int reg, uint8_t *val); | ||
| 41 | extern int tps6586x_reads(struct device *dev, int reg, int len, uint8_t *val); | ||
| 42 | extern int tps6586x_set_bits(struct device *dev, int reg, uint8_t bit_mask); | ||
| 43 | extern int tps6586x_clr_bits(struct device *dev, int reg, uint8_t bit_mask); | ||
| 44 | extern int tps6586x_update(struct device *dev, int reg, uint8_t val, | ||
| 45 | uint8_t mask); | ||
| 46 | |||
| 47 | #endif /*__LINUX_MFD_TPS6586X_H */ | ||
diff --git a/include/linux/mfd/wm8994/gpio.h b/include/linux/mfd/wm8994/gpio.h index b4d4c22991e8..0c79b5ff4b5a 100644 --- a/include/linux/mfd/wm8994/gpio.h +++ b/include/linux/mfd/wm8994/gpio.h | |||
| @@ -36,6 +36,10 @@ | |||
| 36 | #define WM8994_GP_FN_WSEQ_STATUS 16 | 36 | #define WM8994_GP_FN_WSEQ_STATUS 16 |
| 37 | #define WM8994_GP_FN_FIFO_ERROR 17 | 37 | #define WM8994_GP_FN_FIFO_ERROR 17 |
| 38 | #define WM8994_GP_FN_OPCLK 18 | 38 | #define WM8994_GP_FN_OPCLK 18 |
| 39 | #define WM8994_GP_FN_THW 19 | ||
| 40 | #define WM8994_GP_FN_DCS_DONE 20 | ||
| 41 | #define WM8994_GP_FN_FLL1_OUT 21 | ||
| 42 | #define WM8994_GP_FN_FLL2_OUT 22 | ||
| 39 | 43 | ||
| 40 | #define WM8994_GPN_DIR 0x8000 /* GPN_DIR */ | 44 | #define WM8994_GPN_DIR 0x8000 /* GPN_DIR */ |
| 41 | #define WM8994_GPN_DIR_MASK 0x8000 /* GPN_DIR */ | 45 | #define WM8994_GPN_DIR_MASK 0x8000 /* GPN_DIR */ |
diff --git a/include/linux/migrate.h b/include/linux/migrate.h index 7238231b8dd4..085527fb8261 100644 --- a/include/linux/migrate.h +++ b/include/linux/migrate.h | |||
| @@ -14,6 +14,8 @@ extern int migrate_page(struct address_space *, | |||
| 14 | struct page *, struct page *); | 14 | struct page *, struct page *); |
| 15 | extern int migrate_pages(struct list_head *l, new_page_t x, | 15 | extern int migrate_pages(struct list_head *l, new_page_t x, |
| 16 | unsigned long private, int offlining); | 16 | unsigned long private, int offlining); |
| 17 | extern int migrate_huge_pages(struct list_head *l, new_page_t x, | ||
| 18 | unsigned long private, int offlining); | ||
| 17 | 19 | ||
| 18 | extern int fail_migrate_page(struct address_space *, | 20 | extern int fail_migrate_page(struct address_space *, |
| 19 | struct page *, struct page *); | 21 | struct page *, struct page *); |
| @@ -23,12 +25,17 @@ extern int migrate_prep_local(void); | |||
| 23 | extern int migrate_vmas(struct mm_struct *mm, | 25 | extern int migrate_vmas(struct mm_struct *mm, |
| 24 | const nodemask_t *from, const nodemask_t *to, | 26 | const nodemask_t *from, const nodemask_t *to, |
| 25 | unsigned long flags); | 27 | unsigned long flags); |
| 28 | extern void migrate_page_copy(struct page *newpage, struct page *page); | ||
| 29 | extern int migrate_huge_page_move_mapping(struct address_space *mapping, | ||
| 30 | struct page *newpage, struct page *page); | ||
| 26 | #else | 31 | #else |
| 27 | #define PAGE_MIGRATION 0 | 32 | #define PAGE_MIGRATION 0 |
| 28 | 33 | ||
| 29 | static inline void putback_lru_pages(struct list_head *l) {} | 34 | static inline void putback_lru_pages(struct list_head *l) {} |
| 30 | static inline int migrate_pages(struct list_head *l, new_page_t x, | 35 | static inline int migrate_pages(struct list_head *l, new_page_t x, |
| 31 | unsigned long private, int offlining) { return -ENOSYS; } | 36 | unsigned long private, int offlining) { return -ENOSYS; } |
| 37 | static inline int migrate_huge_pages(struct list_head *l, new_page_t x, | ||
| 38 | unsigned long private, int offlining) { return -ENOSYS; } | ||
| 32 | 39 | ||
| 33 | static inline int migrate_prep(void) { return -ENOSYS; } | 40 | static inline int migrate_prep(void) { return -ENOSYS; } |
| 34 | static inline int migrate_prep_local(void) { return -ENOSYS; } | 41 | static inline int migrate_prep_local(void) { return -ENOSYS; } |
| @@ -40,6 +47,15 @@ static inline int migrate_vmas(struct mm_struct *mm, | |||
| 40 | return -ENOSYS; | 47 | return -ENOSYS; |
| 41 | } | 48 | } |
| 42 | 49 | ||
| 50 | static inline void migrate_page_copy(struct page *newpage, | ||
| 51 | struct page *page) {} | ||
| 52 | |||
| 53 | static inline int migrate_huge_page_move_mapping(struct address_space *mapping, | ||
| 54 | struct page *newpage, struct page *page) | ||
| 55 | { | ||
| 56 | return -ENOSYS; | ||
| 57 | } | ||
| 58 | |||
| 43 | /* Possible settings for the migrate_page() method in address_operations */ | 59 | /* Possible settings for the migrate_page() method in address_operations */ |
| 44 | #define migrate_page NULL | 60 | #define migrate_page NULL |
| 45 | #define fail_migrate_page NULL | 61 | #define fail_migrate_page NULL |
diff --git a/include/linux/miscdevice.h b/include/linux/miscdevice.h index f6c9b7dcb9fd..18fd13028ba1 100644 --- a/include/linux/miscdevice.h +++ b/include/linux/miscdevice.h | |||
| @@ -33,11 +33,13 @@ | |||
| 33 | #define MWAVE_MINOR 219 /* ACP/Mwave Modem */ | 33 | #define MWAVE_MINOR 219 /* ACP/Mwave Modem */ |
| 34 | #define MPT_MINOR 220 | 34 | #define MPT_MINOR 220 |
| 35 | #define MPT2SAS_MINOR 221 | 35 | #define MPT2SAS_MINOR 221 |
| 36 | #define UINPUT_MINOR 223 | ||
| 36 | #define HPET_MINOR 228 | 37 | #define HPET_MINOR 228 |
| 37 | #define FUSE_MINOR 229 | 38 | #define FUSE_MINOR 229 |
| 38 | #define KVM_MINOR 232 | 39 | #define KVM_MINOR 232 |
| 39 | #define BTRFS_MINOR 234 | 40 | #define BTRFS_MINOR 234 |
| 40 | #define AUTOFS_MINOR 235 | 41 | #define AUTOFS_MINOR 235 |
| 42 | #define MAPPER_CTRL_MINOR 236 | ||
| 41 | #define MISC_DYNAMIC_MINOR 255 | 43 | #define MISC_DYNAMIC_MINOR 255 |
| 42 | 44 | ||
| 43 | struct device; | 45 | struct device; |
diff --git a/include/linux/mlx4/cmd.h b/include/linux/mlx4/cmd.h index 0f82293a82ed..9a18667c13cc 100644 --- a/include/linux/mlx4/cmd.h +++ b/include/linux/mlx4/cmd.h | |||
| @@ -56,7 +56,9 @@ enum { | |||
| 56 | MLX4_CMD_QUERY_HCA = 0xb, | 56 | MLX4_CMD_QUERY_HCA = 0xb, |
| 57 | MLX4_CMD_QUERY_PORT = 0x43, | 57 | MLX4_CMD_QUERY_PORT = 0x43, |
| 58 | MLX4_CMD_SENSE_PORT = 0x4d, | 58 | MLX4_CMD_SENSE_PORT = 0x4d, |
| 59 | MLX4_CMD_HW_HEALTH_CHECK = 0x50, | ||
| 59 | MLX4_CMD_SET_PORT = 0xc, | 60 | MLX4_CMD_SET_PORT = 0xc, |
| 61 | MLX4_CMD_SET_NODE = 0x5a, | ||
| 60 | MLX4_CMD_ACCESS_DDR = 0x2e, | 62 | MLX4_CMD_ACCESS_DDR = 0x2e, |
| 61 | MLX4_CMD_MAP_ICM = 0xffa, | 63 | MLX4_CMD_MAP_ICM = 0xffa, |
| 62 | MLX4_CMD_UNMAP_ICM = 0xff9, | 64 | MLX4_CMD_UNMAP_ICM = 0xff9, |
| @@ -140,6 +142,7 @@ enum { | |||
| 140 | MLX4_SET_PORT_MAC_TABLE = 0x2, | 142 | MLX4_SET_PORT_MAC_TABLE = 0x2, |
| 141 | MLX4_SET_PORT_VLAN_TABLE = 0x3, | 143 | MLX4_SET_PORT_VLAN_TABLE = 0x3, |
| 142 | MLX4_SET_PORT_PRIO_MAP = 0x4, | 144 | MLX4_SET_PORT_PRIO_MAP = 0x4, |
| 145 | MLX4_SET_PORT_GID_TABLE = 0x5, | ||
| 143 | }; | 146 | }; |
| 144 | 147 | ||
| 145 | struct mlx4_dev; | 148 | struct mlx4_dev; |
diff --git a/include/linux/mlx4/device.h b/include/linux/mlx4/device.h index 7a7f9c1e679a..a7b15bc7648e 100644 --- a/include/linux/mlx4/device.h +++ b/include/linux/mlx4/device.h | |||
| @@ -67,7 +67,8 @@ enum { | |||
| 67 | MLX4_DEV_CAP_FLAG_ATOMIC = 1 << 18, | 67 | MLX4_DEV_CAP_FLAG_ATOMIC = 1 << 18, |
| 68 | MLX4_DEV_CAP_FLAG_RAW_MCAST = 1 << 19, | 68 | MLX4_DEV_CAP_FLAG_RAW_MCAST = 1 << 19, |
| 69 | MLX4_DEV_CAP_FLAG_UD_AV_PORT = 1 << 20, | 69 | MLX4_DEV_CAP_FLAG_UD_AV_PORT = 1 << 20, |
| 70 | MLX4_DEV_CAP_FLAG_UD_MCAST = 1 << 21 | 70 | MLX4_DEV_CAP_FLAG_UD_MCAST = 1 << 21, |
| 71 | MLX4_DEV_CAP_FLAG_IBOE = 1 << 30 | ||
| 71 | }; | 72 | }; |
| 72 | 73 | ||
| 73 | enum { | 74 | enum { |
| @@ -171,6 +172,10 @@ enum { | |||
| 171 | MLX4_NUM_FEXCH = 64 * 1024, | 172 | MLX4_NUM_FEXCH = 64 * 1024, |
| 172 | }; | 173 | }; |
| 173 | 174 | ||
| 175 | enum { | ||
| 176 | MLX4_MAX_FAST_REG_PAGES = 511, | ||
| 177 | }; | ||
| 178 | |||
| 174 | static inline u64 mlx4_fw_ver(u64 major, u64 minor, u64 subminor) | 179 | static inline u64 mlx4_fw_ver(u64 major, u64 minor, u64 subminor) |
| 175 | { | 180 | { |
| 176 | return (major << 32) | (minor << 16) | subminor; | 181 | return (major << 32) | (minor << 16) | subminor; |
| @@ -186,6 +191,10 @@ struct mlx4_caps { | |||
| 186 | int eth_mtu_cap[MLX4_MAX_PORTS + 1]; | 191 | int eth_mtu_cap[MLX4_MAX_PORTS + 1]; |
| 187 | int gid_table_len[MLX4_MAX_PORTS + 1]; | 192 | int gid_table_len[MLX4_MAX_PORTS + 1]; |
| 188 | int pkey_table_len[MLX4_MAX_PORTS + 1]; | 193 | int pkey_table_len[MLX4_MAX_PORTS + 1]; |
| 194 | int trans_type[MLX4_MAX_PORTS + 1]; | ||
| 195 | int vendor_oui[MLX4_MAX_PORTS + 1]; | ||
| 196 | int wavelength[MLX4_MAX_PORTS + 1]; | ||
| 197 | u64 trans_code[MLX4_MAX_PORTS + 1]; | ||
| 189 | int local_ca_ack_delay; | 198 | int local_ca_ack_delay; |
| 190 | int num_uars; | 199 | int num_uars; |
| 191 | int bf_reg_size; | 200 | int bf_reg_size; |
| @@ -229,6 +238,8 @@ struct mlx4_caps { | |||
| 229 | u32 bmme_flags; | 238 | u32 bmme_flags; |
| 230 | u32 reserved_lkey; | 239 | u32 reserved_lkey; |
| 231 | u16 stat_rate_support; | 240 | u16 stat_rate_support; |
| 241 | int udp_rss; | ||
| 242 | int loopback_support; | ||
| 232 | u8 port_width_cap[MLX4_MAX_PORTS + 1]; | 243 | u8 port_width_cap[MLX4_MAX_PORTS + 1]; |
| 233 | int max_gso_sz; | 244 | int max_gso_sz; |
| 234 | int reserved_qps_cnt[MLX4_NUM_QP_REGION]; | 245 | int reserved_qps_cnt[MLX4_NUM_QP_REGION]; |
| @@ -373,6 +384,27 @@ struct mlx4_av { | |||
| 373 | u8 dgid[16]; | 384 | u8 dgid[16]; |
| 374 | }; | 385 | }; |
| 375 | 386 | ||
| 387 | struct mlx4_eth_av { | ||
| 388 | __be32 port_pd; | ||
| 389 | u8 reserved1; | ||
| 390 | u8 smac_idx; | ||
| 391 | u16 reserved2; | ||
| 392 | u8 reserved3; | ||
| 393 | u8 gid_index; | ||
| 394 | u8 stat_rate; | ||
| 395 | u8 hop_limit; | ||
| 396 | __be32 sl_tclass_flowlabel; | ||
| 397 | u8 dgid[16]; | ||
| 398 | u32 reserved4[2]; | ||
| 399 | __be16 vlan; | ||
| 400 | u8 mac[6]; | ||
| 401 | }; | ||
| 402 | |||
| 403 | union mlx4_ext_av { | ||
| 404 | struct mlx4_av ib; | ||
| 405 | struct mlx4_eth_av eth; | ||
| 406 | }; | ||
| 407 | |||
| 376 | struct mlx4_dev { | 408 | struct mlx4_dev { |
| 377 | struct pci_dev *pdev; | 409 | struct pci_dev *pdev; |
| 378 | unsigned long flags; | 410 | unsigned long flags; |
| @@ -401,6 +433,12 @@ struct mlx4_init_port_param { | |||
| 401 | if (((type) == MLX4_PORT_TYPE_IB ? (dev)->caps.port_mask : \ | 433 | if (((type) == MLX4_PORT_TYPE_IB ? (dev)->caps.port_mask : \ |
| 402 | ~(dev)->caps.port_mask) & 1 << ((port) - 1)) | 434 | ~(dev)->caps.port_mask) & 1 << ((port) - 1)) |
| 403 | 435 | ||
| 436 | #define mlx4_foreach_ib_transport_port(port, dev) \ | ||
| 437 | for ((port) = 1; (port) <= (dev)->caps.num_ports; (port)++) \ | ||
| 438 | if (((dev)->caps.port_mask & 1 << ((port) - 1)) || \ | ||
| 439 | ((dev)->caps.flags & MLX4_DEV_CAP_FLAG_IBOE)) | ||
| 440 | |||
| 441 | |||
| 404 | int mlx4_buf_alloc(struct mlx4_dev *dev, int size, int max_direct, | 442 | int mlx4_buf_alloc(struct mlx4_dev *dev, int size, int max_direct, |
| 405 | struct mlx4_buf *buf); | 443 | struct mlx4_buf *buf); |
| 406 | void mlx4_buf_free(struct mlx4_dev *dev, int size, struct mlx4_buf *buf); | 444 | void mlx4_buf_free(struct mlx4_dev *dev, int size, struct mlx4_buf *buf); |
| @@ -468,6 +506,7 @@ int mlx4_multicast_detach(struct mlx4_dev *dev, struct mlx4_qp *qp, u8 gid[16]); | |||
| 468 | int mlx4_register_mac(struct mlx4_dev *dev, u8 port, u64 mac, int *index); | 506 | int mlx4_register_mac(struct mlx4_dev *dev, u8 port, u64 mac, int *index); |
| 469 | void mlx4_unregister_mac(struct mlx4_dev *dev, u8 port, int index); | 507 | void mlx4_unregister_mac(struct mlx4_dev *dev, u8 port, int index); |
| 470 | 508 | ||
| 509 | int mlx4_find_cached_vlan(struct mlx4_dev *dev, u8 port, u16 vid, int *idx); | ||
| 471 | int mlx4_register_vlan(struct mlx4_dev *dev, u8 port, u16 vlan, int *index); | 510 | int mlx4_register_vlan(struct mlx4_dev *dev, u8 port, u16 vlan, int *index); |
| 472 | void mlx4_unregister_vlan(struct mlx4_dev *dev, u8 port, int index); | 511 | void mlx4_unregister_vlan(struct mlx4_dev *dev, u8 port, int index); |
| 473 | 512 | ||
| @@ -480,5 +519,6 @@ void mlx4_fmr_unmap(struct mlx4_dev *dev, struct mlx4_fmr *fmr, | |||
| 480 | u32 *lkey, u32 *rkey); | 519 | u32 *lkey, u32 *rkey); |
| 481 | int mlx4_fmr_free(struct mlx4_dev *dev, struct mlx4_fmr *fmr); | 520 | int mlx4_fmr_free(struct mlx4_dev *dev, struct mlx4_fmr *fmr); |
| 482 | int mlx4_SYNC_TPT(struct mlx4_dev *dev); | 521 | int mlx4_SYNC_TPT(struct mlx4_dev *dev); |
| 522 | int mlx4_test_interrupts(struct mlx4_dev *dev); | ||
| 483 | 523 | ||
| 484 | #endif /* MLX4_DEVICE_H */ | 524 | #endif /* MLX4_DEVICE_H */ |
diff --git a/include/linux/mlx4/driver.h b/include/linux/mlx4/driver.h index 53c5fdb6eac4..f407cd4bfb34 100644 --- a/include/linux/mlx4/driver.h +++ b/include/linux/mlx4/driver.h | |||
| @@ -44,15 +44,24 @@ enum mlx4_dev_event { | |||
| 44 | MLX4_DEV_EVENT_PORT_REINIT, | 44 | MLX4_DEV_EVENT_PORT_REINIT, |
| 45 | }; | 45 | }; |
| 46 | 46 | ||
| 47 | enum mlx4_protocol { | ||
| 48 | MLX4_PROTOCOL_IB, | ||
| 49 | MLX4_PROTOCOL_EN, | ||
| 50 | }; | ||
| 51 | |||
| 47 | struct mlx4_interface { | 52 | struct mlx4_interface { |
| 48 | void * (*add) (struct mlx4_dev *dev); | 53 | void * (*add) (struct mlx4_dev *dev); |
| 49 | void (*remove)(struct mlx4_dev *dev, void *context); | 54 | void (*remove)(struct mlx4_dev *dev, void *context); |
| 50 | void (*event) (struct mlx4_dev *dev, void *context, | 55 | void (*event) (struct mlx4_dev *dev, void *context, |
| 51 | enum mlx4_dev_event event, int port); | 56 | enum mlx4_dev_event event, int port); |
| 57 | void * (*get_dev)(struct mlx4_dev *dev, void *context, u8 port); | ||
| 52 | struct list_head list; | 58 | struct list_head list; |
| 59 | enum mlx4_protocol protocol; | ||
| 53 | }; | 60 | }; |
| 54 | 61 | ||
| 55 | int mlx4_register_interface(struct mlx4_interface *intf); | 62 | int mlx4_register_interface(struct mlx4_interface *intf); |
| 56 | void mlx4_unregister_interface(struct mlx4_interface *intf); | 63 | void mlx4_unregister_interface(struct mlx4_interface *intf); |
| 57 | 64 | ||
| 65 | void *mlx4_get_protocol_dev(struct mlx4_dev *dev, enum mlx4_protocol proto, int port); | ||
| 66 | |||
| 58 | #endif /* MLX4_DRIVER_H */ | 67 | #endif /* MLX4_DRIVER_H */ |
diff --git a/include/linux/mlx4/qp.h b/include/linux/mlx4/qp.h index 7abe64326f72..0eeb2a1a867c 100644 --- a/include/linux/mlx4/qp.h +++ b/include/linux/mlx4/qp.h | |||
| @@ -109,10 +109,11 @@ struct mlx4_qp_path { | |||
| 109 | __be32 tclass_flowlabel; | 109 | __be32 tclass_flowlabel; |
| 110 | u8 rgid[16]; | 110 | u8 rgid[16]; |
| 111 | u8 sched_queue; | 111 | u8 sched_queue; |
| 112 | u8 snooper_flags; | 112 | u8 vlan_index; |
| 113 | u8 reserved3[2]; | 113 | u8 reserved3[2]; |
| 114 | u8 counter_index; | 114 | u8 counter_index; |
| 115 | u8 reserved4[7]; | 115 | u8 reserved4; |
| 116 | u8 dmac[6]; | ||
| 116 | }; | 117 | }; |
| 117 | 118 | ||
| 118 | struct mlx4_qp_context { | 119 | struct mlx4_qp_context { |
| @@ -166,6 +167,7 @@ enum { | |||
| 166 | MLX4_WQE_CTRL_TCP_UDP_CSUM = 1 << 5, | 167 | MLX4_WQE_CTRL_TCP_UDP_CSUM = 1 << 5, |
| 167 | MLX4_WQE_CTRL_INS_VLAN = 1 << 6, | 168 | MLX4_WQE_CTRL_INS_VLAN = 1 << 6, |
| 168 | MLX4_WQE_CTRL_STRONG_ORDER = 1 << 7, | 169 | MLX4_WQE_CTRL_STRONG_ORDER = 1 << 7, |
| 170 | MLX4_WQE_CTRL_FORCE_LOOPBACK = 1 << 0, | ||
| 169 | }; | 171 | }; |
| 170 | 172 | ||
| 171 | struct mlx4_wqe_ctrl_seg { | 173 | struct mlx4_wqe_ctrl_seg { |
| @@ -219,7 +221,8 @@ struct mlx4_wqe_datagram_seg { | |||
| 219 | __be32 av[8]; | 221 | __be32 av[8]; |
| 220 | __be32 dqpn; | 222 | __be32 dqpn; |
| 221 | __be32 qkey; | 223 | __be32 qkey; |
| 222 | __be32 reservd[2]; | 224 | __be16 vlan; |
| 225 | u8 mac[6]; | ||
| 223 | }; | 226 | }; |
| 224 | 227 | ||
| 225 | struct mlx4_wqe_lso_seg { | 228 | struct mlx4_wqe_lso_seg { |
diff --git a/include/linux/mm.h b/include/linux/mm.h index a2b48041b910..721f451c3029 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h | |||
| @@ -78,7 +78,11 @@ extern unsigned int kobjsize(const void *objp); | |||
| 78 | #define VM_MAYSHARE 0x00000080 | 78 | #define VM_MAYSHARE 0x00000080 |
| 79 | 79 | ||
| 80 | #define VM_GROWSDOWN 0x00000100 /* general info on the segment */ | 80 | #define VM_GROWSDOWN 0x00000100 /* general info on the segment */ |
| 81 | #if defined(CONFIG_STACK_GROWSUP) || defined(CONFIG_IA64) | ||
| 81 | #define VM_GROWSUP 0x00000200 | 82 | #define VM_GROWSUP 0x00000200 |
| 83 | #else | ||
| 84 | #define VM_GROWSUP 0x00000000 | ||
| 85 | #endif | ||
| 82 | #define VM_PFNMAP 0x00000400 /* Page-ranges managed without "struct page", just pure PFN */ | 86 | #define VM_PFNMAP 0x00000400 /* Page-ranges managed without "struct page", just pure PFN */ |
| 83 | #define VM_DENYWRITE 0x00000800 /* ETXTBSY on write attempts.. */ | 87 | #define VM_DENYWRITE 0x00000800 /* ETXTBSY on write attempts.. */ |
| 84 | 88 | ||
| @@ -140,6 +144,7 @@ extern pgprot_t protection_map[16]; | |||
| 140 | #define FAULT_FLAG_WRITE 0x01 /* Fault was a write access */ | 144 | #define FAULT_FLAG_WRITE 0x01 /* Fault was a write access */ |
| 141 | #define FAULT_FLAG_NONLINEAR 0x02 /* Fault was via a nonlinear mapping */ | 145 | #define FAULT_FLAG_NONLINEAR 0x02 /* Fault was via a nonlinear mapping */ |
| 142 | #define FAULT_FLAG_MKWRITE 0x04 /* Fault was mkwrite of existing pte */ | 146 | #define FAULT_FLAG_MKWRITE 0x04 /* Fault was mkwrite of existing pte */ |
| 147 | #define FAULT_FLAG_ALLOW_RETRY 0x08 /* Retry fault if blocking */ | ||
| 143 | 148 | ||
| 144 | /* | 149 | /* |
| 145 | * This interface is used by x86 PAT code to identify a pfn mapping that is | 150 | * This interface is used by x86 PAT code to identify a pfn mapping that is |
| @@ -493,8 +498,8 @@ static inline void set_compound_order(struct page *page, unsigned long order) | |||
| 493 | #define NODES_PGSHIFT (NODES_PGOFF * (NODES_WIDTH != 0)) | 498 | #define NODES_PGSHIFT (NODES_PGOFF * (NODES_WIDTH != 0)) |
| 494 | #define ZONES_PGSHIFT (ZONES_PGOFF * (ZONES_WIDTH != 0)) | 499 | #define ZONES_PGSHIFT (ZONES_PGOFF * (ZONES_WIDTH != 0)) |
| 495 | 500 | ||
| 496 | /* NODE:ZONE or SECTION:ZONE is used to ID a zone for the buddy allcator */ | 501 | /* NODE:ZONE or SECTION:ZONE is used to ID a zone for the buddy allocator */ |
| 497 | #ifdef NODE_NOT_IN_PAGEFLAGS | 502 | #ifdef NODE_NOT_IN_PAGE_FLAGS |
| 498 | #define ZONEID_SHIFT (SECTIONS_SHIFT + ZONES_SHIFT) | 503 | #define ZONEID_SHIFT (SECTIONS_SHIFT + ZONES_SHIFT) |
| 499 | #define ZONEID_PGOFF ((SECTIONS_PGOFF < ZONES_PGOFF)? \ | 504 | #define ZONEID_PGOFF ((SECTIONS_PGOFF < ZONES_PGOFF)? \ |
| 500 | SECTIONS_PGOFF : ZONES_PGOFF) | 505 | SECTIONS_PGOFF : ZONES_PGOFF) |
| @@ -714,12 +719,21 @@ static inline int page_mapped(struct page *page) | |||
| 714 | #define VM_FAULT_SIGBUS 0x0002 | 719 | #define VM_FAULT_SIGBUS 0x0002 |
| 715 | #define VM_FAULT_MAJOR 0x0004 | 720 | #define VM_FAULT_MAJOR 0x0004 |
| 716 | #define VM_FAULT_WRITE 0x0008 /* Special case for get_user_pages */ | 721 | #define VM_FAULT_WRITE 0x0008 /* Special case for get_user_pages */ |
| 717 | #define VM_FAULT_HWPOISON 0x0010 /* Hit poisoned page */ | 722 | #define VM_FAULT_HWPOISON 0x0010 /* Hit poisoned small page */ |
| 723 | #define VM_FAULT_HWPOISON_LARGE 0x0020 /* Hit poisoned large page. Index encoded in upper bits */ | ||
| 718 | 724 | ||
| 719 | #define VM_FAULT_NOPAGE 0x0100 /* ->fault installed the pte, not return page */ | 725 | #define VM_FAULT_NOPAGE 0x0100 /* ->fault installed the pte, not return page */ |
| 720 | #define VM_FAULT_LOCKED 0x0200 /* ->fault locked the returned page */ | 726 | #define VM_FAULT_LOCKED 0x0200 /* ->fault locked the returned page */ |
| 727 | #define VM_FAULT_RETRY 0x0400 /* ->fault blocked, must retry */ | ||
| 721 | 728 | ||
| 722 | #define VM_FAULT_ERROR (VM_FAULT_OOM | VM_FAULT_SIGBUS | VM_FAULT_HWPOISON) | 729 | #define VM_FAULT_HWPOISON_LARGE_MASK 0xf000 /* encodes hpage index for large hwpoison */ |
| 730 | |||
| 731 | #define VM_FAULT_ERROR (VM_FAULT_OOM | VM_FAULT_SIGBUS | VM_FAULT_HWPOISON | \ | ||
| 732 | VM_FAULT_HWPOISON_LARGE) | ||
| 733 | |||
| 734 | /* Encode hstate index for a hwpoisoned large page */ | ||
| 735 | #define VM_FAULT_SET_HINDEX(x) ((x) << 12) | ||
| 736 | #define VM_FAULT_GET_HINDEX(x) (((x) >> 12) & 0xf) | ||
| 723 | 737 | ||
| 724 | /* | 738 | /* |
| 725 | * Can be called by the pagefault handler when it gets a VM_FAULT_OOM. | 739 | * Can be called by the pagefault handler when it gets a VM_FAULT_OOM. |
| @@ -815,6 +829,7 @@ static inline void unmap_shared_mapping_range(struct address_space *mapping, | |||
| 815 | } | 829 | } |
| 816 | 830 | ||
| 817 | extern void truncate_pagecache(struct inode *inode, loff_t old, loff_t new); | 831 | extern void truncate_pagecache(struct inode *inode, loff_t old, loff_t new); |
| 832 | extern void truncate_setsize(struct inode *inode, loff_t newsize); | ||
| 818 | extern int vmtruncate(struct inode *inode, loff_t offset); | 833 | extern int vmtruncate(struct inode *inode, loff_t offset); |
| 819 | extern int vmtruncate_range(struct inode *inode, loff_t offset, loff_t end); | 834 | extern int vmtruncate_range(struct inode *inode, loff_t offset, loff_t end); |
| 820 | 835 | ||
| @@ -855,10 +870,17 @@ int __set_page_dirty_no_writeback(struct page *page); | |||
| 855 | int redirty_page_for_writepage(struct writeback_control *wbc, | 870 | int redirty_page_for_writepage(struct writeback_control *wbc, |
| 856 | struct page *page); | 871 | struct page *page); |
| 857 | void account_page_dirtied(struct page *page, struct address_space *mapping); | 872 | void account_page_dirtied(struct page *page, struct address_space *mapping); |
| 873 | void account_page_writeback(struct page *page); | ||
| 858 | int set_page_dirty(struct page *page); | 874 | int set_page_dirty(struct page *page); |
| 859 | int set_page_dirty_lock(struct page *page); | 875 | int set_page_dirty_lock(struct page *page); |
| 860 | int clear_page_dirty_for_io(struct page *page); | 876 | int clear_page_dirty_for_io(struct page *page); |
| 861 | 877 | ||
| 878 | /* Is the vma a continuation of the stack vma above it? */ | ||
| 879 | static inline int vma_stack_continue(struct vm_area_struct *vma, unsigned long addr) | ||
| 880 | { | ||
| 881 | return vma && (vma->vm_end == addr) && (vma->vm_flags & VM_GROWSDOWN); | ||
| 882 | } | ||
| 883 | |||
| 862 | extern unsigned long move_page_tables(struct vm_area_struct *vma, | 884 | extern unsigned long move_page_tables(struct vm_area_struct *vma, |
| 863 | unsigned long old_addr, struct vm_area_struct *new_vma, | 885 | unsigned long old_addr, struct vm_area_struct *new_vma, |
| 864 | unsigned long new_addr, unsigned long len); | 886 | unsigned long new_addr, unsigned long len); |
| @@ -1012,7 +1034,15 @@ extern void unregister_shrinker(struct shrinker *); | |||
| 1012 | 1034 | ||
| 1013 | int vma_wants_writenotify(struct vm_area_struct *vma); | 1035 | int vma_wants_writenotify(struct vm_area_struct *vma); |
| 1014 | 1036 | ||
| 1015 | extern pte_t *get_locked_pte(struct mm_struct *mm, unsigned long addr, spinlock_t **ptl); | 1037 | extern pte_t *__get_locked_pte(struct mm_struct *mm, unsigned long addr, |
| 1038 | spinlock_t **ptl); | ||
| 1039 | static inline pte_t *get_locked_pte(struct mm_struct *mm, unsigned long addr, | ||
| 1040 | spinlock_t **ptl) | ||
| 1041 | { | ||
| 1042 | pte_t *ptep; | ||
| 1043 | __cond_lock(*ptl, ptep = __get_locked_pte(mm, addr, ptl)); | ||
| 1044 | return ptep; | ||
| 1045 | } | ||
| 1016 | 1046 | ||
| 1017 | #ifdef __PAGETABLE_PUD_FOLDED | 1047 | #ifdef __PAGETABLE_PUD_FOLDED |
| 1018 | static inline int __pud_alloc(struct mm_struct *mm, pgd_t *pgd, | 1048 | static inline int __pud_alloc(struct mm_struct *mm, pgd_t *pgd, |
| @@ -1164,6 +1194,8 @@ extern void free_bootmem_with_active_regions(int nid, | |||
| 1164 | unsigned long max_low_pfn); | 1194 | unsigned long max_low_pfn); |
| 1165 | int add_from_early_node_map(struct range *range, int az, | 1195 | int add_from_early_node_map(struct range *range, int az, |
| 1166 | int nr_range, int nid); | 1196 | int nr_range, int nid); |
| 1197 | u64 __init find_memory_core_early(int nid, u64 size, u64 align, | ||
| 1198 | u64 goal, u64 limit); | ||
| 1167 | void *__alloc_memory_core_early(int nodeid, u64 size, u64 align, | 1199 | void *__alloc_memory_core_early(int nodeid, u64 size, u64 align, |
| 1168 | u64 goal, u64 limit); | 1200 | u64 goal, u64 limit); |
| 1169 | typedef int (*work_fn_t)(unsigned long, unsigned long, void *); | 1201 | typedef int (*work_fn_t)(unsigned long, unsigned long, void *); |
| @@ -1329,8 +1361,10 @@ unsigned long ra_submit(struct file_ra_state *ra, | |||
| 1329 | 1361 | ||
| 1330 | /* Do stack extension */ | 1362 | /* Do stack extension */ |
| 1331 | extern int expand_stack(struct vm_area_struct *vma, unsigned long address); | 1363 | extern int expand_stack(struct vm_area_struct *vma, unsigned long address); |
| 1332 | #ifdef CONFIG_IA64 | 1364 | #if VM_GROWSUP |
| 1333 | extern int expand_upwards(struct vm_area_struct *vma, unsigned long address); | 1365 | extern int expand_upwards(struct vm_area_struct *vma, unsigned long address); |
| 1366 | #else | ||
| 1367 | #define expand_upwards(vma, address) do { } while (0) | ||
| 1334 | #endif | 1368 | #endif |
| 1335 | extern int expand_stack_downwards(struct vm_area_struct *vma, | 1369 | extern int expand_stack_downwards(struct vm_area_struct *vma, |
| 1336 | unsigned long address); | 1370 | unsigned long address); |
| @@ -1356,7 +1390,15 @@ static inline unsigned long vma_pages(struct vm_area_struct *vma) | |||
| 1356 | return (vma->vm_end - vma->vm_start) >> PAGE_SHIFT; | 1390 | return (vma->vm_end - vma->vm_start) >> PAGE_SHIFT; |
| 1357 | } | 1391 | } |
| 1358 | 1392 | ||
| 1393 | #ifdef CONFIG_MMU | ||
| 1359 | pgprot_t vm_get_page_prot(unsigned long vm_flags); | 1394 | pgprot_t vm_get_page_prot(unsigned long vm_flags); |
| 1395 | #else | ||
| 1396 | static inline pgprot_t vm_get_page_prot(unsigned long vm_flags) | ||
| 1397 | { | ||
| 1398 | return __pgprot(0); | ||
| 1399 | } | ||
| 1400 | #endif | ||
| 1401 | |||
| 1360 | struct vm_area_struct *find_extend_vma(struct mm_struct *, unsigned long addr); | 1402 | struct vm_area_struct *find_extend_vma(struct mm_struct *, unsigned long addr); |
| 1361 | int remap_pfn_range(struct vm_area_struct *, unsigned long addr, | 1403 | int remap_pfn_range(struct vm_area_struct *, unsigned long addr, |
| 1362 | unsigned long pfn, unsigned long size, pgprot_t); | 1404 | unsigned long pfn, unsigned long size, pgprot_t); |
| @@ -1465,6 +1507,14 @@ extern int sysctl_memory_failure_recovery; | |||
| 1465 | extern void shake_page(struct page *p, int access); | 1507 | extern void shake_page(struct page *p, int access); |
| 1466 | extern atomic_long_t mce_bad_pages; | 1508 | extern atomic_long_t mce_bad_pages; |
| 1467 | extern int soft_offline_page(struct page *page, int flags); | 1509 | extern int soft_offline_page(struct page *page, int flags); |
| 1510 | #ifdef CONFIG_MEMORY_FAILURE | ||
| 1511 | int is_hwpoison_address(unsigned long addr); | ||
| 1512 | #else | ||
| 1513 | static inline int is_hwpoison_address(unsigned long addr) | ||
| 1514 | { | ||
| 1515 | return 0; | ||
| 1516 | } | ||
| 1517 | #endif | ||
| 1468 | 1518 | ||
| 1469 | extern void dump_page(struct page *page); | 1519 | extern void dump_page(struct page *page); |
| 1470 | 1520 | ||
diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h index b8bb9a6a1f37..bb7288a782fd 100644 --- a/include/linux/mm_types.h +++ b/include/linux/mm_types.h | |||
| @@ -134,7 +134,7 @@ struct vm_area_struct { | |||
| 134 | within vm_mm. */ | 134 | within vm_mm. */ |
| 135 | 135 | ||
| 136 | /* linked list of VM areas per task, sorted by address */ | 136 | /* linked list of VM areas per task, sorted by address */ |
| 137 | struct vm_area_struct *vm_next; | 137 | struct vm_area_struct *vm_next, *vm_prev; |
| 138 | 138 | ||
| 139 | pgprot_t vm_page_prot; /* Access permissions of this VMA. */ | 139 | pgprot_t vm_page_prot; /* Access permissions of this VMA. */ |
| 140 | unsigned long vm_flags; /* Flags, see mm.h. */ | 140 | unsigned long vm_flags; /* Flags, see mm.h. */ |
| @@ -299,7 +299,7 @@ struct mm_struct { | |||
| 299 | * new_owner->mm == mm | 299 | * new_owner->mm == mm |
| 300 | * new_owner->alloc_lock is held | 300 | * new_owner->alloc_lock is held |
| 301 | */ | 301 | */ |
| 302 | struct task_struct *owner; | 302 | struct task_struct __rcu *owner; |
| 303 | #endif | 303 | #endif |
| 304 | 304 | ||
| 305 | #ifdef CONFIG_PROC_FS | 305 | #ifdef CONFIG_PROC_FS |
| @@ -310,6 +310,8 @@ struct mm_struct { | |||
| 310 | #ifdef CONFIG_MMU_NOTIFIER | 310 | #ifdef CONFIG_MMU_NOTIFIER |
| 311 | struct mmu_notifier_mm *mmu_notifier_mm; | 311 | struct mmu_notifier_mm *mmu_notifier_mm; |
| 312 | #endif | 312 | #endif |
| 313 | /* How many tasks sharing this mm are OOM_DISABLE */ | ||
| 314 | atomic_t oom_disable_count; | ||
| 313 | }; | 315 | }; |
| 314 | 316 | ||
| 315 | /* Future-safe accessor for struct mm_struct's cpu_vm_mask. */ | 317 | /* Future-safe accessor for struct mm_struct's cpu_vm_mask. */ |
diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h index d02d2c6e0cfe..8ce082781ccb 100644 --- a/include/linux/mmc/card.h +++ b/include/linux/mmc/card.h | |||
| @@ -24,12 +24,14 @@ struct mmc_cid { | |||
| 24 | }; | 24 | }; |
| 25 | 25 | ||
| 26 | struct mmc_csd { | 26 | struct mmc_csd { |
| 27 | unsigned char structure; | ||
| 27 | unsigned char mmca_vsn; | 28 | unsigned char mmca_vsn; |
| 28 | unsigned short cmdclass; | 29 | unsigned short cmdclass; |
| 29 | unsigned short tacc_clks; | 30 | unsigned short tacc_clks; |
| 30 | unsigned int tacc_ns; | 31 | unsigned int tacc_ns; |
| 31 | unsigned int r2w_factor; | 32 | unsigned int r2w_factor; |
| 32 | unsigned int max_dtr; | 33 | unsigned int max_dtr; |
| 34 | unsigned int erase_size; /* In sectors */ | ||
| 33 | unsigned int read_blkbits; | 35 | unsigned int read_blkbits; |
| 34 | unsigned int write_blkbits; | 36 | unsigned int write_blkbits; |
| 35 | unsigned int capacity; | 37 | unsigned int capacity; |
| @@ -41,9 +43,17 @@ struct mmc_csd { | |||
| 41 | 43 | ||
| 42 | struct mmc_ext_csd { | 44 | struct mmc_ext_csd { |
| 43 | u8 rev; | 45 | u8 rev; |
| 46 | u8 erase_group_def; | ||
| 47 | u8 sec_feature_support; | ||
| 44 | unsigned int sa_timeout; /* Units: 100ns */ | 48 | unsigned int sa_timeout; /* Units: 100ns */ |
| 45 | unsigned int hs_max_dtr; | 49 | unsigned int hs_max_dtr; |
| 46 | unsigned int sectors; | 50 | unsigned int sectors; |
| 51 | unsigned int card_type; | ||
| 52 | unsigned int hc_erase_size; /* In sectors */ | ||
| 53 | unsigned int hc_erase_timeout; /* In milliseconds */ | ||
| 54 | unsigned int sec_trim_mult; /* Secure trim multiplier */ | ||
| 55 | unsigned int sec_erase_mult; /* Secure erase multiplier */ | ||
| 56 | unsigned int trim_timeout; /* In milliseconds */ | ||
| 47 | }; | 57 | }; |
| 48 | 58 | ||
| 49 | struct sd_scr { | 59 | struct sd_scr { |
| @@ -53,6 +63,12 @@ struct sd_scr { | |||
| 53 | #define SD_SCR_BUS_WIDTH_4 (1<<2) | 63 | #define SD_SCR_BUS_WIDTH_4 (1<<2) |
| 54 | }; | 64 | }; |
| 55 | 65 | ||
| 66 | struct sd_ssr { | ||
| 67 | unsigned int au; /* In sectors */ | ||
| 68 | unsigned int erase_timeout; /* In milliseconds */ | ||
| 69 | unsigned int erase_offset; /* In milliseconds */ | ||
| 70 | }; | ||
| 71 | |||
| 56 | struct sd_switch_caps { | 72 | struct sd_switch_caps { |
| 57 | unsigned int hs_max_dtr; | 73 | unsigned int hs_max_dtr; |
| 58 | }; | 74 | }; |
| @@ -92,15 +108,24 @@ struct mmc_card { | |||
| 92 | #define MMC_TYPE_MMC 0 /* MMC card */ | 108 | #define MMC_TYPE_MMC 0 /* MMC card */ |
| 93 | #define MMC_TYPE_SD 1 /* SD card */ | 109 | #define MMC_TYPE_SD 1 /* SD card */ |
| 94 | #define MMC_TYPE_SDIO 2 /* SDIO card */ | 110 | #define MMC_TYPE_SDIO 2 /* SDIO card */ |
| 111 | #define MMC_TYPE_SD_COMBO 3 /* SD combo (IO+mem) card */ | ||
| 95 | unsigned int state; /* (our) card state */ | 112 | unsigned int state; /* (our) card state */ |
| 96 | #define MMC_STATE_PRESENT (1<<0) /* present in sysfs */ | 113 | #define MMC_STATE_PRESENT (1<<0) /* present in sysfs */ |
| 97 | #define MMC_STATE_READONLY (1<<1) /* card is read-only */ | 114 | #define MMC_STATE_READONLY (1<<1) /* card is read-only */ |
| 98 | #define MMC_STATE_HIGHSPEED (1<<2) /* card is in high speed mode */ | 115 | #define MMC_STATE_HIGHSPEED (1<<2) /* card is in high speed mode */ |
| 99 | #define MMC_STATE_BLOCKADDR (1<<3) /* card uses block-addressing */ | 116 | #define MMC_STATE_BLOCKADDR (1<<3) /* card uses block-addressing */ |
| 117 | #define MMC_STATE_HIGHSPEED_DDR (1<<4) /* card is in high speed mode */ | ||
| 100 | unsigned int quirks; /* card quirks */ | 118 | unsigned int quirks; /* card quirks */ |
| 101 | #define MMC_QUIRK_LENIENT_FN0 (1<<0) /* allow SDIO FN0 writes outside of the VS CCCR range */ | 119 | #define MMC_QUIRK_LENIENT_FN0 (1<<0) /* allow SDIO FN0 writes outside of the VS CCCR range */ |
| 102 | #define MMC_QUIRK_BLKSZ_FOR_BYTE_MODE (1<<1) /* use func->cur_blksize */ | 120 | #define MMC_QUIRK_BLKSZ_FOR_BYTE_MODE (1<<1) /* use func->cur_blksize */ |
| 103 | /* for byte mode */ | 121 | /* for byte mode */ |
| 122 | #define MMC_QUIRK_NONSTD_SDIO (1<<2) /* non-standard SDIO card attached */ | ||
| 123 | /* (missing CIA registers) */ | ||
| 124 | |||
| 125 | unsigned int erase_size; /* erase size in sectors */ | ||
| 126 | unsigned int erase_shift; /* if erase unit is power 2 */ | ||
| 127 | unsigned int pref_erase; /* in sectors */ | ||
| 128 | u8 erased_byte; /* value of erased bytes */ | ||
| 104 | 129 | ||
| 105 | u32 raw_cid[4]; /* raw card CID */ | 130 | u32 raw_cid[4]; /* raw card CID */ |
| 106 | u32 raw_csd[4]; /* raw card CSD */ | 131 | u32 raw_csd[4]; /* raw card CSD */ |
| @@ -109,6 +134,7 @@ struct mmc_card { | |||
| 109 | struct mmc_csd csd; /* card specific */ | 134 | struct mmc_csd csd; /* card specific */ |
| 110 | struct mmc_ext_csd ext_csd; /* mmc v4 extended card specific */ | 135 | struct mmc_ext_csd ext_csd; /* mmc v4 extended card specific */ |
| 111 | struct sd_scr scr; /* extra SD information */ | 136 | struct sd_scr scr; /* extra SD information */ |
| 137 | struct sd_ssr ssr; /* yet more SD information */ | ||
| 112 | struct sd_switch_caps sw_caps; /* switch (CMD6) caps */ | 138 | struct sd_switch_caps sw_caps; /* switch (CMD6) caps */ |
| 113 | 139 | ||
| 114 | unsigned int sdio_funcs; /* number of SDIO functions */ | 140 | unsigned int sdio_funcs; /* number of SDIO functions */ |
| @@ -130,11 +156,13 @@ struct mmc_card { | |||
| 130 | #define mmc_card_readonly(c) ((c)->state & MMC_STATE_READONLY) | 156 | #define mmc_card_readonly(c) ((c)->state & MMC_STATE_READONLY) |
| 131 | #define mmc_card_highspeed(c) ((c)->state & MMC_STATE_HIGHSPEED) | 157 | #define mmc_card_highspeed(c) ((c)->state & MMC_STATE_HIGHSPEED) |
| 132 | #define mmc_card_blockaddr(c) ((c)->state & MMC_STATE_BLOCKADDR) | 158 | #define mmc_card_blockaddr(c) ((c)->state & MMC_STATE_BLOCKADDR) |
| 159 | #define mmc_card_ddr_mode(c) ((c)->state & MMC_STATE_HIGHSPEED_DDR) | ||
| 133 | 160 | ||
| 134 | #define mmc_card_set_present(c) ((c)->state |= MMC_STATE_PRESENT) | 161 | #define mmc_card_set_present(c) ((c)->state |= MMC_STATE_PRESENT) |
| 135 | #define mmc_card_set_readonly(c) ((c)->state |= MMC_STATE_READONLY) | 162 | #define mmc_card_set_readonly(c) ((c)->state |= MMC_STATE_READONLY) |
| 136 | #define mmc_card_set_highspeed(c) ((c)->state |= MMC_STATE_HIGHSPEED) | 163 | #define mmc_card_set_highspeed(c) ((c)->state |= MMC_STATE_HIGHSPEED) |
| 137 | #define mmc_card_set_blockaddr(c) ((c)->state |= MMC_STATE_BLOCKADDR) | 164 | #define mmc_card_set_blockaddr(c) ((c)->state |= MMC_STATE_BLOCKADDR) |
| 165 | #define mmc_card_set_ddr_mode(c) ((c)->state |= MMC_STATE_HIGHSPEED_DDR) | ||
| 138 | 166 | ||
| 139 | static inline int mmc_card_lenient_fn0(const struct mmc_card *c) | 167 | static inline int mmc_card_lenient_fn0(const struct mmc_card *c) |
| 140 | { | 168 | { |
| @@ -149,6 +177,8 @@ static inline int mmc_blksz_for_byte_mode(const struct mmc_card *c) | |||
| 149 | #define mmc_card_name(c) ((c)->cid.prod_name) | 177 | #define mmc_card_name(c) ((c)->cid.prod_name) |
| 150 | #define mmc_card_id(c) (dev_name(&(c)->dev)) | 178 | #define mmc_card_id(c) (dev_name(&(c)->dev)) |
| 151 | 179 | ||
| 180 | #define mmc_dev_to_card(d) container_of(d, struct mmc_card, dev) | ||
| 181 | |||
| 152 | #define mmc_list_to_card(l) container_of(l, struct mmc_card, node) | 182 | #define mmc_list_to_card(l) container_of(l, struct mmc_card, node) |
| 153 | #define mmc_get_drvdata(c) dev_get_drvdata(&(c)->dev) | 183 | #define mmc_get_drvdata(c) dev_get_drvdata(&(c)->dev) |
| 154 | #define mmc_set_drvdata(c,d) dev_set_drvdata(&(c)->dev, d) | 184 | #define mmc_set_drvdata(c,d) dev_set_drvdata(&(c)->dev, d) |
diff --git a/include/linux/mmc/core.h b/include/linux/mmc/core.h index e4898e9eeb59..64e013f1cfb8 100644 --- a/include/linux/mmc/core.h +++ b/include/linux/mmc/core.h | |||
| @@ -92,6 +92,8 @@ struct mmc_command { | |||
| 92 | * actively failing requests | 92 | * actively failing requests |
| 93 | */ | 93 | */ |
| 94 | 94 | ||
| 95 | unsigned int erase_timeout; /* in milliseconds */ | ||
| 96 | |||
| 95 | struct mmc_data *data; /* data segment associated with cmd */ | 97 | struct mmc_data *data; /* data segment associated with cmd */ |
| 96 | struct mmc_request *mrq; /* associated request */ | 98 | struct mmc_request *mrq; /* associated request */ |
| 97 | }; | 99 | }; |
| @@ -134,6 +136,25 @@ extern int mmc_wait_for_cmd(struct mmc_host *, struct mmc_command *, int); | |||
| 134 | extern int mmc_wait_for_app_cmd(struct mmc_host *, struct mmc_card *, | 136 | extern int mmc_wait_for_app_cmd(struct mmc_host *, struct mmc_card *, |
| 135 | struct mmc_command *, int); | 137 | struct mmc_command *, int); |
| 136 | 138 | ||
| 139 | #define MMC_ERASE_ARG 0x00000000 | ||
| 140 | #define MMC_SECURE_ERASE_ARG 0x80000000 | ||
| 141 | #define MMC_TRIM_ARG 0x00000001 | ||
| 142 | #define MMC_SECURE_TRIM1_ARG 0x80000001 | ||
| 143 | #define MMC_SECURE_TRIM2_ARG 0x80008000 | ||
| 144 | |||
| 145 | #define MMC_SECURE_ARGS 0x80000000 | ||
| 146 | #define MMC_TRIM_ARGS 0x00008001 | ||
| 147 | |||
| 148 | extern int mmc_erase(struct mmc_card *card, unsigned int from, unsigned int nr, | ||
| 149 | unsigned int arg); | ||
| 150 | extern int mmc_can_erase(struct mmc_card *card); | ||
| 151 | extern int mmc_can_trim(struct mmc_card *card); | ||
| 152 | extern int mmc_can_secure_erase_trim(struct mmc_card *card); | ||
| 153 | extern int mmc_erase_group_aligned(struct mmc_card *card, unsigned int from, | ||
| 154 | unsigned int nr); | ||
| 155 | |||
| 156 | extern int mmc_set_blocklen(struct mmc_card *card, unsigned int blocklen); | ||
| 157 | |||
| 137 | extern void mmc_set_data_timeout(struct mmc_data *, const struct mmc_card *); | 158 | extern void mmc_set_data_timeout(struct mmc_data *, const struct mmc_card *); |
| 138 | extern unsigned int mmc_align_data_size(struct mmc_card *, unsigned int); | 159 | extern unsigned int mmc_align_data_size(struct mmc_card *, unsigned int); |
| 139 | 160 | ||
diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h index f65913c9f5a4..6d87f68ce4b6 100644 --- a/include/linux/mmc/host.h +++ b/include/linux/mmc/host.h | |||
| @@ -50,6 +50,12 @@ struct mmc_ios { | |||
| 50 | #define MMC_TIMING_LEGACY 0 | 50 | #define MMC_TIMING_LEGACY 0 |
| 51 | #define MMC_TIMING_MMC_HS 1 | 51 | #define MMC_TIMING_MMC_HS 1 |
| 52 | #define MMC_TIMING_SD_HS 2 | 52 | #define MMC_TIMING_SD_HS 2 |
| 53 | |||
| 54 | unsigned char ddr; /* dual data rate used */ | ||
| 55 | |||
| 56 | #define MMC_SDR_MODE 0 | ||
| 57 | #define MMC_1_2V_DDR_MODE 1 | ||
| 58 | #define MMC_1_8V_DDR_MODE 2 | ||
| 53 | }; | 59 | }; |
| 54 | 60 | ||
| 55 | struct mmc_host_ops { | 61 | struct mmc_host_ops { |
| @@ -123,7 +129,9 @@ struct mmc_host { | |||
| 123 | const struct mmc_host_ops *ops; | 129 | const struct mmc_host_ops *ops; |
| 124 | unsigned int f_min; | 130 | unsigned int f_min; |
| 125 | unsigned int f_max; | 131 | unsigned int f_max; |
| 132 | unsigned int f_init; | ||
| 126 | u32 ocr_avail; | 133 | u32 ocr_avail; |
| 134 | struct notifier_block pm_notify; | ||
| 127 | 135 | ||
| 128 | #define MMC_VDD_165_195 0x00000080 /* VDD voltage 1.65 - 1.95 */ | 136 | #define MMC_VDD_165_195 0x00000080 /* VDD voltage 1.65 - 1.95 */ |
| 129 | #define MMC_VDD_20_21 0x00000100 /* VDD voltage 2.0 ~ 2.1 */ | 137 | #define MMC_VDD_20_21 0x00000100 /* VDD voltage 2.0 ~ 2.1 */ |
| @@ -155,13 +163,17 @@ struct mmc_host { | |||
| 155 | #define MMC_CAP_DISABLE (1 << 7) /* Can the host be disabled */ | 163 | #define MMC_CAP_DISABLE (1 << 7) /* Can the host be disabled */ |
| 156 | #define MMC_CAP_NONREMOVABLE (1 << 8) /* Nonremovable e.g. eMMC */ | 164 | #define MMC_CAP_NONREMOVABLE (1 << 8) /* Nonremovable e.g. eMMC */ |
| 157 | #define MMC_CAP_WAIT_WHILE_BUSY (1 << 9) /* Waits while card is busy */ | 165 | #define MMC_CAP_WAIT_WHILE_BUSY (1 << 9) /* Waits while card is busy */ |
| 166 | #define MMC_CAP_ERASE (1 << 10) /* Allow erase/trim commands */ | ||
| 167 | #define MMC_CAP_1_8V_DDR (1 << 11) /* can support */ | ||
| 168 | /* DDR mode at 1.8V */ | ||
| 169 | #define MMC_CAP_1_2V_DDR (1 << 12) /* can support */ | ||
| 170 | /* DDR mode at 1.2V */ | ||
| 158 | 171 | ||
| 159 | mmc_pm_flag_t pm_caps; /* supported pm features */ | 172 | mmc_pm_flag_t pm_caps; /* supported pm features */ |
| 160 | 173 | ||
| 161 | /* host specific block data */ | 174 | /* host specific block data */ |
| 162 | unsigned int max_seg_size; /* see blk_queue_max_segment_size */ | 175 | unsigned int max_seg_size; /* see blk_queue_max_segment_size */ |
| 163 | unsigned short max_hw_segs; /* see blk_queue_max_hw_segments */ | 176 | unsigned short max_segs; /* see blk_queue_max_segments */ |
| 164 | unsigned short max_phys_segs; /* see blk_queue_max_phys_segments */ | ||
| 165 | unsigned short unused; | 177 | unsigned short unused; |
| 166 | unsigned int max_req_size; /* maximum number of bytes in one req */ | 178 | unsigned int max_req_size; /* maximum number of bytes in one req */ |
| 167 | unsigned int max_blk_size; /* maximum size of one mmc block */ | 179 | unsigned int max_blk_size; /* maximum size of one mmc block */ |
| @@ -183,6 +195,7 @@ struct mmc_host { | |||
| 183 | 195 | ||
| 184 | /* Only used with MMC_CAP_DISABLE */ | 196 | /* Only used with MMC_CAP_DISABLE */ |
| 185 | int enabled; /* host is enabled */ | 197 | int enabled; /* host is enabled */ |
| 198 | int rescan_disable; /* disable card detection */ | ||
| 186 | int nesting_cnt; /* "enable" nesting count */ | 199 | int nesting_cnt; /* "enable" nesting count */ |
| 187 | int en_dis_recurs; /* detect recursion */ | 200 | int en_dis_recurs; /* detect recursion */ |
| 188 | unsigned int disable_delay; /* disable delay in msecs */ | 201 | unsigned int disable_delay; /* disable delay in msecs */ |
| @@ -209,6 +222,10 @@ struct mmc_host { | |||
| 209 | struct led_trigger *led; /* activity led */ | 222 | struct led_trigger *led; /* activity led */ |
| 210 | #endif | 223 | #endif |
| 211 | 224 | ||
| 225 | #ifdef CONFIG_REGULATOR | ||
| 226 | bool regulator_enabled; /* regulator state */ | ||
| 227 | #endif | ||
| 228 | |||
| 212 | struct dentry *debugfs_root; | 229 | struct dentry *debugfs_root; |
| 213 | 230 | ||
| 214 | unsigned long private[0] ____cacheline_aligned; | 231 | unsigned long private[0] ____cacheline_aligned; |
| @@ -233,8 +250,8 @@ static inline void *mmc_priv(struct mmc_host *host) | |||
| 233 | extern int mmc_suspend_host(struct mmc_host *); | 250 | extern int mmc_suspend_host(struct mmc_host *); |
| 234 | extern int mmc_resume_host(struct mmc_host *); | 251 | extern int mmc_resume_host(struct mmc_host *); |
| 235 | 252 | ||
| 236 | extern void mmc_power_save_host(struct mmc_host *host); | 253 | extern int mmc_power_save_host(struct mmc_host *host); |
| 237 | extern void mmc_power_restore_host(struct mmc_host *host); | 254 | extern int mmc_power_restore_host(struct mmc_host *host); |
| 238 | 255 | ||
| 239 | extern void mmc_detect_change(struct mmc_host *, unsigned long delay); | 256 | extern void mmc_detect_change(struct mmc_host *, unsigned long delay); |
| 240 | extern void mmc_request_done(struct mmc_host *, struct mmc_request *); | 257 | extern void mmc_request_done(struct mmc_host *, struct mmc_request *); |
| @@ -247,8 +264,24 @@ static inline void mmc_signal_sdio_irq(struct mmc_host *host) | |||
| 247 | 264 | ||
| 248 | struct regulator; | 265 | struct regulator; |
| 249 | 266 | ||
| 267 | #ifdef CONFIG_REGULATOR | ||
| 250 | int mmc_regulator_get_ocrmask(struct regulator *supply); | 268 | int mmc_regulator_get_ocrmask(struct regulator *supply); |
| 251 | int mmc_regulator_set_ocr(struct regulator *supply, unsigned short vdd_bit); | 269 | int mmc_regulator_set_ocr(struct mmc_host *mmc, |
| 270 | struct regulator *supply, | ||
| 271 | unsigned short vdd_bit); | ||
| 272 | #else | ||
| 273 | static inline int mmc_regulator_get_ocrmask(struct regulator *supply) | ||
| 274 | { | ||
| 275 | return 0; | ||
| 276 | } | ||
| 277 | |||
| 278 | static inline int mmc_regulator_set_ocr(struct mmc_host *mmc, | ||
| 279 | struct regulator *supply, | ||
| 280 | unsigned short vdd_bit) | ||
| 281 | { | ||
| 282 | return 0; | ||
| 283 | } | ||
| 284 | #endif | ||
| 252 | 285 | ||
| 253 | int mmc_card_awake(struct mmc_host *host); | 286 | int mmc_card_awake(struct mmc_host *host); |
| 254 | int mmc_card_sleep(struct mmc_host *host); | 287 | int mmc_card_sleep(struct mmc_host *host); |
| @@ -257,6 +290,7 @@ int mmc_card_can_sleep(struct mmc_host *host); | |||
| 257 | int mmc_host_enable(struct mmc_host *host); | 290 | int mmc_host_enable(struct mmc_host *host); |
| 258 | int mmc_host_disable(struct mmc_host *host); | 291 | int mmc_host_disable(struct mmc_host *host); |
| 259 | int mmc_host_lazy_disable(struct mmc_host *host); | 292 | int mmc_host_lazy_disable(struct mmc_host *host); |
| 293 | int mmc_pm_notify(struct notifier_block *notify_block, unsigned long, void *); | ||
| 260 | 294 | ||
| 261 | static inline void mmc_set_disable_delay(struct mmc_host *host, | 295 | static inline void mmc_set_disable_delay(struct mmc_host *host, |
| 262 | unsigned int disable_delay) | 296 | unsigned int disable_delay) |
| @@ -264,5 +298,13 @@ static inline void mmc_set_disable_delay(struct mmc_host *host, | |||
| 264 | host->disable_delay = disable_delay; | 298 | host->disable_delay = disable_delay; |
| 265 | } | 299 | } |
| 266 | 300 | ||
| 301 | /* Module parameter */ | ||
| 302 | extern int mmc_assume_removable; | ||
| 303 | |||
| 304 | static inline int mmc_card_is_removable(struct mmc_host *host) | ||
| 305 | { | ||
| 306 | return !(host->caps & MMC_CAP_NONREMOVABLE) && mmc_assume_removable; | ||
| 307 | } | ||
| 308 | |||
| 267 | #endif | 309 | #endif |
| 268 | 310 | ||
diff --git a/include/linux/mmc/mmc.h b/include/linux/mmc/mmc.h index 8a49cbf0376d..956fbd877692 100644 --- a/include/linux/mmc/mmc.h +++ b/include/linux/mmc/mmc.h | |||
| @@ -251,12 +251,21 @@ struct _mmc_csd { | |||
| 251 | * EXT_CSD fields | 251 | * EXT_CSD fields |
| 252 | */ | 252 | */ |
| 253 | 253 | ||
| 254 | #define EXT_CSD_BUS_WIDTH 183 /* R/W */ | 254 | #define EXT_CSD_ERASE_GROUP_DEF 175 /* R/W */ |
| 255 | #define EXT_CSD_HS_TIMING 185 /* R/W */ | 255 | #define EXT_CSD_ERASED_MEM_CONT 181 /* RO */ |
| 256 | #define EXT_CSD_CARD_TYPE 196 /* RO */ | 256 | #define EXT_CSD_BUS_WIDTH 183 /* R/W */ |
| 257 | #define EXT_CSD_REV 192 /* RO */ | 257 | #define EXT_CSD_HS_TIMING 185 /* R/W */ |
| 258 | #define EXT_CSD_SEC_CNT 212 /* RO, 4 bytes */ | 258 | #define EXT_CSD_REV 192 /* RO */ |
| 259 | #define EXT_CSD_S_A_TIMEOUT 217 | 259 | #define EXT_CSD_STRUCTURE 194 /* RO */ |
| 260 | #define EXT_CSD_CARD_TYPE 196 /* RO */ | ||
| 261 | #define EXT_CSD_SEC_CNT 212 /* RO, 4 bytes */ | ||
| 262 | #define EXT_CSD_S_A_TIMEOUT 217 /* RO */ | ||
| 263 | #define EXT_CSD_ERASE_TIMEOUT_MULT 223 /* RO */ | ||
| 264 | #define EXT_CSD_HC_ERASE_GRP_SIZE 224 /* RO */ | ||
| 265 | #define EXT_CSD_SEC_TRIM_MULT 229 /* RO */ | ||
| 266 | #define EXT_CSD_SEC_ERASE_MULT 230 /* RO */ | ||
| 267 | #define EXT_CSD_SEC_FEATURE_SUPPORT 231 /* RO */ | ||
| 268 | #define EXT_CSD_TRIM_MULT 232 /* RO */ | ||
| 260 | 269 | ||
| 261 | /* | 270 | /* |
| 262 | * EXT_CSD field definitions | 271 | * EXT_CSD field definitions |
| @@ -268,11 +277,23 @@ struct _mmc_csd { | |||
| 268 | 277 | ||
| 269 | #define EXT_CSD_CARD_TYPE_26 (1<<0) /* Card can run at 26MHz */ | 278 | #define EXT_CSD_CARD_TYPE_26 (1<<0) /* Card can run at 26MHz */ |
| 270 | #define EXT_CSD_CARD_TYPE_52 (1<<1) /* Card can run at 52MHz */ | 279 | #define EXT_CSD_CARD_TYPE_52 (1<<1) /* Card can run at 52MHz */ |
| 271 | #define EXT_CSD_CARD_TYPE_MASK 0x3 /* Mask out reserved and DDR bits */ | 280 | #define EXT_CSD_CARD_TYPE_MASK 0xF /* Mask out reserved bits */ |
| 281 | #define EXT_CSD_CARD_TYPE_DDR_1_8V (1<<2) /* Card can run at 52MHz */ | ||
| 282 | /* DDR mode @1.8V or 3V I/O */ | ||
| 283 | #define EXT_CSD_CARD_TYPE_DDR_1_2V (1<<3) /* Card can run at 52MHz */ | ||
| 284 | /* DDR mode @1.2V I/O */ | ||
| 285 | #define EXT_CSD_CARD_TYPE_DDR_52 (EXT_CSD_CARD_TYPE_DDR_1_8V \ | ||
| 286 | | EXT_CSD_CARD_TYPE_DDR_1_2V) | ||
| 272 | 287 | ||
| 273 | #define EXT_CSD_BUS_WIDTH_1 0 /* Card is in 1 bit mode */ | 288 | #define EXT_CSD_BUS_WIDTH_1 0 /* Card is in 1 bit mode */ |
| 274 | #define EXT_CSD_BUS_WIDTH_4 1 /* Card is in 4 bit mode */ | 289 | #define EXT_CSD_BUS_WIDTH_4 1 /* Card is in 4 bit mode */ |
| 275 | #define EXT_CSD_BUS_WIDTH_8 2 /* Card is in 8 bit mode */ | 290 | #define EXT_CSD_BUS_WIDTH_8 2 /* Card is in 8 bit mode */ |
| 291 | #define EXT_CSD_DDR_BUS_WIDTH_4 5 /* Card is in 4 bit DDR mode */ | ||
| 292 | #define EXT_CSD_DDR_BUS_WIDTH_8 6 /* Card is in 8 bit DDR mode */ | ||
| 293 | |||
| 294 | #define EXT_CSD_SEC_ER_EN BIT(0) | ||
| 295 | #define EXT_CSD_SEC_BD_BLK_EN BIT(2) | ||
| 296 | #define EXT_CSD_SEC_GB_CL_EN BIT(4) | ||
| 276 | 297 | ||
| 277 | /* | 298 | /* |
| 278 | * MMC_SWITCH access modes | 299 | * MMC_SWITCH access modes |
diff --git a/include/linux/mmc/sd.h b/include/linux/mmc/sd.h index f310062cffb4..3fd85e088cc3 100644 --- a/include/linux/mmc/sd.h +++ b/include/linux/mmc/sd.h | |||
| @@ -21,8 +21,13 @@ | |||
| 21 | /* class 10 */ | 21 | /* class 10 */ |
| 22 | #define SD_SWITCH 6 /* adtc [31:0] See below R1 */ | 22 | #define SD_SWITCH 6 /* adtc [31:0] See below R1 */ |
| 23 | 23 | ||
| 24 | /* class 5 */ | ||
| 25 | #define SD_ERASE_WR_BLK_START 32 /* ac [31:0] data addr R1 */ | ||
| 26 | #define SD_ERASE_WR_BLK_END 33 /* ac [31:0] data addr R1 */ | ||
| 27 | |||
| 24 | /* Application commands */ | 28 | /* Application commands */ |
| 25 | #define SD_APP_SET_BUS_WIDTH 6 /* ac [1:0] bus width R1 */ | 29 | #define SD_APP_SET_BUS_WIDTH 6 /* ac [1:0] bus width R1 */ |
| 30 | #define SD_APP_SD_STATUS 13 /* adtc R1 */ | ||
| 26 | #define SD_APP_SEND_NUM_WR_BLKS 22 /* adtc R1 */ | 31 | #define SD_APP_SEND_NUM_WR_BLKS 22 /* adtc R1 */ |
| 27 | #define SD_APP_OP_COND 41 /* bcr [31:0] OCR R3 */ | 32 | #define SD_APP_OP_COND 41 /* bcr [31:0] OCR R3 */ |
| 28 | #define SD_APP_SEND_SCR 51 /* adtc R1 */ | 33 | #define SD_APP_SEND_SCR 51 /* adtc R1 */ |
diff --git a/include/linux/sdhci-pltfm.h b/include/linux/mmc/sdhci-pltfm.h index 0239bd70241e..548d59d404cb 100644 --- a/include/linux/sdhci-pltfm.h +++ b/include/linux/mmc/sdhci-pltfm.h | |||
| @@ -28,7 +28,7 @@ struct sdhci_host; | |||
| 28 | struct sdhci_pltfm_data { | 28 | struct sdhci_pltfm_data { |
| 29 | struct sdhci_ops *ops; | 29 | struct sdhci_ops *ops; |
| 30 | unsigned int quirks; | 30 | unsigned int quirks; |
| 31 | int (*init)(struct sdhci_host *host); | 31 | int (*init)(struct sdhci_host *host, struct sdhci_pltfm_data *pdata); |
| 32 | void (*exit)(struct sdhci_host *host); | 32 | void (*exit)(struct sdhci_host *host); |
| 33 | }; | 33 | }; |
| 34 | 34 | ||
diff --git a/include/linux/mmc/sdhci.h b/include/linux/mmc/sdhci.h new file mode 100644 index 000000000000..1fdc673f2396 --- /dev/null +++ b/include/linux/mmc/sdhci.h | |||
| @@ -0,0 +1,144 @@ | |||
| 1 | /* | ||
| 2 | * linux/include/linux/mmc/sdhci.h - Secure Digital Host Controller Interface | ||
| 3 | * | ||
| 4 | * Copyright (C) 2005-2008 Pierre Ossman, All Rights Reserved. | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify | ||
| 7 | * it under the terms of the GNU General Public License as published by | ||
| 8 | * the Free Software Foundation; either version 2 of the License, or (at | ||
| 9 | * your option) any later version. | ||
| 10 | */ | ||
| 11 | #ifndef __SDHCI_H | ||
| 12 | #define __SDHCI_H | ||
| 13 | |||
| 14 | #include <linux/scatterlist.h> | ||
| 15 | #include <linux/compiler.h> | ||
| 16 | #include <linux/types.h> | ||
| 17 | #include <linux/io.h> | ||
| 18 | #include <linux/mmc/host.h> | ||
| 19 | |||
| 20 | struct sdhci_host { | ||
| 21 | /* Data set by hardware interface driver */ | ||
| 22 | const char *hw_name; /* Hardware bus name */ | ||
| 23 | |||
| 24 | unsigned int quirks; /* Deviations from spec. */ | ||
| 25 | |||
| 26 | /* Controller doesn't honor resets unless we touch the clock register */ | ||
| 27 | #define SDHCI_QUIRK_CLOCK_BEFORE_RESET (1<<0) | ||
| 28 | /* Controller has bad caps bits, but really supports DMA */ | ||
| 29 | #define SDHCI_QUIRK_FORCE_DMA (1<<1) | ||
| 30 | /* Controller doesn't like to be reset when there is no card inserted. */ | ||
| 31 | #define SDHCI_QUIRK_NO_CARD_NO_RESET (1<<2) | ||
| 32 | /* Controller doesn't like clearing the power reg before a change */ | ||
| 33 | #define SDHCI_QUIRK_SINGLE_POWER_WRITE (1<<3) | ||
| 34 | /* Controller has flaky internal state so reset it on each ios change */ | ||
| 35 | #define SDHCI_QUIRK_RESET_CMD_DATA_ON_IOS (1<<4) | ||
| 36 | /* Controller has an unusable DMA engine */ | ||
| 37 | #define SDHCI_QUIRK_BROKEN_DMA (1<<5) | ||
| 38 | /* Controller has an unusable ADMA engine */ | ||
| 39 | #define SDHCI_QUIRK_BROKEN_ADMA (1<<6) | ||
| 40 | /* Controller can only DMA from 32-bit aligned addresses */ | ||
| 41 | #define SDHCI_QUIRK_32BIT_DMA_ADDR (1<<7) | ||
| 42 | /* Controller can only DMA chunk sizes that are a multiple of 32 bits */ | ||
| 43 | #define SDHCI_QUIRK_32BIT_DMA_SIZE (1<<8) | ||
| 44 | /* Controller can only ADMA chunks that are a multiple of 32 bits */ | ||
| 45 | #define SDHCI_QUIRK_32BIT_ADMA_SIZE (1<<9) | ||
| 46 | /* Controller needs to be reset after each request to stay stable */ | ||
| 47 | #define SDHCI_QUIRK_RESET_AFTER_REQUEST (1<<10) | ||
| 48 | /* Controller needs voltage and power writes to happen separately */ | ||
| 49 | #define SDHCI_QUIRK_NO_SIMULT_VDD_AND_POWER (1<<11) | ||
| 50 | /* Controller provides an incorrect timeout value for transfers */ | ||
| 51 | #define SDHCI_QUIRK_BROKEN_TIMEOUT_VAL (1<<12) | ||
| 52 | /* Controller has an issue with buffer bits for small transfers */ | ||
| 53 | #define SDHCI_QUIRK_BROKEN_SMALL_PIO (1<<13) | ||
| 54 | /* Controller does not provide transfer-complete interrupt when not busy */ | ||
| 55 | #define SDHCI_QUIRK_NO_BUSY_IRQ (1<<14) | ||
| 56 | /* Controller has unreliable card detection */ | ||
| 57 | #define SDHCI_QUIRK_BROKEN_CARD_DETECTION (1<<15) | ||
| 58 | /* Controller reports inverted write-protect state */ | ||
| 59 | #define SDHCI_QUIRK_INVERTED_WRITE_PROTECT (1<<16) | ||
| 60 | /* Controller has nonstandard clock management */ | ||
| 61 | #define SDHCI_QUIRK_NONSTANDARD_CLOCK (1<<17) | ||
| 62 | /* Controller does not like fast PIO transfers */ | ||
| 63 | #define SDHCI_QUIRK_PIO_NEEDS_DELAY (1<<18) | ||
| 64 | /* Controller losing signal/interrupt enable states after reset */ | ||
| 65 | #define SDHCI_QUIRK_RESTORE_IRQS_AFTER_RESET (1<<19) | ||
| 66 | /* Controller has to be forced to use block size of 2048 bytes */ | ||
| 67 | #define SDHCI_QUIRK_FORCE_BLK_SZ_2048 (1<<20) | ||
| 68 | /* Controller cannot do multi-block transfers */ | ||
| 69 | #define SDHCI_QUIRK_NO_MULTIBLOCK (1<<21) | ||
| 70 | /* Controller can only handle 1-bit data transfers */ | ||
| 71 | #define SDHCI_QUIRK_FORCE_1_BIT_DATA (1<<22) | ||
| 72 | /* Controller needs 10ms delay between applying power and clock */ | ||
| 73 | #define SDHCI_QUIRK_DELAY_AFTER_POWER (1<<23) | ||
| 74 | /* Controller uses SDCLK instead of TMCLK for data timeouts */ | ||
| 75 | #define SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK (1<<24) | ||
| 76 | /* Controller reports wrong base clock capability */ | ||
| 77 | #define SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN (1<<25) | ||
| 78 | /* Controller cannot support End Attribute in NOP ADMA descriptor */ | ||
| 79 | #define SDHCI_QUIRK_NO_ENDATTR_IN_NOPDESC (1<<26) | ||
| 80 | /* Controller is missing device caps. Use caps provided by host */ | ||
| 81 | #define SDHCI_QUIRK_MISSING_CAPS (1<<27) | ||
| 82 | /* Controller uses Auto CMD12 command to stop the transfer */ | ||
| 83 | #define SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12 (1<<28) | ||
| 84 | /* Controller doesn't have HISPD bit field in HI-SPEED SD card */ | ||
| 85 | #define SDHCI_QUIRK_NO_HISPD_BIT (1<<29) | ||
| 86 | |||
| 87 | int irq; /* Device IRQ */ | ||
| 88 | void __iomem *ioaddr; /* Mapped address */ | ||
| 89 | |||
| 90 | const struct sdhci_ops *ops; /* Low level hw interface */ | ||
| 91 | |||
| 92 | struct regulator *vmmc; /* Power regulator */ | ||
| 93 | |||
| 94 | /* Internal data */ | ||
| 95 | struct mmc_host *mmc; /* MMC structure */ | ||
| 96 | u64 dma_mask; /* custom DMA mask */ | ||
| 97 | |||
| 98 | #if defined(CONFIG_LEDS_CLASS) || defined(CONFIG_LEDS_CLASS_MODULE) | ||
| 99 | struct led_classdev led; /* LED control */ | ||
| 100 | char led_name[32]; | ||
| 101 | #endif | ||
| 102 | |||
| 103 | spinlock_t lock; /* Mutex */ | ||
| 104 | |||
| 105 | int flags; /* Host attributes */ | ||
| 106 | #define SDHCI_USE_SDMA (1<<0) /* Host is SDMA capable */ | ||
| 107 | #define SDHCI_USE_ADMA (1<<1) /* Host is ADMA capable */ | ||
| 108 | #define SDHCI_REQ_USE_DMA (1<<2) /* Use DMA for this req. */ | ||
| 109 | #define SDHCI_DEVICE_DEAD (1<<3) /* Device unresponsive */ | ||
| 110 | |||
| 111 | unsigned int version; /* SDHCI spec. version */ | ||
| 112 | |||
| 113 | unsigned int max_clk; /* Max possible freq (MHz) */ | ||
| 114 | unsigned int timeout_clk; /* Timeout freq (KHz) */ | ||
| 115 | |||
| 116 | unsigned int clock; /* Current clock (MHz) */ | ||
| 117 | u8 pwr; /* Current voltage */ | ||
| 118 | |||
| 119 | struct mmc_request *mrq; /* Current request */ | ||
| 120 | struct mmc_command *cmd; /* Current command */ | ||
| 121 | struct mmc_data *data; /* Current data request */ | ||
| 122 | unsigned int data_early:1; /* Data finished before cmd */ | ||
| 123 | |||
| 124 | struct sg_mapping_iter sg_miter; /* SG state for PIO */ | ||
| 125 | unsigned int blocks; /* remaining PIO blocks */ | ||
| 126 | |||
| 127 | int sg_count; /* Mapped sg entries */ | ||
| 128 | |||
| 129 | u8 *adma_desc; /* ADMA descriptor table */ | ||
| 130 | u8 *align_buffer; /* Bounce buffer */ | ||
| 131 | |||
| 132 | dma_addr_t adma_addr; /* Mapped ADMA descr. table */ | ||
| 133 | dma_addr_t align_addr; /* Mapped bounce buffer */ | ||
| 134 | |||
| 135 | struct tasklet_struct card_tasklet; /* Tasklet structures */ | ||
| 136 | struct tasklet_struct finish_tasklet; | ||
| 137 | |||
| 138 | struct timer_list timer; /* Timer for timeouts */ | ||
| 139 | |||
| 140 | unsigned int caps; /* Alternative capabilities */ | ||
| 141 | |||
| 142 | unsigned long private[0] ____cacheline_aligned; | ||
| 143 | }; | ||
| 144 | #endif /* __SDHCI_H */ | ||
diff --git a/include/linux/mmc/sdio.h b/include/linux/mmc/sdio.h index 329a8faa6e37..245cdacee544 100644 --- a/include/linux/mmc/sdio.h +++ b/include/linux/mmc/sdio.h | |||
| @@ -38,6 +38,8 @@ | |||
| 38 | * [8:0] Byte/block count | 38 | * [8:0] Byte/block count |
| 39 | */ | 39 | */ |
| 40 | 40 | ||
| 41 | #define R4_MEMORY_PRESENT (1 << 27) | ||
| 42 | |||
| 41 | /* | 43 | /* |
| 42 | SDIO status in R5 | 44 | SDIO status in R5 |
| 43 | Type | 45 | Type |
diff --git a/include/linux/mmc/sdio_ids.h b/include/linux/mmc/sdio_ids.h index 33b2ea09a4ad..a36ab3bc7b03 100644 --- a/include/linux/mmc/sdio_ids.h +++ b/include/linux/mmc/sdio_ids.h | |||
| @@ -18,6 +18,7 @@ | |||
| 18 | #define SDIO_CLASS_PHS 0x06 /* PHS standard interface */ | 18 | #define SDIO_CLASS_PHS 0x06 /* PHS standard interface */ |
| 19 | #define SDIO_CLASS_WLAN 0x07 /* WLAN interface */ | 19 | #define SDIO_CLASS_WLAN 0x07 /* WLAN interface */ |
| 20 | #define SDIO_CLASS_ATA 0x08 /* Embedded SDIO-ATA std interface */ | 20 | #define SDIO_CLASS_ATA 0x08 /* Embedded SDIO-ATA std interface */ |
| 21 | #define SDIO_CLASS_BT_AMP 0x09 /* Type-A Bluetooth AMP interface */ | ||
| 21 | 22 | ||
| 22 | /* | 23 | /* |
| 23 | * Vendors and devices. Sort key: vendor first, device next. | 24 | * Vendors and devices. Sort key: vendor first, device next. |
diff --git a/include/linux/mmdebug.h b/include/linux/mmdebug.h index ee24ef8ab616..c04ecfe03f7f 100644 --- a/include/linux/mmdebug.h +++ b/include/linux/mmdebug.h | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | #ifdef CONFIG_DEBUG_VM | 4 | #ifdef CONFIG_DEBUG_VM |
| 5 | #define VM_BUG_ON(cond) BUG_ON(cond) | 5 | #define VM_BUG_ON(cond) BUG_ON(cond) |
| 6 | #else | 6 | #else |
| 7 | #define VM_BUG_ON(cond) do { } while (0) | 7 | #define VM_BUG_ON(cond) do { (void)(cond); } while (0) |
| 8 | #endif | 8 | #endif |
| 9 | 9 | ||
| 10 | #ifdef CONFIG_DEBUG_VIRTUAL | 10 | #ifdef CONFIG_DEBUG_VIRTUAL |
diff --git a/include/linux/mmu_notifier.h b/include/linux/mmu_notifier.h index 4e02ee2b071e..43dcfbdc39de 100644 --- a/include/linux/mmu_notifier.h +++ b/include/linux/mmu_notifier.h | |||
| @@ -227,7 +227,7 @@ static inline void mmu_notifier_mm_destroy(struct mm_struct *mm) | |||
| 227 | 227 | ||
| 228 | /* | 228 | /* |
| 229 | * These two macros will sometime replace ptep_clear_flush. | 229 | * These two macros will sometime replace ptep_clear_flush. |
| 230 | * ptep_clear_flush is impleemnted as macro itself, so this also is | 230 | * ptep_clear_flush is implemented as macro itself, so this also is |
| 231 | * implemented as a macro until ptep_clear_flush will converted to an | 231 | * implemented as a macro until ptep_clear_flush will converted to an |
| 232 | * inline function, to diminish the risk of compilation failure. The | 232 | * inline function, to diminish the risk of compilation failure. The |
| 233 | * invalidate_page method over time can be moved outside the PT lock | 233 | * invalidate_page method over time can be moved outside the PT lock |
diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index b4d109e389b8..39c24ebe9cfd 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h | |||
| @@ -104,6 +104,8 @@ enum zone_stat_item { | |||
| 104 | NR_ISOLATED_ANON, /* Temporary isolated pages from anon lru */ | 104 | NR_ISOLATED_ANON, /* Temporary isolated pages from anon lru */ |
| 105 | NR_ISOLATED_FILE, /* Temporary isolated pages from file lru */ | 105 | NR_ISOLATED_FILE, /* Temporary isolated pages from file lru */ |
| 106 | NR_SHMEM, /* shmem pages (included tmpfs/GEM pages) */ | 106 | NR_SHMEM, /* shmem pages (included tmpfs/GEM pages) */ |
| 107 | NR_DIRTIED, /* page dirtyings since bootup */ | ||
| 108 | NR_WRITTEN, /* page writings since bootup */ | ||
| 107 | #ifdef CONFIG_NUMA | 109 | #ifdef CONFIG_NUMA |
| 108 | NUMA_HIT, /* allocated in intended node */ | 110 | NUMA_HIT, /* allocated in intended node */ |
| 109 | NUMA_MISS, /* allocated in non intended node */ | 111 | NUMA_MISS, /* allocated in non intended node */ |
| @@ -284,6 +286,13 @@ struct zone { | |||
| 284 | unsigned long watermark[NR_WMARK]; | 286 | unsigned long watermark[NR_WMARK]; |
| 285 | 287 | ||
| 286 | /* | 288 | /* |
| 289 | * When free pages are below this point, additional steps are taken | ||
| 290 | * when reading the number of free pages to avoid per-cpu counter | ||
| 291 | * drift allowing watermarks to be breached | ||
| 292 | */ | ||
| 293 | unsigned long percpu_drift_mark; | ||
| 294 | |||
| 295 | /* | ||
| 287 | * We don't know if the memory that we're going to allocate will be freeable | 296 | * We don't know if the memory that we're going to allocate will be freeable |
| 288 | * or/and it will be released eventually, so to avoid totally wasting several | 297 | * or/and it will be released eventually, so to avoid totally wasting several |
| 289 | * GB of ram we must reserve some of the lower zone memory (otherwise we risk | 298 | * GB of ram we must reserve some of the lower zone memory (otherwise we risk |
| @@ -348,21 +357,6 @@ struct zone { | |||
| 348 | atomic_long_t vm_stat[NR_VM_ZONE_STAT_ITEMS]; | 357 | atomic_long_t vm_stat[NR_VM_ZONE_STAT_ITEMS]; |
| 349 | 358 | ||
| 350 | /* | 359 | /* |
| 351 | * prev_priority holds the scanning priority for this zone. It is | ||
| 352 | * defined as the scanning priority at which we achieved our reclaim | ||
| 353 | * target at the previous try_to_free_pages() or balance_pgdat() | ||
| 354 | * invocation. | ||
| 355 | * | ||
| 356 | * We use prev_priority as a measure of how much stress page reclaim is | ||
| 357 | * under - it drives the swappiness decision: whether to unmap mapped | ||
| 358 | * pages. | ||
| 359 | * | ||
| 360 | * Access to both this field is quite racy even on uniprocessor. But | ||
| 361 | * it is expected to average out OK. | ||
| 362 | */ | ||
| 363 | int prev_priority; | ||
| 364 | |||
| 365 | /* | ||
| 366 | * The target ratio of ACTIVE_ANON to INACTIVE_ANON pages on | 360 | * The target ratio of ACTIVE_ANON to INACTIVE_ANON pages on |
| 367 | * this zone's LRU. Maintained by the pageout code. | 361 | * this zone's LRU. Maintained by the pageout code. |
| 368 | */ | 362 | */ |
| @@ -429,6 +423,9 @@ struct zone { | |||
| 429 | typedef enum { | 423 | typedef enum { |
| 430 | ZONE_RECLAIM_LOCKED, /* prevents concurrent reclaim */ | 424 | ZONE_RECLAIM_LOCKED, /* prevents concurrent reclaim */ |
| 431 | ZONE_OOM_LOCKED, /* zone is in OOM killer zonelist */ | 425 | ZONE_OOM_LOCKED, /* zone is in OOM killer zonelist */ |
| 426 | ZONE_CONGESTED, /* zone has many dirty pages backed by | ||
| 427 | * a congested BDI | ||
| 428 | */ | ||
| 432 | } zone_flags_t; | 429 | } zone_flags_t; |
| 433 | 430 | ||
| 434 | static inline void zone_set_flag(struct zone *zone, zone_flags_t flag) | 431 | static inline void zone_set_flag(struct zone *zone, zone_flags_t flag) |
| @@ -446,6 +443,11 @@ static inline void zone_clear_flag(struct zone *zone, zone_flags_t flag) | |||
| 446 | clear_bit(flag, &zone->flags); | 443 | clear_bit(flag, &zone->flags); |
| 447 | } | 444 | } |
| 448 | 445 | ||
| 446 | static inline int zone_is_reclaim_congested(const struct zone *zone) | ||
| 447 | { | ||
| 448 | return test_bit(ZONE_CONGESTED, &zone->flags); | ||
| 449 | } | ||
| 450 | |||
| 449 | static inline int zone_is_reclaim_locked(const struct zone *zone) | 451 | static inline int zone_is_reclaim_locked(const struct zone *zone) |
| 450 | { | 452 | { |
| 451 | return test_bit(ZONE_RECLAIM_LOCKED, &zone->flags); | 453 | return test_bit(ZONE_RECLAIM_LOCKED, &zone->flags); |
| @@ -456,6 +458,12 @@ static inline int zone_is_oom_locked(const struct zone *zone) | |||
| 456 | return test_bit(ZONE_OOM_LOCKED, &zone->flags); | 458 | return test_bit(ZONE_OOM_LOCKED, &zone->flags); |
| 457 | } | 459 | } |
| 458 | 460 | ||
| 461 | #ifdef CONFIG_SMP | ||
| 462 | unsigned long zone_nr_free_pages(struct zone *zone); | ||
| 463 | #else | ||
| 464 | #define zone_nr_free_pages(zone) zone_page_state(zone, NR_FREE_PAGES) | ||
| 465 | #endif /* CONFIG_SMP */ | ||
| 466 | |||
| 459 | /* | 467 | /* |
| 460 | * The "priority" of VM scanning is how much of the queues we will scan in one | 468 | * The "priority" of VM scanning is how much of the queues we will scan in one |
| 461 | * go. A value of 12 for DEF_PRIORITY implies that we will scan 1/4096th of the | 469 | * go. A value of 12 for DEF_PRIORITY implies that we will scan 1/4096th of the |
| @@ -651,8 +659,6 @@ typedef struct pglist_data { | |||
| 651 | #include <linux/memory_hotplug.h> | 659 | #include <linux/memory_hotplug.h> |
| 652 | 660 | ||
| 653 | extern struct mutex zonelists_mutex; | 661 | extern struct mutex zonelists_mutex; |
| 654 | void get_zone_counts(unsigned long *active, unsigned long *inactive, | ||
| 655 | unsigned long *free); | ||
| 656 | void build_all_zonelists(void *data); | 662 | void build_all_zonelists(void *data); |
| 657 | void wakeup_kswapd(struct zone *zone, int order); | 663 | void wakeup_kswapd(struct zone *zone, int order); |
| 658 | int zone_watermark_ok(struct zone *z, int order, unsigned long mark, | 664 | int zone_watermark_ok(struct zone *z, int order, unsigned long mark, |
diff --git a/include/linux/module.h b/include/linux/module.h index 8a6b9fdc7ffa..b29e7458b966 100644 --- a/include/linux/module.h +++ b/include/linux/module.h | |||
| @@ -350,7 +350,10 @@ struct module | |||
| 350 | struct tracepoint *tracepoints; | 350 | struct tracepoint *tracepoints; |
| 351 | unsigned int num_tracepoints; | 351 | unsigned int num_tracepoints; |
| 352 | #endif | 352 | #endif |
| 353 | 353 | #ifdef HAVE_JUMP_LABEL | |
| 354 | struct jump_entry *jump_entries; | ||
| 355 | unsigned int num_jump_entries; | ||
| 356 | #endif | ||
| 354 | #ifdef CONFIG_TRACING | 357 | #ifdef CONFIG_TRACING |
| 355 | const char **trace_bprintk_fmt_start; | 358 | const char **trace_bprintk_fmt_start; |
| 356 | unsigned int num_trace_bprintk_fmt; | 359 | unsigned int num_trace_bprintk_fmt; |
| @@ -686,17 +689,16 @@ extern int module_sysfs_initialized; | |||
| 686 | 689 | ||
| 687 | 690 | ||
| 688 | #ifdef CONFIG_GENERIC_BUG | 691 | #ifdef CONFIG_GENERIC_BUG |
| 689 | int module_bug_finalize(const Elf_Ehdr *, const Elf_Shdr *, | 692 | void module_bug_finalize(const Elf_Ehdr *, const Elf_Shdr *, |
| 690 | struct module *); | 693 | struct module *); |
| 691 | void module_bug_cleanup(struct module *); | 694 | void module_bug_cleanup(struct module *); |
| 692 | 695 | ||
| 693 | #else /* !CONFIG_GENERIC_BUG */ | 696 | #else /* !CONFIG_GENERIC_BUG */ |
| 694 | 697 | ||
| 695 | static inline int module_bug_finalize(const Elf_Ehdr *hdr, | 698 | static inline void module_bug_finalize(const Elf_Ehdr *hdr, |
| 696 | const Elf_Shdr *sechdrs, | 699 | const Elf_Shdr *sechdrs, |
| 697 | struct module *mod) | 700 | struct module *mod) |
| 698 | { | 701 | { |
| 699 | return 0; | ||
| 700 | } | 702 | } |
| 701 | static inline void module_bug_cleanup(struct module *mod) {} | 703 | static inline void module_bug_cleanup(struct module *mod) {} |
| 702 | #endif /* CONFIG_GENERIC_BUG */ | 704 | #endif /* CONFIG_GENERIC_BUG */ |
diff --git a/include/linux/moduleparam.h b/include/linux/moduleparam.h index 82a9124f7d75..112adf8bd47d 100644 --- a/include/linux/moduleparam.h +++ b/include/linux/moduleparam.h | |||
| @@ -21,8 +21,8 @@ | |||
| 21 | #define __module_cat(a,b) ___module_cat(a,b) | 21 | #define __module_cat(a,b) ___module_cat(a,b) |
| 22 | #define __MODULE_INFO(tag, name, info) \ | 22 | #define __MODULE_INFO(tag, name, info) \ |
| 23 | static const char __module_cat(name,__LINE__)[] \ | 23 | static const char __module_cat(name,__LINE__)[] \ |
| 24 | __used \ | 24 | __used __attribute__((section(".modinfo"), unused, aligned(1))) \ |
| 25 | __attribute__((section(".modinfo"),unused)) = __stringify(tag) "=" info | 25 | = __stringify(tag) "=" info |
| 26 | #else /* !MODULE */ | 26 | #else /* !MODULE */ |
| 27 | #define __MODULE_INFO(tag, name, info) | 27 | #define __MODULE_INFO(tag, name, info) |
| 28 | #endif | 28 | #endif |
| @@ -31,20 +31,23 @@ static const char __module_cat(name,__LINE__)[] \ | |||
| 31 | 31 | ||
| 32 | struct kernel_param; | 32 | struct kernel_param; |
| 33 | 33 | ||
| 34 | /* Returns 0, or -errno. arg is in kp->arg. */ | 34 | struct kernel_param_ops { |
| 35 | typedef int (*param_set_fn)(const char *val, struct kernel_param *kp); | 35 | /* Returns 0, or -errno. arg is in kp->arg. */ |
| 36 | /* Returns length written or -errno. Buffer is 4k (ie. be short!) */ | 36 | int (*set)(const char *val, const struct kernel_param *kp); |
| 37 | typedef int (*param_get_fn)(char *buffer, struct kernel_param *kp); | 37 | /* Returns length written or -errno. Buffer is 4k (ie. be short!) */ |
| 38 | int (*get)(char *buffer, const struct kernel_param *kp); | ||
| 39 | /* Optional function to free kp->arg when module unloaded. */ | ||
| 40 | void (*free)(void *arg); | ||
| 41 | }; | ||
| 38 | 42 | ||
| 39 | /* Flag bits for kernel_param.flags */ | 43 | /* Flag bits for kernel_param.flags */ |
| 40 | #define KPARAM_ISBOOL 2 | 44 | #define KPARAM_ISBOOL 2 |
| 41 | 45 | ||
| 42 | struct kernel_param { | 46 | struct kernel_param { |
| 43 | const char *name; | 47 | const char *name; |
| 48 | const struct kernel_param_ops *ops; | ||
| 44 | u16 perm; | 49 | u16 perm; |
| 45 | u16 flags; | 50 | u16 flags; |
| 46 | param_set_fn set; | ||
| 47 | param_get_fn get; | ||
| 48 | union { | 51 | union { |
| 49 | void *arg; | 52 | void *arg; |
| 50 | const struct kparam_string *str; | 53 | const struct kparam_string *str; |
| @@ -63,12 +66,67 @@ struct kparam_array | |||
| 63 | { | 66 | { |
| 64 | unsigned int max; | 67 | unsigned int max; |
| 65 | unsigned int *num; | 68 | unsigned int *num; |
| 66 | param_set_fn set; | 69 | const struct kernel_param_ops *ops; |
| 67 | param_get_fn get; | ||
| 68 | unsigned int elemsize; | 70 | unsigned int elemsize; |
| 69 | void *elem; | 71 | void *elem; |
| 70 | }; | 72 | }; |
| 71 | 73 | ||
| 74 | /** | ||
| 75 | * module_param - typesafe helper for a module/cmdline parameter | ||
| 76 | * @value: the variable to alter, and exposed parameter name. | ||
| 77 | * @type: the type of the parameter | ||
| 78 | * @perm: visibility in sysfs. | ||
| 79 | * | ||
| 80 | * @value becomes the module parameter, or (prefixed by KBUILD_MODNAME and a | ||
| 81 | * ".") the kernel commandline parameter. Note that - is changed to _, so | ||
| 82 | * the user can use "foo-bar=1" even for variable "foo_bar". | ||
| 83 | * | ||
| 84 | * @perm is 0 if the the variable is not to appear in sysfs, or 0444 | ||
| 85 | * for world-readable, 0644 for root-writable, etc. Note that if it | ||
| 86 | * is writable, you may need to use kparam_block_sysfs_write() around | ||
| 87 | * accesses (esp. charp, which can be kfreed when it changes). | ||
| 88 | * | ||
| 89 | * The @type is simply pasted to refer to a param_ops_##type and a | ||
| 90 | * param_check_##type: for convenience many standard types are provided but | ||
| 91 | * you can create your own by defining those variables. | ||
| 92 | * | ||
| 93 | * Standard types are: | ||
| 94 | * byte, short, ushort, int, uint, long, ulong | ||
| 95 | * charp: a character pointer | ||
| 96 | * bool: a bool, values 0/1, y/n, Y/N. | ||
| 97 | * invbool: the above, only sense-reversed (N = true). | ||
| 98 | */ | ||
| 99 | #define module_param(name, type, perm) \ | ||
| 100 | module_param_named(name, name, type, perm) | ||
| 101 | |||
| 102 | /** | ||
| 103 | * module_param_named - typesafe helper for a renamed module/cmdline parameter | ||
| 104 | * @name: a valid C identifier which is the parameter name. | ||
| 105 | * @value: the actual lvalue to alter. | ||
| 106 | * @type: the type of the parameter | ||
| 107 | * @perm: visibility in sysfs. | ||
| 108 | * | ||
| 109 | * Usually it's a good idea to have variable names and user-exposed names the | ||
| 110 | * same, but that's harder if the variable must be non-static or is inside a | ||
| 111 | * structure. This allows exposure under a different name. | ||
| 112 | */ | ||
| 113 | #define module_param_named(name, value, type, perm) \ | ||
| 114 | param_check_##type(name, &(value)); \ | ||
| 115 | module_param_cb(name, ¶m_ops_##type, &value, perm); \ | ||
| 116 | __MODULE_PARM_TYPE(name, #type) | ||
| 117 | |||
| 118 | /** | ||
| 119 | * module_param_cb - general callback for a module/cmdline parameter | ||
| 120 | * @name: a valid C identifier which is the parameter name. | ||
| 121 | * @ops: the set & get operations for this parameter. | ||
| 122 | * @perm: visibility in sysfs. | ||
| 123 | * | ||
| 124 | * The ops can have NULL set or get functions. | ||
| 125 | */ | ||
| 126 | #define module_param_cb(name, ops, arg, perm) \ | ||
| 127 | __module_param_call(MODULE_PARAM_PREFIX, \ | ||
| 128 | name, ops, arg, __same_type((arg), bool *), perm) | ||
| 129 | |||
| 72 | /* On alpha, ia64 and ppc64 relocations to global data cannot go into | 130 | /* On alpha, ia64 and ppc64 relocations to global data cannot go into |
| 73 | read-only sections (which is part of respective UNIX ABI on these | 131 | read-only sections (which is part of respective UNIX ABI on these |
| 74 | platforms). So 'const' makes no sense and even causes compile failures | 132 | platforms). So 'const' makes no sense and even causes compile failures |
| @@ -80,10 +138,8 @@ struct kparam_array | |||
| 80 | #endif | 138 | #endif |
| 81 | 139 | ||
| 82 | /* This is the fundamental function for registering boot/module | 140 | /* This is the fundamental function for registering boot/module |
| 83 | parameters. perm sets the visibility in sysfs: 000 means it's | 141 | parameters. */ |
| 84 | not there, read bits mean it's readable, write bits mean it's | 142 | #define __module_param_call(prefix, name, ops, arg, isbool, perm) \ |
| 85 | writable. */ | ||
| 86 | #define __module_param_call(prefix, name, set, get, arg, isbool, perm) \ | ||
| 87 | /* Default value instead of permissions? */ \ | 143 | /* Default value instead of permissions? */ \ |
| 88 | static int __param_perm_check_##name __attribute__((unused)) = \ | 144 | static int __param_perm_check_##name __attribute__((unused)) = \ |
| 89 | BUILD_BUG_ON_ZERO((perm) < 0 || (perm) > 0777 || ((perm) & 2)) \ | 145 | BUILD_BUG_ON_ZERO((perm) < 0 || (perm) > 0777 || ((perm) & 2)) \ |
| @@ -92,31 +148,87 @@ struct kparam_array | |||
| 92 | static struct kernel_param __moduleparam_const __param_##name \ | 148 | static struct kernel_param __moduleparam_const __param_##name \ |
| 93 | __used \ | 149 | __used \ |
| 94 | __attribute__ ((unused,__section__ ("__param"),aligned(sizeof(void *)))) \ | 150 | __attribute__ ((unused,__section__ ("__param"),aligned(sizeof(void *)))) \ |
| 95 | = { __param_str_##name, perm, isbool ? KPARAM_ISBOOL : 0, \ | 151 | = { __param_str_##name, ops, perm, isbool ? KPARAM_ISBOOL : 0, \ |
| 96 | set, get, { arg } } | 152 | { arg } } |
| 153 | |||
| 154 | /* Obsolete - use module_param_cb() */ | ||
| 155 | #define module_param_call(name, set, get, arg, perm) \ | ||
| 156 | static struct kernel_param_ops __param_ops_##name = \ | ||
| 157 | { (void *)set, (void *)get }; \ | ||
| 158 | __module_param_call(MODULE_PARAM_PREFIX, \ | ||
| 159 | name, &__param_ops_##name, arg, \ | ||
| 160 | __same_type(arg, bool *), \ | ||
| 161 | (perm) + sizeof(__check_old_set_param(set))*0) | ||
| 162 | |||
| 163 | /* We don't get oldget: it's often a new-style param_get_uint, etc. */ | ||
| 164 | static inline int | ||
| 165 | __check_old_set_param(int (*oldset)(const char *, struct kernel_param *)) | ||
| 166 | { | ||
| 167 | return 0; | ||
| 168 | } | ||
| 97 | 169 | ||
| 98 | #define module_param_call(name, set, get, arg, perm) \ | 170 | /** |
| 99 | __module_param_call(MODULE_PARAM_PREFIX, \ | 171 | * kparam_block_sysfs_write - make sure a parameter isn't written via sysfs. |
| 100 | name, set, get, arg, \ | 172 | * @name: the name of the parameter |
| 101 | __same_type(*(arg), bool), perm) | 173 | * |
| 174 | * There's no point blocking write on a paramter that isn't writable via sysfs! | ||
| 175 | */ | ||
| 176 | #define kparam_block_sysfs_write(name) \ | ||
| 177 | do { \ | ||
| 178 | BUG_ON(!(__param_##name.perm & 0222)); \ | ||
| 179 | __kernel_param_lock(); \ | ||
| 180 | } while (0) | ||
| 102 | 181 | ||
| 103 | /* Helper functions: type is byte, short, ushort, int, uint, long, | 182 | /** |
| 104 | ulong, charp, bool or invbool, or XXX if you define param_get_XXX, | 183 | * kparam_unblock_sysfs_write - allows sysfs to write to a parameter again. |
| 105 | param_set_XXX and param_check_XXX. */ | 184 | * @name: the name of the parameter |
| 106 | #define module_param_named(name, value, type, perm) \ | 185 | */ |
| 107 | param_check_##type(name, &(value)); \ | 186 | #define kparam_unblock_sysfs_write(name) \ |
| 108 | module_param_call(name, param_set_##type, param_get_##type, &value, perm); \ | 187 | do { \ |
| 109 | __MODULE_PARM_TYPE(name, #type) | 188 | BUG_ON(!(__param_##name.perm & 0222)); \ |
| 189 | __kernel_param_unlock(); \ | ||
| 190 | } while (0) | ||
| 110 | 191 | ||
| 111 | #define module_param(name, type, perm) \ | 192 | /** |
| 112 | module_param_named(name, name, type, perm) | 193 | * kparam_block_sysfs_read - make sure a parameter isn't read via sysfs. |
| 194 | * @name: the name of the parameter | ||
| 195 | * | ||
| 196 | * This also blocks sysfs writes. | ||
| 197 | */ | ||
| 198 | #define kparam_block_sysfs_read(name) \ | ||
| 199 | do { \ | ||
| 200 | BUG_ON(!(__param_##name.perm & 0444)); \ | ||
| 201 | __kernel_param_lock(); \ | ||
| 202 | } while (0) | ||
| 203 | |||
| 204 | /** | ||
| 205 | * kparam_unblock_sysfs_read - allows sysfs to read a parameter again. | ||
| 206 | * @name: the name of the parameter | ||
| 207 | */ | ||
| 208 | #define kparam_unblock_sysfs_read(name) \ | ||
| 209 | do { \ | ||
| 210 | BUG_ON(!(__param_##name.perm & 0444)); \ | ||
| 211 | __kernel_param_unlock(); \ | ||
| 212 | } while (0) | ||
| 213 | |||
| 214 | #ifdef CONFIG_SYSFS | ||
| 215 | extern void __kernel_param_lock(void); | ||
| 216 | extern void __kernel_param_unlock(void); | ||
| 217 | #else | ||
| 218 | static inline void __kernel_param_lock(void) | ||
| 219 | { | ||
| 220 | } | ||
| 221 | static inline void __kernel_param_unlock(void) | ||
| 222 | { | ||
| 223 | } | ||
| 224 | #endif | ||
| 113 | 225 | ||
| 114 | #ifndef MODULE | 226 | #ifndef MODULE |
| 115 | /** | 227 | /** |
| 116 | * core_param - define a historical core kernel parameter. | 228 | * core_param - define a historical core kernel parameter. |
| 117 | * @name: the name of the cmdline and sysfs parameter (often the same as var) | 229 | * @name: the name of the cmdline and sysfs parameter (often the same as var) |
| 118 | * @var: the variable | 230 | * @var: the variable |
| 119 | * @type: the type (for param_set_##type and param_get_##type) | 231 | * @type: the type of the parameter |
| 120 | * @perm: visibility in sysfs | 232 | * @perm: visibility in sysfs |
| 121 | * | 233 | * |
| 122 | * core_param is just like module_param(), but cannot be modular and | 234 | * core_param is just like module_param(), but cannot be modular and |
| @@ -126,23 +238,32 @@ struct kparam_array | |||
| 126 | */ | 238 | */ |
| 127 | #define core_param(name, var, type, perm) \ | 239 | #define core_param(name, var, type, perm) \ |
| 128 | param_check_##type(name, &(var)); \ | 240 | param_check_##type(name, &(var)); \ |
| 129 | __module_param_call("", name, param_set_##type, param_get_##type, \ | 241 | __module_param_call("", name, ¶m_ops_##type, \ |
| 130 | &var, __same_type(var, bool), perm) | 242 | &var, __same_type(var, bool), perm) |
| 131 | #endif /* !MODULE */ | 243 | #endif /* !MODULE */ |
| 132 | 244 | ||
| 133 | /* Actually copy string: maxlen param is usually sizeof(string). */ | 245 | /** |
| 246 | * module_param_string - a char array parameter | ||
| 247 | * @name: the name of the parameter | ||
| 248 | * @string: the string variable | ||
| 249 | * @len: the maximum length of the string, incl. terminator | ||
| 250 | * @perm: visibility in sysfs. | ||
| 251 | * | ||
| 252 | * This actually copies the string when it's set (unlike type charp). | ||
| 253 | * @len is usually just sizeof(string). | ||
| 254 | */ | ||
| 134 | #define module_param_string(name, string, len, perm) \ | 255 | #define module_param_string(name, string, len, perm) \ |
| 135 | static const struct kparam_string __param_string_##name \ | 256 | static const struct kparam_string __param_string_##name \ |
| 136 | = { len, string }; \ | 257 | = { len, string }; \ |
| 137 | __module_param_call(MODULE_PARAM_PREFIX, name, \ | 258 | __module_param_call(MODULE_PARAM_PREFIX, name, \ |
| 138 | param_set_copystring, param_get_string, \ | 259 | ¶m_ops_string, \ |
| 139 | .str = &__param_string_##name, 0, perm); \ | 260 | .str = &__param_string_##name, 0, perm); \ |
| 140 | __MODULE_PARM_TYPE(name, "string") | 261 | __MODULE_PARM_TYPE(name, "string") |
| 141 | 262 | ||
| 142 | /* Called on module insert or kernel boot */ | 263 | /* Called on module insert or kernel boot */ |
| 143 | extern int parse_args(const char *name, | 264 | extern int parse_args(const char *name, |
| 144 | char *args, | 265 | char *args, |
| 145 | struct kernel_param *params, | 266 | const struct kernel_param *params, |
| 146 | unsigned num, | 267 | unsigned num, |
| 147 | int (*unknown)(char *param, char *val)); | 268 | int (*unknown)(char *param, char *val)); |
| 148 | 269 | ||
| @@ -162,72 +283,105 @@ static inline void destroy_params(const struct kernel_param *params, | |||
| 162 | #define __param_check(name, p, type) \ | 283 | #define __param_check(name, p, type) \ |
| 163 | static inline type *__check_##name(void) { return(p); } | 284 | static inline type *__check_##name(void) { return(p); } |
| 164 | 285 | ||
| 165 | extern int param_set_byte(const char *val, struct kernel_param *kp); | 286 | extern struct kernel_param_ops param_ops_byte; |
| 166 | extern int param_get_byte(char *buffer, struct kernel_param *kp); | 287 | extern int param_set_byte(const char *val, const struct kernel_param *kp); |
| 288 | extern int param_get_byte(char *buffer, const struct kernel_param *kp); | ||
| 167 | #define param_check_byte(name, p) __param_check(name, p, unsigned char) | 289 | #define param_check_byte(name, p) __param_check(name, p, unsigned char) |
| 168 | 290 | ||
| 169 | extern int param_set_short(const char *val, struct kernel_param *kp); | 291 | extern struct kernel_param_ops param_ops_short; |
| 170 | extern int param_get_short(char *buffer, struct kernel_param *kp); | 292 | extern int param_set_short(const char *val, const struct kernel_param *kp); |
| 293 | extern int param_get_short(char *buffer, const struct kernel_param *kp); | ||
| 171 | #define param_check_short(name, p) __param_check(name, p, short) | 294 | #define param_check_short(name, p) __param_check(name, p, short) |
| 172 | 295 | ||
| 173 | extern int param_set_ushort(const char *val, struct kernel_param *kp); | 296 | extern struct kernel_param_ops param_ops_ushort; |
| 174 | extern int param_get_ushort(char *buffer, struct kernel_param *kp); | 297 | extern int param_set_ushort(const char *val, const struct kernel_param *kp); |
| 298 | extern int param_get_ushort(char *buffer, const struct kernel_param *kp); | ||
| 175 | #define param_check_ushort(name, p) __param_check(name, p, unsigned short) | 299 | #define param_check_ushort(name, p) __param_check(name, p, unsigned short) |
| 176 | 300 | ||
| 177 | extern int param_set_int(const char *val, struct kernel_param *kp); | 301 | extern struct kernel_param_ops param_ops_int; |
| 178 | extern int param_get_int(char *buffer, struct kernel_param *kp); | 302 | extern int param_set_int(const char *val, const struct kernel_param *kp); |
| 303 | extern int param_get_int(char *buffer, const struct kernel_param *kp); | ||
| 179 | #define param_check_int(name, p) __param_check(name, p, int) | 304 | #define param_check_int(name, p) __param_check(name, p, int) |
| 180 | 305 | ||
| 181 | extern int param_set_uint(const char *val, struct kernel_param *kp); | 306 | extern struct kernel_param_ops param_ops_uint; |
| 182 | extern int param_get_uint(char *buffer, struct kernel_param *kp); | 307 | extern int param_set_uint(const char *val, const struct kernel_param *kp); |
| 308 | extern int param_get_uint(char *buffer, const struct kernel_param *kp); | ||
| 183 | #define param_check_uint(name, p) __param_check(name, p, unsigned int) | 309 | #define param_check_uint(name, p) __param_check(name, p, unsigned int) |
| 184 | 310 | ||
| 185 | extern int param_set_long(const char *val, struct kernel_param *kp); | 311 | extern struct kernel_param_ops param_ops_long; |
| 186 | extern int param_get_long(char *buffer, struct kernel_param *kp); | 312 | extern int param_set_long(const char *val, const struct kernel_param *kp); |
| 313 | extern int param_get_long(char *buffer, const struct kernel_param *kp); | ||
| 187 | #define param_check_long(name, p) __param_check(name, p, long) | 314 | #define param_check_long(name, p) __param_check(name, p, long) |
| 188 | 315 | ||
| 189 | extern int param_set_ulong(const char *val, struct kernel_param *kp); | 316 | extern struct kernel_param_ops param_ops_ulong; |
| 190 | extern int param_get_ulong(char *buffer, struct kernel_param *kp); | 317 | extern int param_set_ulong(const char *val, const struct kernel_param *kp); |
| 318 | extern int param_get_ulong(char *buffer, const struct kernel_param *kp); | ||
| 191 | #define param_check_ulong(name, p) __param_check(name, p, unsigned long) | 319 | #define param_check_ulong(name, p) __param_check(name, p, unsigned long) |
| 192 | 320 | ||
| 193 | extern int param_set_charp(const char *val, struct kernel_param *kp); | 321 | extern struct kernel_param_ops param_ops_charp; |
| 194 | extern int param_get_charp(char *buffer, struct kernel_param *kp); | 322 | extern int param_set_charp(const char *val, const struct kernel_param *kp); |
| 323 | extern int param_get_charp(char *buffer, const struct kernel_param *kp); | ||
| 195 | #define param_check_charp(name, p) __param_check(name, p, char *) | 324 | #define param_check_charp(name, p) __param_check(name, p, char *) |
| 196 | 325 | ||
| 197 | /* For historical reasons "bool" parameters can be (unsigned) "int". */ | 326 | /* For historical reasons "bool" parameters can be (unsigned) "int". */ |
| 198 | extern int param_set_bool(const char *val, struct kernel_param *kp); | 327 | extern struct kernel_param_ops param_ops_bool; |
| 199 | extern int param_get_bool(char *buffer, struct kernel_param *kp); | 328 | extern int param_set_bool(const char *val, const struct kernel_param *kp); |
| 329 | extern int param_get_bool(char *buffer, const struct kernel_param *kp); | ||
| 200 | #define param_check_bool(name, p) \ | 330 | #define param_check_bool(name, p) \ |
| 201 | static inline void __check_##name(void) \ | 331 | static inline void __check_##name(void) \ |
| 202 | { \ | 332 | { \ |
| 203 | BUILD_BUG_ON(!__same_type(*(p), bool) && \ | 333 | BUILD_BUG_ON(!__same_type((p), bool *) && \ |
| 204 | !__same_type(*(p), unsigned int) && \ | 334 | !__same_type((p), unsigned int *) && \ |
| 205 | !__same_type(*(p), int)); \ | 335 | !__same_type((p), int *)); \ |
| 206 | } | 336 | } |
| 207 | 337 | ||
| 208 | extern int param_set_invbool(const char *val, struct kernel_param *kp); | 338 | extern struct kernel_param_ops param_ops_invbool; |
| 209 | extern int param_get_invbool(char *buffer, struct kernel_param *kp); | 339 | extern int param_set_invbool(const char *val, const struct kernel_param *kp); |
| 340 | extern int param_get_invbool(char *buffer, const struct kernel_param *kp); | ||
| 210 | #define param_check_invbool(name, p) __param_check(name, p, bool) | 341 | #define param_check_invbool(name, p) __param_check(name, p, bool) |
| 211 | 342 | ||
| 212 | /* Comma-separated array: *nump is set to number they actually specified. */ | 343 | /** |
| 344 | * module_param_array - a parameter which is an array of some type | ||
| 345 | * @name: the name of the array variable | ||
| 346 | * @type: the type, as per module_param() | ||
| 347 | * @nump: optional pointer filled in with the number written | ||
| 348 | * @perm: visibility in sysfs | ||
| 349 | * | ||
| 350 | * Input and output are as comma-separated values. Commas inside values | ||
| 351 | * don't work properly (eg. an array of charp). | ||
| 352 | * | ||
| 353 | * ARRAY_SIZE(@name) is used to determine the number of elements in the | ||
| 354 | * array, so the definition must be visible. | ||
| 355 | */ | ||
| 356 | #define module_param_array(name, type, nump, perm) \ | ||
| 357 | module_param_array_named(name, name, type, nump, perm) | ||
| 358 | |||
| 359 | /** | ||
| 360 | * module_param_array_named - renamed parameter which is an array of some type | ||
| 361 | * @name: a valid C identifier which is the parameter name | ||
| 362 | * @array: the name of the array variable | ||
| 363 | * @type: the type, as per module_param() | ||
| 364 | * @nump: optional pointer filled in with the number written | ||
| 365 | * @perm: visibility in sysfs | ||
| 366 | * | ||
| 367 | * This exposes a different name than the actual variable name. See | ||
| 368 | * module_param_named() for why this might be necessary. | ||
| 369 | */ | ||
| 213 | #define module_param_array_named(name, array, type, nump, perm) \ | 370 | #define module_param_array_named(name, array, type, nump, perm) \ |
| 214 | static const struct kparam_array __param_arr_##name \ | 371 | static const struct kparam_array __param_arr_##name \ |
| 215 | = { ARRAY_SIZE(array), nump, param_set_##type, param_get_##type,\ | 372 | = { ARRAY_SIZE(array), nump, ¶m_ops_##type, \ |
| 216 | sizeof(array[0]), array }; \ | 373 | sizeof(array[0]), array }; \ |
| 217 | __module_param_call(MODULE_PARAM_PREFIX, name, \ | 374 | __module_param_call(MODULE_PARAM_PREFIX, name, \ |
| 218 | param_array_set, param_array_get, \ | 375 | ¶m_array_ops, \ |
| 219 | .arr = &__param_arr_##name, \ | 376 | .arr = &__param_arr_##name, \ |
| 220 | __same_type(array[0], bool), perm); \ | 377 | __same_type(array[0], bool), perm); \ |
| 221 | __MODULE_PARM_TYPE(name, "array of " #type) | 378 | __MODULE_PARM_TYPE(name, "array of " #type) |
| 222 | 379 | ||
| 223 | #define module_param_array(name, type, nump, perm) \ | 380 | extern struct kernel_param_ops param_array_ops; |
| 224 | module_param_array_named(name, name, type, nump, perm) | ||
| 225 | |||
| 226 | extern int param_array_set(const char *val, struct kernel_param *kp); | ||
| 227 | extern int param_array_get(char *buffer, struct kernel_param *kp); | ||
| 228 | 381 | ||
| 229 | extern int param_set_copystring(const char *val, struct kernel_param *kp); | 382 | extern struct kernel_param_ops param_ops_string; |
| 230 | extern int param_get_string(char *buffer, struct kernel_param *kp); | 383 | extern int param_set_copystring(const char *val, const struct kernel_param *); |
| 384 | extern int param_get_string(char *buffer, const struct kernel_param *kp); | ||
| 231 | 385 | ||
| 232 | /* for exporting parameters in /sys/parameters */ | 386 | /* for exporting parameters in /sys/parameters */ |
| 233 | 387 | ||
| @@ -235,13 +389,13 @@ struct module; | |||
| 235 | 389 | ||
| 236 | #if defined(CONFIG_SYSFS) && defined(CONFIG_MODULES) | 390 | #if defined(CONFIG_SYSFS) && defined(CONFIG_MODULES) |
| 237 | extern int module_param_sysfs_setup(struct module *mod, | 391 | extern int module_param_sysfs_setup(struct module *mod, |
| 238 | struct kernel_param *kparam, | 392 | const struct kernel_param *kparam, |
| 239 | unsigned int num_params); | 393 | unsigned int num_params); |
| 240 | 394 | ||
| 241 | extern void module_param_sysfs_remove(struct module *mod); | 395 | extern void module_param_sysfs_remove(struct module *mod); |
| 242 | #else | 396 | #else |
| 243 | static inline int module_param_sysfs_setup(struct module *mod, | 397 | static inline int module_param_sysfs_setup(struct module *mod, |
| 244 | struct kernel_param *kparam, | 398 | const struct kernel_param *kparam, |
| 245 | unsigned int num_params) | 399 | unsigned int num_params) |
| 246 | { | 400 | { |
| 247 | return 0; | 401 | return 0; |
diff --git a/include/linux/mount.h b/include/linux/mount.h index 4bd05474d11d..5e7a59408dd4 100644 --- a/include/linux/mount.h +++ b/include/linux/mount.h | |||
| @@ -27,7 +27,6 @@ struct mnt_namespace; | |||
| 27 | #define MNT_NODIRATIME 0x10 | 27 | #define MNT_NODIRATIME 0x10 |
| 28 | #define MNT_RELATIME 0x20 | 28 | #define MNT_RELATIME 0x20 |
| 29 | #define MNT_READONLY 0x40 /* does the user want this to be r/o? */ | 29 | #define MNT_READONLY 0x40 /* does the user want this to be r/o? */ |
| 30 | #define MNT_STRICTATIME 0x80 | ||
| 31 | 30 | ||
| 32 | #define MNT_SHRINKABLE 0x100 | 31 | #define MNT_SHRINKABLE 0x100 |
| 33 | #define MNT_WRITE_HOLD 0x200 | 32 | #define MNT_WRITE_HOLD 0x200 |
| @@ -56,7 +55,11 @@ struct vfsmount { | |||
| 56 | struct list_head mnt_mounts; /* list of children, anchored here */ | 55 | struct list_head mnt_mounts; /* list of children, anchored here */ |
| 57 | struct list_head mnt_child; /* and going through their mnt_child */ | 56 | struct list_head mnt_child; /* and going through their mnt_child */ |
| 58 | int mnt_flags; | 57 | int mnt_flags; |
| 59 | /* 4 bytes hole on 64bits arches */ | 58 | /* 4 bytes hole on 64bits arches without fsnotify */ |
| 59 | #ifdef CONFIG_FSNOTIFY | ||
| 60 | __u32 mnt_fsnotify_mask; | ||
| 61 | struct hlist_head mnt_fsnotify_marks; | ||
| 62 | #endif | ||
| 60 | const char *mnt_devname; /* Name of device e.g. /dev/dsk/hda1 */ | 63 | const char *mnt_devname; /* Name of device e.g. /dev/dsk/hda1 */ |
| 61 | struct list_head mnt_list; | 64 | struct list_head mnt_list; |
| 62 | struct list_head mnt_expire; /* link in fs-specific expiry list */ | 65 | struct list_head mnt_expire; /* link in fs-specific expiry list */ |
diff --git a/include/linux/mroute.h b/include/linux/mroute.h index fa04b246c9ae..0fa7a3a874c8 100644 --- a/include/linux/mroute.h +++ b/include/linux/mroute.h | |||
| @@ -213,6 +213,7 @@ struct mfc_cache { | |||
| 213 | unsigned char ttls[MAXVIFS]; /* TTL thresholds */ | 213 | unsigned char ttls[MAXVIFS]; /* TTL thresholds */ |
| 214 | } res; | 214 | } res; |
| 215 | } mfc_un; | 215 | } mfc_un; |
| 216 | struct rcu_head rcu; | ||
| 216 | }; | 217 | }; |
| 217 | 218 | ||
| 218 | #define MFC_STATIC 1 | 219 | #define MFC_STATIC 1 |
diff --git a/include/linux/msi.h b/include/linux/msi.h index 6991ab5b24d1..05acced439a3 100644 --- a/include/linux/msi.h +++ b/include/linux/msi.h | |||
| @@ -10,12 +10,15 @@ struct msi_msg { | |||
| 10 | }; | 10 | }; |
| 11 | 11 | ||
| 12 | /* Helper functions */ | 12 | /* Helper functions */ |
| 13 | struct irq_desc; | 13 | struct irq_data; |
| 14 | extern void mask_msi_irq(unsigned int irq); | 14 | struct msi_desc; |
| 15 | extern void unmask_msi_irq(unsigned int irq); | 15 | extern void mask_msi_irq(struct irq_data *data); |
| 16 | extern void read_msi_msg_desc(struct irq_desc *desc, struct msi_msg *msg); | 16 | extern void unmask_msi_irq(struct irq_data *data); |
| 17 | extern void write_msi_msg_desc(struct irq_desc *desc, struct msi_msg *msg); | 17 | extern void __read_msi_msg(struct msi_desc *entry, struct msi_msg *msg); |
| 18 | extern void __get_cached_msi_msg(struct msi_desc *entry, struct msi_msg *msg); | ||
| 19 | extern void __write_msi_msg(struct msi_desc *entry, struct msi_msg *msg); | ||
| 18 | extern void read_msi_msg(unsigned int irq, struct msi_msg *msg); | 20 | extern void read_msi_msg(unsigned int irq, struct msi_msg *msg); |
| 21 | extern void get_cached_msi_msg(unsigned int irq, struct msi_msg *msg); | ||
| 19 | extern void write_msi_msg(unsigned int irq, struct msi_msg *msg); | 22 | extern void write_msi_msg(unsigned int irq, struct msi_msg *msg); |
| 20 | 23 | ||
| 21 | struct msi_desc { | 24 | struct msi_desc { |
diff --git a/include/linux/mtd/bbm.h b/include/linux/mtd/bbm.h index 9c3757c5759d..7fa20beb2ab9 100644 --- a/include/linux/mtd/bbm.h +++ b/include/linux/mtd/bbm.h | |||
| @@ -4,12 +4,26 @@ | |||
| 4 | * NAND family Bad Block Management (BBM) header file | 4 | * NAND family Bad Block Management (BBM) header file |
| 5 | * - Bad Block Table (BBT) implementation | 5 | * - Bad Block Table (BBT) implementation |
| 6 | * | 6 | * |
| 7 | * Copyright (c) 2005 Samsung Electronics | 7 | * Copyright © 2005 Samsung Electronics |
| 8 | * Kyungmin Park <kyungmin.park@samsung.com> | 8 | * Kyungmin Park <kyungmin.park@samsung.com> |
| 9 | * | 9 | * |
| 10 | * Copyright (c) 2000-2005 | 10 | * Copyright © 2000-2005 |
| 11 | * Thomas Gleixner <tglx@linuxtronix.de> | 11 | * Thomas Gleixner <tglx@linuxtronix.de> |
| 12 | * | 12 | * |
| 13 | * This program is free software; you can redistribute it and/or modify | ||
| 14 | * it under the terms of the GNU General Public License as published by | ||
| 15 | * the Free Software Foundation; either version 2 of the License, or | ||
| 16 | * (at your option) any later version. | ||
| 17 | * | ||
| 18 | * This program is distributed in the hope that it will be useful, | ||
| 19 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 20 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 21 | * GNU General Public License for more details. | ||
| 22 | * | ||
| 23 | * You should have received a copy of the GNU General Public License | ||
| 24 | * along with this program; if not, write to the Free Software | ||
| 25 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 26 | * | ||
| 13 | */ | 27 | */ |
| 14 | #ifndef __LINUX_MTD_BBM_H | 28 | #ifndef __LINUX_MTD_BBM_H |
| 15 | #define __LINUX_MTD_BBM_H | 29 | #define __LINUX_MTD_BBM_H |
| @@ -82,6 +96,12 @@ struct nand_bbt_descr { | |||
| 82 | #define NAND_BBT_SAVECONTENT 0x00002000 | 96 | #define NAND_BBT_SAVECONTENT 0x00002000 |
| 83 | /* Search good / bad pattern on the first and the second page */ | 97 | /* Search good / bad pattern on the first and the second page */ |
| 84 | #define NAND_BBT_SCAN2NDPAGE 0x00004000 | 98 | #define NAND_BBT_SCAN2NDPAGE 0x00004000 |
| 99 | /* Search good / bad pattern on the last page of the eraseblock */ | ||
| 100 | #define NAND_BBT_SCANLASTPAGE 0x00008000 | ||
| 101 | /* Chip stores bad block marker on BOTH 1st and 6th bytes of OOB */ | ||
| 102 | #define NAND_BBT_SCANBYTE1AND6 0x00100000 | ||
| 103 | /* The nand_bbt_descr was created dynamicaly and must be freed */ | ||
| 104 | #define NAND_BBT_DYNAMICSTRUCT 0x00200000 | ||
| 85 | 105 | ||
| 86 | /* The maximum number of blocks to scan for a bbt */ | 106 | /* The maximum number of blocks to scan for a bbt */ |
| 87 | #define NAND_BBT_SCAN_MAXBLOCKS 4 | 107 | #define NAND_BBT_SCAN_MAXBLOCKS 4 |
diff --git a/include/linux/mtd/blktrans.h b/include/linux/mtd/blktrans.h index b481ccd7ff3c..26529ebd59cc 100644 --- a/include/linux/mtd/blktrans.h +++ b/include/linux/mtd/blktrans.h | |||
| @@ -1,7 +1,19 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * (C) 2003 David Woodhouse <dwmw2@infradead.org> | 2 | * Copyright © 2003-2010 David Woodhouse <dwmw2@infradead.org> |
| 3 | * | 3 | * |
| 4 | * Interface to Linux block layer for MTD 'translation layers'. | 4 | * This program is free software; you can redistribute it and/or modify |
| 5 | * it under the terms of the GNU General Public License as published by | ||
| 6 | * the Free Software Foundation; either version 2 of the License, or | ||
| 7 | * (at your option) any later version. | ||
| 8 | * | ||
| 9 | * This program is distributed in the hope that it will be useful, | ||
| 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 12 | * GNU General Public License for more details. | ||
| 13 | * | ||
| 14 | * You should have received a copy of the GNU General Public License | ||
| 15 | * along with this program; if not, write to the Free Software | ||
| 16 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 5 | * | 17 | * |
| 6 | */ | 18 | */ |
| 7 | 19 | ||
diff --git a/include/linux/mtd/cfi.h b/include/linux/mtd/cfi.h index 574d9ee066f1..d2118b0eac9a 100644 --- a/include/linux/mtd/cfi.h +++ b/include/linux/mtd/cfi.h | |||
| @@ -1,6 +1,20 @@ | |||
| 1 | 1 | /* | |
| 2 | /* Common Flash Interface structures | 2 | * Copyright © 2000-2010 David Woodhouse <dwmw2@infradead.org> et al. |
| 3 | * See http://support.intel.com/design/flash/technote/index.htm | 3 | * |
| 4 | * This program is free software; you can redistribute it and/or modify | ||
| 5 | * it under the terms of the GNU General Public License as published by | ||
| 6 | * the Free Software Foundation; either version 2 of the License, or | ||
| 7 | * (at your option) any later version. | ||
| 8 | * | ||
| 9 | * This program is distributed in the hope that it will be useful, | ||
| 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 12 | * GNU General Public License for more details. | ||
| 13 | * | ||
| 14 | * You should have received a copy of the GNU General Public License | ||
| 15 | * along with this program; if not, write to the Free Software | ||
| 16 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 17 | * | ||
| 4 | */ | 18 | */ |
| 5 | 19 | ||
| 6 | #ifndef __MTD_CFI_H__ | 20 | #ifndef __MTD_CFI_H__ |
diff --git a/include/linux/mtd/cfi_endian.h b/include/linux/mtd/cfi_endian.h index d802f7736be3..51cc3f5917a8 100644 --- a/include/linux/mtd/cfi_endian.h +++ b/include/linux/mtd/cfi_endian.h | |||
| @@ -1,3 +1,22 @@ | |||
| 1 | /* | ||
| 2 | * Copyright © 2001-2010 David Woodhouse <dwmw2@infradead.org> | ||
| 3 | * | ||
| 4 | * This program is free software; you can redistribute it and/or modify | ||
| 5 | * it under the terms of the GNU General Public License as published by | ||
| 6 | * the Free Software Foundation; either version 2 of the License, or | ||
| 7 | * (at your option) any later version. | ||
| 8 | * | ||
| 9 | * This program is distributed in the hope that it will be useful, | ||
| 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 12 | * GNU General Public License for more details. | ||
| 13 | * | ||
| 14 | * You should have received a copy of the GNU General Public License | ||
| 15 | * along with this program; if not, write to the Free Software | ||
| 16 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 17 | * | ||
| 18 | */ | ||
| 19 | |||
| 1 | #include <asm/byteorder.h> | 20 | #include <asm/byteorder.h> |
| 2 | 21 | ||
| 3 | #ifndef CONFIG_MTD_CFI_ADV_OPTIONS | 22 | #ifndef CONFIG_MTD_CFI_ADV_OPTIONS |
diff --git a/include/linux/mtd/compatmac.h b/include/linux/mtd/compatmac.h deleted file mode 100644 index 7d1300d9bd51..000000000000 --- a/include/linux/mtd/compatmac.h +++ /dev/null | |||
| @@ -1,10 +0,0 @@ | |||
| 1 | |||
| 2 | #ifndef __LINUX_MTD_COMPATMAC_H__ | ||
| 3 | #define __LINUX_MTD_COMPATMAC_H__ | ||
| 4 | |||
| 5 | /* Nothing to see here. We write 2.5-compatible code and this | ||
| 6 | file makes it all OK in older kernels, but it's empty in _current_ | ||
| 7 | kernels. Include guard just to make GCC ignore it in future inclusions | ||
| 8 | anyway... */ | ||
| 9 | |||
| 10 | #endif /* __LINUX_MTD_COMPATMAC_H__ */ | ||
diff --git a/include/linux/mtd/concat.h b/include/linux/mtd/concat.h index e80c674daeb3..ccdbe93a909c 100644 --- a/include/linux/mtd/concat.h +++ b/include/linux/mtd/concat.h | |||
| @@ -1,9 +1,22 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * MTD device concatenation layer definitions | 2 | * MTD device concatenation layer definitions |
| 3 | * | 3 | * |
| 4 | * (C) 2002 Robert Kaiser <rkaiser@sysgo.de> | 4 | * Copyright © 2002 Robert Kaiser <rkaiser@sysgo.de> |
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify | ||
| 7 | * it under the terms of the GNU General Public License as published by | ||
| 8 | * the Free Software Foundation; either version 2 of the License, or | ||
| 9 | * (at your option) any later version. | ||
| 10 | * | ||
| 11 | * This program is distributed in the hope that it will be useful, | ||
| 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 14 | * GNU General Public License for more details. | ||
| 15 | * | ||
| 16 | * You should have received a copy of the GNU General Public License | ||
| 17 | * along with this program; if not, write to the Free Software | ||
| 18 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 5 | * | 19 | * |
| 6 | * This code is GPL | ||
| 7 | */ | 20 | */ |
| 8 | 21 | ||
| 9 | #ifndef MTD_CONCAT_H | 22 | #ifndef MTD_CONCAT_H |
diff --git a/include/linux/mtd/doc2000.h b/include/linux/mtd/doc2000.h index 0a6d516ab71d..0f6fea73a1f6 100644 --- a/include/linux/mtd/doc2000.h +++ b/include/linux/mtd/doc2000.h | |||
| @@ -1,12 +1,25 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Linux driver for Disk-On-Chip devices | 2 | * Linux driver for Disk-On-Chip devices |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 1999 Machine Vision Holdings, Inc. | 4 | * Copyright © 1999 Machine Vision Holdings, Inc. |
| 5 | * Copyright (C) 2001-2003 David Woodhouse <dwmw2@infradead.org> | 5 | * Copyright © 1999-2010 David Woodhouse <dwmw2@infradead.org> |
| 6 | * Copyright (C) 2002-2003 Greg Ungerer <gerg@snapgear.com> | 6 | * Copyright © 2002-2003 Greg Ungerer <gerg@snapgear.com> |
| 7 | * Copyright (C) 2002-2003 SnapGear Inc | 7 | * Copyright © 2002-2003 SnapGear Inc |
| 8 | * | ||
| 9 | * This program is free software; you can redistribute it and/or modify | ||
| 10 | * it under the terms of the GNU General Public License as published by | ||
| 11 | * the Free Software Foundation; either version 2 of the License, or | ||
| 12 | * (at your option) any later version. | ||
| 13 | * | ||
| 14 | * This program is distributed in the hope that it will be useful, | ||
| 15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 17 | * GNU General Public License for more details. | ||
| 18 | * | ||
| 19 | * You should have received a copy of the GNU General Public License | ||
| 20 | * along with this program; if not, write to the Free Software | ||
| 21 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 8 | * | 22 | * |
| 9 | * Released under GPL | ||
| 10 | */ | 23 | */ |
| 11 | 24 | ||
| 12 | #ifndef __MTD_DOC2000_H__ | 25 | #ifndef __MTD_DOC2000_H__ |
diff --git a/include/linux/mtd/flashchip.h b/include/linux/mtd/flashchip.h index f43e9b49b751..b63fa457febd 100644 --- a/include/linux/mtd/flashchip.h +++ b/include/linux/mtd/flashchip.h | |||
| @@ -1,10 +1,21 @@ | |||
| 1 | |||
| 2 | /* | 1 | /* |
| 3 | * struct flchip definition | 2 | * Copyright © 2000 Red Hat UK Limited |
| 3 | * Copyright © 2000-2010 David Woodhouse <dwmw2@infradead.org> | ||
| 4 | * | ||
| 5 | * This program is free software; you can redistribute it and/or modify | ||
| 6 | * it under the terms of the GNU General Public License as published by | ||
| 7 | * the Free Software Foundation; either version 2 of the License, or | ||
| 8 | * (at your option) any later version. | ||
| 9 | * | ||
| 10 | * This program is distributed in the hope that it will be useful, | ||
| 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 13 | * GNU General Public License for more details. | ||
| 4 | * | 14 | * |
| 5 | * Contains information about the location and state of a given flash device | 15 | * You should have received a copy of the GNU General Public License |
| 16 | * along with this program; if not, write to the Free Software | ||
| 17 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 6 | * | 18 | * |
| 7 | * (C) 2000 Red Hat. GPLd. | ||
| 8 | */ | 19 | */ |
| 9 | 20 | ||
| 10 | #ifndef __MTD_FLASHCHIP_H__ | 21 | #ifndef __MTD_FLASHCHIP_H__ |
| @@ -92,7 +103,7 @@ struct flchip { | |||
| 92 | /* This is used to handle contention on write/erase operations | 103 | /* This is used to handle contention on write/erase operations |
| 93 | between partitions of the same physical chip. */ | 104 | between partitions of the same physical chip. */ |
| 94 | struct flchip_shared { | 105 | struct flchip_shared { |
| 95 | spinlock_t lock; | 106 | struct mutex lock; |
| 96 | struct flchip *writing; | 107 | struct flchip *writing; |
| 97 | struct flchip *erasing; | 108 | struct flchip *erasing; |
| 98 | }; | 109 | }; |
diff --git a/include/linux/mtd/gen_probe.h b/include/linux/mtd/gen_probe.h index df362ddf2949..2c456054fded 100644 --- a/include/linux/mtd/gen_probe.h +++ b/include/linux/mtd/gen_probe.h | |||
| @@ -1,6 +1,21 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * (C) 2001, 2001 Red Hat, Inc. | 2 | * Copyright © 2001 Red Hat UK Limited |
| 3 | * GPL'd | 3 | * Copyright © 2001-2010 David Woodhouse <dwmw2@infradead.org> |
| 4 | * | ||
| 5 | * This program is free software; you can redistribute it and/or modify | ||
| 6 | * it under the terms of the GNU General Public License as published by | ||
| 7 | * the Free Software Foundation; either version 2 of the License, or | ||
| 8 | * (at your option) any later version. | ||
| 9 | * | ||
| 10 | * This program is distributed in the hope that it will be useful, | ||
| 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 13 | * GNU General Public License for more details. | ||
| 14 | * | ||
| 15 | * You should have received a copy of the GNU General Public License | ||
| 16 | * along with this program; if not, write to the Free Software | ||
| 17 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 18 | * | ||
| 4 | */ | 19 | */ |
| 5 | 20 | ||
| 6 | #ifndef __LINUX_MTD_GEN_PROBE_H__ | 21 | #ifndef __LINUX_MTD_GEN_PROBE_H__ |
diff --git a/include/linux/mtd/map.h b/include/linux/mtd/map.h index de89eca864ce..a9e6ba46865e 100644 --- a/include/linux/mtd/map.h +++ b/include/linux/mtd/map.h | |||
| @@ -1,3 +1,21 @@ | |||
| 1 | /* | ||
| 2 | * Copyright © 2000-2010 David Woodhouse <dwmw2@infradead.org> et al. | ||
| 3 | * | ||
| 4 | * This program is free software; you can redistribute it and/or modify | ||
| 5 | * it under the terms of the GNU General Public License as published by | ||
| 6 | * the Free Software Foundation; either version 2 of the License, or | ||
| 7 | * (at your option) any later version. | ||
| 8 | * | ||
| 9 | * This program is distributed in the hope that it will be useful, | ||
| 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 12 | * GNU General Public License for more details. | ||
| 13 | * | ||
| 14 | * You should have received a copy of the GNU General Public License | ||
| 15 | * along with this program; if not, write to the Free Software | ||
| 16 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 17 | * | ||
| 18 | */ | ||
| 1 | 19 | ||
| 2 | /* Overhauled routines for dealing with different mmap regions of flash */ | 20 | /* Overhauled routines for dealing with different mmap regions of flash */ |
| 3 | 21 | ||
| @@ -9,7 +27,6 @@ | |||
| 9 | #include <linux/string.h> | 27 | #include <linux/string.h> |
| 10 | #include <linux/bug.h> | 28 | #include <linux/bug.h> |
| 11 | 29 | ||
| 12 | #include <linux/mtd/compatmac.h> | ||
| 13 | 30 | ||
| 14 | #include <asm/unaligned.h> | 31 | #include <asm/unaligned.h> |
| 15 | #include <asm/system.h> | 32 | #include <asm/system.h> |
diff --git a/include/linux/mtd/mtd.h b/include/linux/mtd/mtd.h index 5326435a7571..8485e42a9b09 100644 --- a/include/linux/mtd/mtd.h +++ b/include/linux/mtd/mtd.h | |||
| @@ -1,7 +1,20 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Copyright (C) 1999-2003 David Woodhouse <dwmw2@infradead.org> et al. | 2 | * Copyright © 1999-2010 David Woodhouse <dwmw2@infradead.org> et al. |
| 3 | * | ||
| 4 | * This program is free software; you can redistribute it and/or modify | ||
| 5 | * it under the terms of the GNU General Public License as published by | ||
| 6 | * the Free Software Foundation; either version 2 of the License, or | ||
| 7 | * (at your option) any later version. | ||
| 8 | * | ||
| 9 | * This program is distributed in the hope that it will be useful, | ||
| 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 12 | * GNU General Public License for more details. | ||
| 13 | * | ||
| 14 | * You should have received a copy of the GNU General Public License | ||
| 15 | * along with this program; if not, write to the Free Software | ||
| 16 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 3 | * | 17 | * |
| 4 | * Released under GPL | ||
| 5 | */ | 18 | */ |
| 6 | 19 | ||
| 7 | #ifndef __MTD_MTD_H__ | 20 | #ifndef __MTD_MTD_H__ |
| @@ -13,7 +26,6 @@ | |||
| 13 | #include <linux/notifier.h> | 26 | #include <linux/notifier.h> |
| 14 | #include <linux/device.h> | 27 | #include <linux/device.h> |
| 15 | 28 | ||
| 16 | #include <linux/mtd/compatmac.h> | ||
| 17 | #include <mtd/mtd-abi.h> | 29 | #include <mtd/mtd-abi.h> |
| 18 | 30 | ||
| 19 | #include <asm/div64.h> | 31 | #include <asm/div64.h> |
| @@ -216,6 +228,7 @@ struct mtd_info { | |||
| 216 | /* Chip-supported device locking */ | 228 | /* Chip-supported device locking */ |
| 217 | int (*lock) (struct mtd_info *mtd, loff_t ofs, uint64_t len); | 229 | int (*lock) (struct mtd_info *mtd, loff_t ofs, uint64_t len); |
| 218 | int (*unlock) (struct mtd_info *mtd, loff_t ofs, uint64_t len); | 230 | int (*unlock) (struct mtd_info *mtd, loff_t ofs, uint64_t len); |
| 231 | int (*is_locked) (struct mtd_info *mtd, loff_t ofs, uint64_t len); | ||
| 219 | 232 | ||
| 220 | /* Power Management functions */ | 233 | /* Power Management functions */ |
| 221 | int (*suspend) (struct mtd_info *mtd); | 234 | int (*suspend) (struct mtd_info *mtd); |
diff --git a/include/linux/mtd/nand.h b/include/linux/mtd/nand.h index a81b185e23a7..102e12c58cb3 100644 --- a/include/linux/mtd/nand.h +++ b/include/linux/mtd/nand.h | |||
| @@ -1,9 +1,9 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * linux/include/linux/mtd/nand.h | 2 | * linux/include/linux/mtd/nand.h |
| 3 | * | 3 | * |
| 4 | * Copyright (c) 2000 David Woodhouse <dwmw2@infradead.org> | 4 | * Copyright © 2000-2010 David Woodhouse <dwmw2@infradead.org> |
| 5 | * Steven J. Hill <sjhill@realitydiluted.com> | 5 | * Steven J. Hill <sjhill@realitydiluted.com> |
| 6 | * Thomas Gleixner <tglx@linutronix.de> | 6 | * Thomas Gleixner <tglx@linutronix.de> |
| 7 | * | 7 | * |
| 8 | * This program is free software; you can redistribute it and/or modify | 8 | * This program is free software; you can redistribute it and/or modify |
| 9 | * it under the terms of the GNU General Public License version 2 as | 9 | * it under the terms of the GNU General Public License version 2 as |
| @@ -181,8 +181,6 @@ typedef enum { | |||
| 181 | #define NAND_NO_READRDY 0x00000100 | 181 | #define NAND_NO_READRDY 0x00000100 |
| 182 | /* Chip does not allow subpage writes */ | 182 | /* Chip does not allow subpage writes */ |
| 183 | #define NAND_NO_SUBPAGE_WRITE 0x00000200 | 183 | #define NAND_NO_SUBPAGE_WRITE 0x00000200 |
| 184 | /* Chip stores bad block marker on the last page of the eraseblock */ | ||
| 185 | #define NAND_BB_LAST_PAGE 0x00000400 | ||
| 186 | 184 | ||
| 187 | /* Device is one of 'new' xD cards that expose fake nand command set */ | 185 | /* Device is one of 'new' xD cards that expose fake nand command set */ |
| 188 | #define NAND_BROKEN_XD 0x00000400 | 186 | #define NAND_BROKEN_XD 0x00000400 |
diff --git a/include/linux/mtd/nand_ecc.h b/include/linux/mtd/nand_ecc.h index 41bc013571d0..4d8406c81652 100644 --- a/include/linux/mtd/nand_ecc.h +++ b/include/linux/mtd/nand_ecc.h | |||
| @@ -1,7 +1,9 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * drivers/mtd/nand_ecc.h | 2 | * drivers/mtd/nand_ecc.h |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2000 Steven J. Hill (sjhill@realitydiluted.com) | 4 | * Copyright (C) 2000-2010 Steven J. Hill <sjhill@realitydiluted.com> |
| 5 | * David Woodhouse <dwmw2@infradead.org> | ||
| 6 | * Thomas Gleixner <tglx@linutronix.de> | ||
| 5 | * | 7 | * |
| 6 | * This program is free software; you can redistribute it and/or modify | 8 | * This program is free software; you can redistribute it and/or modify |
| 7 | * it under the terms of the GNU General Public License version 2 as | 9 | * it under the terms of the GNU General Public License version 2 as |
diff --git a/include/linux/mtd/nftl.h b/include/linux/mtd/nftl.h index dcaf611ed748..b059629e22bc 100644 --- a/include/linux/mtd/nftl.h +++ b/include/linux/mtd/nftl.h | |||
| @@ -1,5 +1,20 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * (C) 1999-2003 David Woodhouse <dwmw2@infradead.org> | 2 | * Copyright © 1999-2010 David Woodhouse <dwmw2@infradead.org> |
| 3 | * | ||
| 4 | * This program is free software; you can redistribute it and/or modify | ||
| 5 | * it under the terms of the GNU General Public License as published by | ||
| 6 | * the Free Software Foundation; either version 2 of the License, or | ||
| 7 | * (at your option) any later version. | ||
| 8 | * | ||
| 9 | * This program is distributed in the hope that it will be useful, | ||
| 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 12 | * GNU General Public License for more details. | ||
| 13 | * | ||
| 14 | * You should have received a copy of the GNU General Public License | ||
| 15 | * along with this program; if not, write to the Free Software | ||
| 16 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 17 | * | ||
| 3 | */ | 18 | */ |
| 4 | 19 | ||
| 5 | #ifndef __MTD_NFTL_H__ | 20 | #ifndef __MTD_NFTL_H__ |
diff --git a/include/linux/mtd/onenand.h b/include/linux/mtd/onenand.h index c26ff86ad08a..0c8815bfae1c 100644 --- a/include/linux/mtd/onenand.h +++ b/include/linux/mtd/onenand.h | |||
| @@ -68,6 +68,7 @@ struct onenand_bufferram { | |||
| 68 | * @write_word: [REPLACEABLE] hardware specific function for write | 68 | * @write_word: [REPLACEABLE] hardware specific function for write |
| 69 | * register of OneNAND | 69 | * register of OneNAND |
| 70 | * @mmcontrol: sync burst read function | 70 | * @mmcontrol: sync burst read function |
| 71 | * @chip_probe: [REPLACEABLE] hardware specific function for chip probe | ||
| 71 | * @block_markbad: function to mark a block as bad | 72 | * @block_markbad: function to mark a block as bad |
| 72 | * @scan_bbt: [REPLACEALBE] hardware specific function for scanning | 73 | * @scan_bbt: [REPLACEALBE] hardware specific function for scanning |
| 73 | * Bad block Table | 74 | * Bad block Table |
| @@ -114,6 +115,7 @@ struct onenand_chip { | |||
| 114 | unsigned short (*read_word)(void __iomem *addr); | 115 | unsigned short (*read_word)(void __iomem *addr); |
| 115 | void (*write_word)(unsigned short value, void __iomem *addr); | 116 | void (*write_word)(unsigned short value, void __iomem *addr); |
| 116 | void (*mmcontrol)(struct mtd_info *mtd, int sync_read); | 117 | void (*mmcontrol)(struct mtd_info *mtd, int sync_read); |
| 118 | int (*chip_probe)(struct mtd_info *mtd); | ||
| 117 | int (*block_markbad)(struct mtd_info *mtd, loff_t ofs); | 119 | int (*block_markbad)(struct mtd_info *mtd, loff_t ofs); |
| 118 | int (*scan_bbt)(struct mtd_info *mtd); | 120 | int (*scan_bbt)(struct mtd_info *mtd); |
| 119 | 121 | ||
diff --git a/include/linux/mtd/physmap.h b/include/linux/mtd/physmap.h index 76f7cabf07d3..bcfd9f777454 100644 --- a/include/linux/mtd/physmap.h +++ b/include/linux/mtd/physmap.h | |||
| @@ -25,6 +25,7 @@ struct physmap_flash_data { | |||
| 25 | void (*set_vpp)(struct map_info *, int); | 25 | void (*set_vpp)(struct map_info *, int); |
| 26 | unsigned int nr_parts; | 26 | unsigned int nr_parts; |
| 27 | unsigned int pfow_base; | 27 | unsigned int pfow_base; |
| 28 | char *probe_type; | ||
| 28 | struct mtd_partition *parts; | 29 | struct mtd_partition *parts; |
| 29 | }; | 30 | }; |
| 30 | 31 | ||
diff --git a/include/linux/mtio.h b/include/linux/mtio.h index ef01d6aa5934..8f825756c459 100644 --- a/include/linux/mtio.h +++ b/include/linux/mtio.h | |||
| @@ -63,6 +63,7 @@ struct mtop { | |||
| 63 | #define MTCOMPRESSION 32/* control compression with SCSI mode page 15 */ | 63 | #define MTCOMPRESSION 32/* control compression with SCSI mode page 15 */ |
| 64 | #define MTSETPART 33 /* Change the active tape partition */ | 64 | #define MTSETPART 33 /* Change the active tape partition */ |
| 65 | #define MTMKPART 34 /* Format the tape with one or two partitions */ | 65 | #define MTMKPART 34 /* Format the tape with one or two partitions */ |
| 66 | #define MTWEOFI 35 /* write an end-of-file record (mark) in immediate mode */ | ||
| 66 | 67 | ||
| 67 | /* structure for MTIOCGET - mag tape get status command */ | 68 | /* structure for MTIOCGET - mag tape get status command */ |
| 68 | 69 | ||
diff --git a/include/linux/mutex.h b/include/linux/mutex.h index 878cab4f5fcc..f363bc8fdc74 100644 --- a/include/linux/mutex.h +++ b/include/linux/mutex.h | |||
| @@ -78,6 +78,14 @@ struct mutex_waiter { | |||
| 78 | # include <linux/mutex-debug.h> | 78 | # include <linux/mutex-debug.h> |
| 79 | #else | 79 | #else |
| 80 | # define __DEBUG_MUTEX_INITIALIZER(lockname) | 80 | # define __DEBUG_MUTEX_INITIALIZER(lockname) |
| 81 | /** | ||
| 82 | * mutex_init - initialize the mutex | ||
| 83 | * @mutex: the mutex to be initialized | ||
| 84 | * | ||
| 85 | * Initialize the mutex to unlocked state. | ||
| 86 | * | ||
| 87 | * It is not allowed to initialize an already locked mutex. | ||
| 88 | */ | ||
| 81 | # define mutex_init(mutex) \ | 89 | # define mutex_init(mutex) \ |
| 82 | do { \ | 90 | do { \ |
| 83 | static struct lock_class_key __key; \ | 91 | static struct lock_class_key __key; \ |
diff --git a/include/linux/n_r3964.h b/include/linux/n_r3964.h index de24af79ebd3..54b8e0d8d916 100644 --- a/include/linux/n_r3964.h +++ b/include/linux/n_r3964.h | |||
| @@ -4,7 +4,6 @@ | |||
| 4 | * Copyright by | 4 | * Copyright by |
| 5 | * Philips Automation Projects | 5 | * Philips Automation Projects |
| 6 | * Kassel (Germany) | 6 | * Kassel (Germany) |
| 7 | * http://www.pap-philips.de | ||
| 8 | * ----------------------------------------------------------- | 7 | * ----------------------------------------------------------- |
| 9 | * This software may be used and distributed according to the terms of | 8 | * This software may be used and distributed according to the terms of |
| 10 | * the GNU General Public License, incorporated herein by reference. | 9 | * the GNU General Public License, incorporated herein by reference. |
diff --git a/include/linux/nbd.h b/include/linux/nbd.h index 155719dab813..d146ca10c0f5 100644 --- a/include/linux/nbd.h +++ b/include/linux/nbd.h | |||
| @@ -88,7 +88,7 @@ struct nbd_request { | |||
| 88 | char handle[8]; | 88 | char handle[8]; |
| 89 | __be64 from; | 89 | __be64 from; |
| 90 | __be32 len; | 90 | __be32 len; |
| 91 | } __attribute__ ((packed)); | 91 | } __attribute__((packed)); |
| 92 | 92 | ||
| 93 | /* | 93 | /* |
| 94 | * This is the reply packet that nbd-server sends back to the client after | 94 | * This is the reply packet that nbd-server sends back to the client after |
diff --git a/include/linux/ncp_fs.h b/include/linux/ncp_fs.h index 4522aed00906..ef663061d5ac 100644 --- a/include/linux/ncp_fs.h +++ b/include/linux/ncp_fs.h | |||
| @@ -241,34 +241,6 @@ int ncp_mmap(struct file *, struct vm_area_struct *); | |||
| 241 | /* linux/fs/ncpfs/ncplib_kernel.c */ | 241 | /* linux/fs/ncpfs/ncplib_kernel.c */ |
| 242 | int ncp_make_closed(struct inode *); | 242 | int ncp_make_closed(struct inode *); |
| 243 | 243 | ||
| 244 | #define ncp_namespace(i) (NCP_SERVER(i)->name_space[NCP_FINFO(i)->volNumber]) | ||
| 245 | |||
| 246 | static inline int ncp_preserve_entry_case(struct inode *i, __u32 nscreator) | ||
| 247 | { | ||
| 248 | #ifdef CONFIG_NCPFS_SMALLDOS | ||
| 249 | int ns = ncp_namespace(i); | ||
| 250 | |||
| 251 | if ((ns == NW_NS_DOS) | ||
| 252 | #ifdef CONFIG_NCPFS_OS2_NS | ||
| 253 | || ((ns == NW_NS_OS2) && (nscreator == NW_NS_DOS)) | ||
| 254 | #endif /* CONFIG_NCPFS_OS2_NS */ | ||
| 255 | ) | ||
| 256 | return 0; | ||
| 257 | #endif /* CONFIG_NCPFS_SMALLDOS */ | ||
| 258 | return 1; | ||
| 259 | } | ||
| 260 | |||
| 261 | #define ncp_preserve_case(i) (ncp_namespace(i) != NW_NS_DOS) | ||
| 262 | |||
| 263 | static inline int ncp_case_sensitive(struct inode *i) | ||
| 264 | { | ||
| 265 | #ifdef CONFIG_NCPFS_NFS_NS | ||
| 266 | return ncp_namespace(i) == NW_NS_NFS; | ||
| 267 | #else | ||
| 268 | return 0; | ||
| 269 | #endif /* CONFIG_NCPFS_NFS_NS */ | ||
| 270 | } | ||
| 271 | |||
| 272 | #endif /* __KERNEL__ */ | 244 | #endif /* __KERNEL__ */ |
| 273 | 245 | ||
| 274 | #endif /* _LINUX_NCP_FS_H */ | 246 | #endif /* _LINUX_NCP_FS_H */ |
diff --git a/include/linux/ncp_fs_sb.h b/include/linux/ncp_fs_sb.h index 5ec9ca671687..d64b0e894336 100644 --- a/include/linux/ncp_fs_sb.h +++ b/include/linux/ncp_fs_sb.h | |||
| @@ -62,6 +62,7 @@ struct ncp_server { | |||
| 62 | int ncp_reply_size; | 62 | int ncp_reply_size; |
| 63 | 63 | ||
| 64 | int root_setuped; | 64 | int root_setuped; |
| 65 | struct mutex root_setup_lock; | ||
| 65 | 66 | ||
| 66 | /* info for packet signing */ | 67 | /* info for packet signing */ |
| 67 | int sign_wanted; /* 1=Server needs signed packets */ | 68 | int sign_wanted; /* 1=Server needs signed packets */ |
| @@ -81,13 +82,14 @@ struct ncp_server { | |||
| 81 | size_t len; | 82 | size_t len; |
| 82 | void* data; | 83 | void* data; |
| 83 | } priv; | 84 | } priv; |
| 85 | struct rw_semaphore auth_rwsem; | ||
| 84 | 86 | ||
| 85 | /* nls info: codepage for volume and charset for I/O */ | 87 | /* nls info: codepage for volume and charset for I/O */ |
| 86 | struct nls_table *nls_vol; | 88 | struct nls_table *nls_vol; |
| 87 | struct nls_table *nls_io; | 89 | struct nls_table *nls_io; |
| 88 | 90 | ||
| 89 | /* maximum age in jiffies */ | 91 | /* maximum age in jiffies */ |
| 90 | int dentry_ttl; | 92 | atomic_t dentry_ttl; |
| 91 | 93 | ||
| 92 | /* miscellaneous */ | 94 | /* miscellaneous */ |
| 93 | unsigned int flags; | 95 | unsigned int flags; |
| @@ -104,13 +106,13 @@ struct ncp_server { | |||
| 104 | 106 | ||
| 105 | unsigned int state; /* STREAM only: receiver state */ | 107 | unsigned int state; /* STREAM only: receiver state */ |
| 106 | struct { | 108 | struct { |
| 107 | __u32 magic __attribute__((packed)); | 109 | __u32 magic __packed; |
| 108 | __u32 len __attribute__((packed)); | 110 | __u32 len __packed; |
| 109 | __u16 type __attribute__((packed)); | 111 | __u16 type __packed; |
| 110 | __u16 p1 __attribute__((packed)); | 112 | __u16 p1 __packed; |
| 111 | __u16 p2 __attribute__((packed)); | 113 | __u16 p2 __packed; |
| 112 | __u16 p3 __attribute__((packed)); | 114 | __u16 p3 __packed; |
| 113 | __u16 type2 __attribute__((packed)); | 115 | __u16 type2 __packed; |
| 114 | } buf; /* STREAM only: temporary buffer */ | 116 | } buf; /* STREAM only: temporary buffer */ |
| 115 | unsigned char* ptr; /* STREAM only: pointer to data */ | 117 | unsigned char* ptr; /* STREAM only: pointer to data */ |
| 116 | size_t len; /* STREAM only: length of data to receive */ | 118 | size_t len; /* STREAM only: length of data to receive */ |
diff --git a/include/linux/net.h b/include/linux/net.h index dee0b11a8759..16faa130088c 100644 --- a/include/linux/net.h +++ b/include/linux/net.h | |||
| @@ -229,6 +229,8 @@ enum { | |||
| 229 | extern int sock_wake_async(struct socket *sk, int how, int band); | 229 | extern int sock_wake_async(struct socket *sk, int how, int band); |
| 230 | extern int sock_register(const struct net_proto_family *fam); | 230 | extern int sock_register(const struct net_proto_family *fam); |
| 231 | extern void sock_unregister(int family); | 231 | extern void sock_unregister(int family); |
| 232 | extern int __sock_create(struct net *net, int family, int type, int proto, | ||
| 233 | struct socket **res, int kern); | ||
| 232 | extern int sock_create(int family, int type, int proto, | 234 | extern int sock_create(int family, int type, int proto, |
| 233 | struct socket **res); | 235 | struct socket **res); |
| 234 | extern int sock_create_kern(int family, int type, int proto, | 236 | extern int sock_create_kern(int family, int type, int proto, |
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index b21e4054c12c..072652d94d9f 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h | |||
| @@ -54,6 +54,7 @@ | |||
| 54 | 54 | ||
| 55 | struct vlan_group; | 55 | struct vlan_group; |
| 56 | struct netpoll_info; | 56 | struct netpoll_info; |
| 57 | struct phy_device; | ||
| 57 | /* 802.11 specific */ | 58 | /* 802.11 specific */ |
| 58 | struct wireless_dev; | 59 | struct wireless_dev; |
| 59 | /* source back-compat hooks */ | 60 | /* source back-compat hooks */ |
| @@ -65,6 +66,11 @@ struct wireless_dev; | |||
| 65 | #define HAVE_FREE_NETDEV /* free_netdev() */ | 66 | #define HAVE_FREE_NETDEV /* free_netdev() */ |
| 66 | #define HAVE_NETDEV_PRIV /* netdev_priv() */ | 67 | #define HAVE_NETDEV_PRIV /* netdev_priv() */ |
| 67 | 68 | ||
| 69 | /* hardware address assignment types */ | ||
| 70 | #define NET_ADDR_PERM 0 /* address is permanent (default) */ | ||
| 71 | #define NET_ADDR_RANDOM 1 /* address is generated randomly */ | ||
| 72 | #define NET_ADDR_STOLEN 2 /* address is stolen from other device */ | ||
| 73 | |||
| 68 | /* Backlog congestion levels */ | 74 | /* Backlog congestion levels */ |
| 69 | #define NET_RX_SUCCESS 0 /* keep 'em coming, baby */ | 75 | #define NET_RX_SUCCESS 0 /* keep 'em coming, baby */ |
| 70 | #define NET_RX_DROP 1 /* packet dropped */ | 76 | #define NET_RX_DROP 1 /* packet dropped */ |
| @@ -159,45 +165,39 @@ static inline bool dev_xmit_complete(int rc) | |||
| 159 | #define MAX_HEADER (LL_MAX_HEADER + 48) | 165 | #define MAX_HEADER (LL_MAX_HEADER + 48) |
| 160 | #endif | 166 | #endif |
| 161 | 167 | ||
| 162 | #endif /* __KERNEL__ */ | ||
| 163 | |||
| 164 | /* | 168 | /* |
| 165 | * Network device statistics. Akin to the 2.0 ether stats but | 169 | * Old network device statistics. Fields are native words |
| 166 | * with byte counters. | 170 | * (unsigned long) so they can be read and written atomically. |
| 167 | */ | 171 | */ |
| 168 | 172 | ||
| 169 | struct net_device_stats { | 173 | struct net_device_stats { |
| 170 | unsigned long rx_packets; /* total packets received */ | 174 | unsigned long rx_packets; |
| 171 | unsigned long tx_packets; /* total packets transmitted */ | 175 | unsigned long tx_packets; |
| 172 | unsigned long rx_bytes; /* total bytes received */ | 176 | unsigned long rx_bytes; |
| 173 | unsigned long tx_bytes; /* total bytes transmitted */ | 177 | unsigned long tx_bytes; |
| 174 | unsigned long rx_errors; /* bad packets received */ | 178 | unsigned long rx_errors; |
| 175 | unsigned long tx_errors; /* packet transmit problems */ | 179 | unsigned long tx_errors; |
| 176 | unsigned long rx_dropped; /* no space in linux buffers */ | 180 | unsigned long rx_dropped; |
| 177 | unsigned long tx_dropped; /* no space available in linux */ | 181 | unsigned long tx_dropped; |
| 178 | unsigned long multicast; /* multicast packets received */ | 182 | unsigned long multicast; |
| 179 | unsigned long collisions; | 183 | unsigned long collisions; |
| 180 | |||
| 181 | /* detailed rx_errors: */ | ||
| 182 | unsigned long rx_length_errors; | 184 | unsigned long rx_length_errors; |
| 183 | unsigned long rx_over_errors; /* receiver ring buff overflow */ | 185 | unsigned long rx_over_errors; |
| 184 | unsigned long rx_crc_errors; /* recved pkt with crc error */ | 186 | unsigned long rx_crc_errors; |
| 185 | unsigned long rx_frame_errors; /* recv'd frame alignment error */ | 187 | unsigned long rx_frame_errors; |
| 186 | unsigned long rx_fifo_errors; /* recv'r fifo overrun */ | 188 | unsigned long rx_fifo_errors; |
| 187 | unsigned long rx_missed_errors; /* receiver missed packet */ | 189 | unsigned long rx_missed_errors; |
| 188 | |||
| 189 | /* detailed tx_errors */ | ||
| 190 | unsigned long tx_aborted_errors; | 190 | unsigned long tx_aborted_errors; |
| 191 | unsigned long tx_carrier_errors; | 191 | unsigned long tx_carrier_errors; |
| 192 | unsigned long tx_fifo_errors; | 192 | unsigned long tx_fifo_errors; |
| 193 | unsigned long tx_heartbeat_errors; | 193 | unsigned long tx_heartbeat_errors; |
| 194 | unsigned long tx_window_errors; | 194 | unsigned long tx_window_errors; |
| 195 | |||
| 196 | /* for cslip etc */ | ||
| 197 | unsigned long rx_compressed; | 195 | unsigned long rx_compressed; |
| 198 | unsigned long tx_compressed; | 196 | unsigned long tx_compressed; |
| 199 | }; | 197 | }; |
| 200 | 198 | ||
| 199 | #endif /* __KERNEL__ */ | ||
| 200 | |||
| 201 | 201 | ||
| 202 | /* Media selection options. */ | 202 | /* Media selection options. */ |
| 203 | enum { | 203 | enum { |
| @@ -228,9 +228,9 @@ struct netdev_hw_addr { | |||
| 228 | #define NETDEV_HW_ADDR_T_SLAVE 3 | 228 | #define NETDEV_HW_ADDR_T_SLAVE 3 |
| 229 | #define NETDEV_HW_ADDR_T_UNICAST 4 | 229 | #define NETDEV_HW_ADDR_T_UNICAST 4 |
| 230 | #define NETDEV_HW_ADDR_T_MULTICAST 5 | 230 | #define NETDEV_HW_ADDR_T_MULTICAST 5 |
| 231 | int refcount; | ||
| 232 | bool synced; | 231 | bool synced; |
| 233 | bool global_use; | 232 | bool global_use; |
| 233 | int refcount; | ||
| 234 | struct rcu_head rcu_head; | 234 | struct rcu_head rcu_head; |
| 235 | }; | 235 | }; |
| 236 | 236 | ||
| @@ -281,6 +281,12 @@ struct hh_cache { | |||
| 281 | unsigned long hh_data[HH_DATA_ALIGN(LL_MAX_HEADER) / sizeof(long)]; | 281 | unsigned long hh_data[HH_DATA_ALIGN(LL_MAX_HEADER) / sizeof(long)]; |
| 282 | }; | 282 | }; |
| 283 | 283 | ||
| 284 | static inline void hh_cache_put(struct hh_cache *hh) | ||
| 285 | { | ||
| 286 | if (atomic_dec_and_test(&hh->hh_refcnt)) | ||
| 287 | kfree(hh); | ||
| 288 | } | ||
| 289 | |||
| 284 | /* Reserve HH_DATA_MOD byte aligned hard_header_len, but at least that much. | 290 | /* Reserve HH_DATA_MOD byte aligned hard_header_len, but at least that much. |
| 285 | * Alternative is: | 291 | * Alternative is: |
| 286 | * dev->hard_header_len ? (dev->hard_header_len + | 292 | * dev->hard_header_len ? (dev->hard_header_len + |
| @@ -381,6 +387,8 @@ enum gro_result { | |||
| 381 | }; | 387 | }; |
| 382 | typedef enum gro_result gro_result_t; | 388 | typedef enum gro_result gro_result_t; |
| 383 | 389 | ||
| 390 | typedef struct sk_buff *rx_handler_func_t(struct sk_buff *skb); | ||
| 391 | |||
| 384 | extern void __napi_schedule(struct napi_struct *n); | 392 | extern void __napi_schedule(struct napi_struct *n); |
| 385 | 393 | ||
| 386 | static inline int napi_disable_pending(struct napi_struct *n) | 394 | static inline int napi_disable_pending(struct napi_struct *n) |
| @@ -504,9 +512,9 @@ struct netdev_queue { | |||
| 504 | * please use this field instead of dev->trans_start | 512 | * please use this field instead of dev->trans_start |
| 505 | */ | 513 | */ |
| 506 | unsigned long trans_start; | 514 | unsigned long trans_start; |
| 507 | unsigned long tx_bytes; | 515 | u64 tx_bytes; |
| 508 | unsigned long tx_packets; | 516 | u64 tx_packets; |
| 509 | unsigned long tx_dropped; | 517 | u64 tx_dropped; |
| 510 | } ____cacheline_aligned_in_smp; | 518 | } ____cacheline_aligned_in_smp; |
| 511 | 519 | ||
| 512 | #ifdef CONFIG_RPS | 520 | #ifdef CONFIG_RPS |
| @@ -577,15 +585,15 @@ static inline void rps_reset_sock_flow(struct rps_sock_flow_table *table, | |||
| 577 | table->ents[hash & table->mask] = RPS_NO_CPU; | 585 | table->ents[hash & table->mask] = RPS_NO_CPU; |
| 578 | } | 586 | } |
| 579 | 587 | ||
| 580 | extern struct rps_sock_flow_table *rps_sock_flow_table; | 588 | extern struct rps_sock_flow_table __rcu *rps_sock_flow_table; |
| 581 | 589 | ||
| 582 | /* This structure contains an instance of an RX queue. */ | 590 | /* This structure contains an instance of an RX queue. */ |
| 583 | struct netdev_rx_queue { | 591 | struct netdev_rx_queue { |
| 584 | struct rps_map *rps_map; | 592 | struct rps_map __rcu *rps_map; |
| 585 | struct rps_dev_flow_table *rps_flow_table; | 593 | struct rps_dev_flow_table __rcu *rps_flow_table; |
| 586 | struct kobject kobj; | 594 | struct kobject kobj; |
| 587 | struct netdev_rx_queue *first; | 595 | struct netdev_rx_queue *first; |
| 588 | atomic_t count; | 596 | atomic_t count; |
| 589 | } ____cacheline_aligned_in_smp; | 597 | } ____cacheline_aligned_in_smp; |
| 590 | #endif /* CONFIG_RPS */ | 598 | #endif /* CONFIG_RPS */ |
| 591 | 599 | ||
| @@ -660,10 +668,19 @@ struct netdev_rx_queue { | |||
| 660 | * Callback uses when the transmitter has not made any progress | 668 | * Callback uses when the transmitter has not made any progress |
| 661 | * for dev->watchdog ticks. | 669 | * for dev->watchdog ticks. |
| 662 | * | 670 | * |
| 671 | * struct rtnl_link_stats64* (*ndo_get_stats64)(struct net_device *dev, | ||
| 672 | * struct rtnl_link_stats64 *storage); | ||
| 663 | * struct net_device_stats* (*ndo_get_stats)(struct net_device *dev); | 673 | * struct net_device_stats* (*ndo_get_stats)(struct net_device *dev); |
| 664 | * Called when a user wants to get the network device usage | 674 | * Called when a user wants to get the network device usage |
| 665 | * statistics. If not defined, the counters in dev->stats will | 675 | * statistics. Drivers must do one of the following: |
| 666 | * be used. | 676 | * 1. Define @ndo_get_stats64 to fill in a zero-initialised |
| 677 | * rtnl_link_stats64 structure passed by the caller. | ||
| 678 | * 2. Define @ndo_get_stats to update a net_device_stats structure | ||
| 679 | * (which should normally be dev->stats) and return a pointer to | ||
| 680 | * it. The structure may be changed asynchronously only if each | ||
| 681 | * field is written atomically. | ||
| 682 | * 3. Update dev->stats asynchronously and atomically, and define | ||
| 683 | * neither operation. | ||
| 667 | * | 684 | * |
| 668 | * void (*ndo_vlan_rx_register)(struct net_device *dev, struct vlan_group *grp); | 685 | * void (*ndo_vlan_rx_register)(struct net_device *dev, struct vlan_group *grp); |
| 669 | * If device support VLAN receive accleration | 686 | * If device support VLAN receive accleration |
| @@ -718,6 +735,8 @@ struct net_device_ops { | |||
| 718 | struct neigh_parms *); | 735 | struct neigh_parms *); |
| 719 | void (*ndo_tx_timeout) (struct net_device *dev); | 736 | void (*ndo_tx_timeout) (struct net_device *dev); |
| 720 | 737 | ||
| 738 | struct rtnl_link_stats64* (*ndo_get_stats64)(struct net_device *dev, | ||
| 739 | struct rtnl_link_stats64 *storage); | ||
| 721 | struct net_device_stats* (*ndo_get_stats)(struct net_device *dev); | 740 | struct net_device_stats* (*ndo_get_stats)(struct net_device *dev); |
| 722 | 741 | ||
| 723 | void (*ndo_vlan_rx_register)(struct net_device *dev, | 742 | void (*ndo_vlan_rx_register)(struct net_device *dev, |
| @@ -728,6 +747,8 @@ struct net_device_ops { | |||
| 728 | unsigned short vid); | 747 | unsigned short vid); |
| 729 | #ifdef CONFIG_NET_POLL_CONTROLLER | 748 | #ifdef CONFIG_NET_POLL_CONTROLLER |
| 730 | void (*ndo_poll_controller)(struct net_device *dev); | 749 | void (*ndo_poll_controller)(struct net_device *dev); |
| 750 | int (*ndo_netpoll_setup)(struct net_device *dev, | ||
| 751 | struct netpoll_info *info); | ||
| 731 | void (*ndo_netpoll_cleanup)(struct net_device *dev); | 752 | void (*ndo_netpoll_cleanup)(struct net_device *dev); |
| 732 | #endif | 753 | #endif |
| 733 | int (*ndo_set_vf_mac)(struct net_device *dev, | 754 | int (*ndo_set_vf_mac)(struct net_device *dev, |
| @@ -775,11 +796,11 @@ struct net_device { | |||
| 775 | /* | 796 | /* |
| 776 | * This is the first field of the "visible" part of this structure | 797 | * This is the first field of the "visible" part of this structure |
| 777 | * (i.e. as seen by users in the "Space.c" file). It is the name | 798 | * (i.e. as seen by users in the "Space.c" file). It is the name |
| 778 | * the interface. | 799 | * of the interface. |
| 779 | */ | 800 | */ |
| 780 | char name[IFNAMSIZ]; | 801 | char name[IFNAMSIZ]; |
| 781 | 802 | ||
| 782 | struct pm_qos_request_list *pm_qos_req; | 803 | struct pm_qos_request_list pm_qos_req; |
| 783 | 804 | ||
| 784 | /* device name hash chain */ | 805 | /* device name hash chain */ |
| 785 | struct hlist_node name_hlist; | 806 | struct hlist_node name_hlist; |
| @@ -847,7 +868,8 @@ struct net_device { | |||
| 847 | #define NETIF_F_FSO (SKB_GSO_FCOE << NETIF_F_GSO_SHIFT) | 868 | #define NETIF_F_FSO (SKB_GSO_FCOE << NETIF_F_GSO_SHIFT) |
| 848 | 869 | ||
| 849 | /* List of features with software fallbacks. */ | 870 | /* List of features with software fallbacks. */ |
| 850 | #define NETIF_F_GSO_SOFTWARE (NETIF_F_TSO | NETIF_F_TSO_ECN | NETIF_F_TSO6) | 871 | #define NETIF_F_GSO_SOFTWARE (NETIF_F_TSO | NETIF_F_TSO_ECN | \ |
| 872 | NETIF_F_TSO6 | NETIF_F_UFO) | ||
| 851 | 873 | ||
| 852 | 874 | ||
| 853 | #define NETIF_F_GEN_CSUM (NETIF_F_NO_CSUM | NETIF_F_HW_CSUM) | 875 | #define NETIF_F_GEN_CSUM (NETIF_F_NO_CSUM | NETIF_F_HW_CSUM) |
| @@ -868,6 +890,9 @@ struct net_device { | |||
| 868 | int iflink; | 890 | int iflink; |
| 869 | 891 | ||
| 870 | struct net_device_stats stats; | 892 | struct net_device_stats stats; |
| 893 | atomic_long_t rx_dropped; /* dropped packets by core network | ||
| 894 | * Do not use this in drivers. | ||
| 895 | */ | ||
| 871 | 896 | ||
| 872 | #ifdef CONFIG_WIRELESS_EXT | 897 | #ifdef CONFIG_WIRELESS_EXT |
| 873 | /* List of functions to handle Wireless Extensions (instead of ioctl). | 898 | /* List of functions to handle Wireless Extensions (instead of ioctl). |
| @@ -885,7 +910,7 @@ struct net_device { | |||
| 885 | 910 | ||
| 886 | unsigned int flags; /* interface flags (a la BSD) */ | 911 | unsigned int flags; /* interface flags (a la BSD) */ |
| 887 | unsigned short gflags; | 912 | unsigned short gflags; |
| 888 | unsigned short priv_flags; /* Like 'flags' but invisible to userspace. */ | 913 | unsigned int priv_flags; /* Like 'flags' but invisible to userspace. */ |
| 889 | unsigned short padded; /* How much padding added by alloc_netdev() */ | 914 | unsigned short padded; /* How much padding added by alloc_netdev() */ |
| 890 | 915 | ||
| 891 | unsigned char operstate; /* RFC2863 operstate */ | 916 | unsigned char operstate; /* RFC2863 operstate */ |
| @@ -902,12 +927,9 @@ struct net_device { | |||
| 902 | unsigned short needed_headroom; | 927 | unsigned short needed_headroom; |
| 903 | unsigned short needed_tailroom; | 928 | unsigned short needed_tailroom; |
| 904 | 929 | ||
| 905 | struct net_device *master; /* Pointer to master device of a group, | ||
| 906 | * which this device is member of. | ||
| 907 | */ | ||
| 908 | |||
| 909 | /* Interface address info. */ | 930 | /* Interface address info. */ |
| 910 | unsigned char perm_addr[MAX_ADDR_LEN]; /* permanent hw address */ | 931 | unsigned char perm_addr[MAX_ADDR_LEN]; /* permanent hw address */ |
| 932 | unsigned char addr_assign_type; /* hw address assignment type */ | ||
| 911 | unsigned char addr_len; /* hardware address length */ | 933 | unsigned char addr_len; /* hardware address length */ |
| 912 | unsigned short dev_id; /* for shared network cards */ | 934 | unsigned short dev_id; /* for shared network cards */ |
| 913 | 935 | ||
| @@ -920,23 +942,37 @@ struct net_device { | |||
| 920 | 942 | ||
| 921 | 943 | ||
| 922 | /* Protocol specific pointers */ | 944 | /* Protocol specific pointers */ |
| 923 | 945 | ||
| 946 | #if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) | ||
| 947 | struct vlan_group __rcu *vlgrp; /* VLAN group */ | ||
| 948 | #endif | ||
| 924 | #ifdef CONFIG_NET_DSA | 949 | #ifdef CONFIG_NET_DSA |
| 925 | void *dsa_ptr; /* dsa specific data */ | 950 | void *dsa_ptr; /* dsa specific data */ |
| 926 | #endif | 951 | #endif |
| 927 | void *atalk_ptr; /* AppleTalk link */ | 952 | void *atalk_ptr; /* AppleTalk link */ |
| 928 | void *ip_ptr; /* IPv4 specific data */ | 953 | struct in_device __rcu *ip_ptr; /* IPv4 specific data */ |
| 929 | void *dn_ptr; /* DECnet specific data */ | 954 | void *dn_ptr; /* DECnet specific data */ |
| 930 | void *ip6_ptr; /* IPv6 specific data */ | 955 | struct inet6_dev __rcu *ip6_ptr; /* IPv6 specific data */ |
| 931 | void *ec_ptr; /* Econet specific data */ | 956 | void *ec_ptr; /* Econet specific data */ |
| 932 | void *ax25_ptr; /* AX.25 specific data */ | 957 | void *ax25_ptr; /* AX.25 specific data */ |
| 933 | struct wireless_dev *ieee80211_ptr; /* IEEE 802.11 specific data, | 958 | struct wireless_dev *ieee80211_ptr; /* IEEE 802.11 specific data, |
| 934 | assign before registering */ | 959 | assign before registering */ |
| 935 | 960 | ||
| 936 | /* | 961 | /* |
| 937 | * Cache line mostly used on receive path (including eth_type_trans()) | 962 | * Cache lines mostly used on receive path (including eth_type_trans()) |
| 938 | */ | 963 | */ |
| 939 | unsigned long last_rx; /* Time of last Rx */ | 964 | unsigned long last_rx; /* Time of last Rx |
| 965 | * This should not be set in | ||
| 966 | * drivers, unless really needed, | ||
| 967 | * because network stack (bonding) | ||
| 968 | * use it if/when necessary, to | ||
| 969 | * avoid dirtying this cache line. | ||
| 970 | */ | ||
| 971 | |||
| 972 | struct net_device *master; /* Pointer to master device of a group, | ||
| 973 | * which this device is member of. | ||
| 974 | */ | ||
| 975 | |||
| 940 | /* Interface address info used in eth_type_trans() */ | 976 | /* Interface address info used in eth_type_trans() */ |
| 941 | unsigned char *dev_addr; /* hw address, (before bcast | 977 | unsigned char *dev_addr; /* hw address, (before bcast |
| 942 | because most packets are | 978 | because most packets are |
| @@ -952,12 +988,21 @@ struct net_device { | |||
| 952 | 988 | ||
| 953 | struct netdev_rx_queue *_rx; | 989 | struct netdev_rx_queue *_rx; |
| 954 | 990 | ||
| 955 | /* Number of RX queues allocated at alloc_netdev_mq() time */ | 991 | /* Number of RX queues allocated at register_netdev() time */ |
| 956 | unsigned int num_rx_queues; | 992 | unsigned int num_rx_queues; |
| 993 | |||
| 994 | /* Number of RX queues currently active in device */ | ||
| 995 | unsigned int real_num_rx_queues; | ||
| 957 | #endif | 996 | #endif |
| 958 | 997 | ||
| 959 | struct netdev_queue rx_queue; | 998 | rx_handler_func_t *rx_handler; |
| 999 | void *rx_handler_data; | ||
| 1000 | |||
| 1001 | struct netdev_queue __rcu *ingress_queue; | ||
| 960 | 1002 | ||
| 1003 | /* | ||
| 1004 | * Cache lines mostly used on transmit path | ||
| 1005 | */ | ||
| 961 | struct netdev_queue *_tx ____cacheline_aligned_in_smp; | 1006 | struct netdev_queue *_tx ____cacheline_aligned_in_smp; |
| 962 | 1007 | ||
| 963 | /* Number of TX queues allocated at alloc_netdev_mq() time */ | 1008 | /* Number of TX queues allocated at alloc_netdev_mq() time */ |
| @@ -971,9 +1016,7 @@ struct net_device { | |||
| 971 | 1016 | ||
| 972 | unsigned long tx_queue_len; /* Max frames per queue allowed */ | 1017 | unsigned long tx_queue_len; /* Max frames per queue allowed */ |
| 973 | spinlock_t tx_global_lock; | 1018 | spinlock_t tx_global_lock; |
| 974 | /* | 1019 | |
| 975 | * One part is mostly used on xmit path (device) | ||
| 976 | */ | ||
| 977 | /* These may be needed for future network-power-down code. */ | 1020 | /* These may be needed for future network-power-down code. */ |
| 978 | 1021 | ||
| 979 | /* | 1022 | /* |
| @@ -986,7 +1029,7 @@ struct net_device { | |||
| 986 | struct timer_list watchdog_timer; | 1029 | struct timer_list watchdog_timer; |
| 987 | 1030 | ||
| 988 | /* Number of references to this device */ | 1031 | /* Number of references to this device */ |
| 989 | atomic_t refcnt ____cacheline_aligned_in_smp; | 1032 | int __percpu *pcpu_refcnt; |
| 990 | 1033 | ||
| 991 | /* delayed register/unregister */ | 1034 | /* delayed register/unregister */ |
| 992 | struct list_head todo_list; | 1035 | struct list_head todo_list; |
| @@ -1022,14 +1065,14 @@ struct net_device { | |||
| 1022 | #endif | 1065 | #endif |
| 1023 | 1066 | ||
| 1024 | /* mid-layer private */ | 1067 | /* mid-layer private */ |
| 1025 | void *ml_priv; | 1068 | union { |
| 1026 | 1069 | void *ml_priv; | |
| 1027 | /* bridge stuff */ | 1070 | struct pcpu_lstats __percpu *lstats; /* loopback stats */ |
| 1028 | struct net_bridge_port *br_port; | 1071 | struct pcpu_tstats __percpu *tstats; /* tunnel stats */ |
| 1029 | /* macvlan */ | 1072 | struct pcpu_dstats __percpu *dstats; /* dummy stats */ |
| 1030 | struct macvlan_port *macvlan_port; | 1073 | }; |
| 1031 | /* GARP */ | 1074 | /* GARP */ |
| 1032 | struct garp_port *garp_port; | 1075 | struct garp_port __rcu *garp_port; |
| 1033 | 1076 | ||
| 1034 | /* class/net/name entry */ | 1077 | /* class/net/name entry */ |
| 1035 | struct device dev; | 1078 | struct device dev; |
| @@ -1057,6 +1100,9 @@ struct net_device { | |||
| 1057 | #endif | 1100 | #endif |
| 1058 | /* n-tuple filter list attached to this device */ | 1101 | /* n-tuple filter list attached to this device */ |
| 1059 | struct ethtool_rx_ntuple_list ethtool_ntuple_list; | 1102 | struct ethtool_rx_ntuple_list ethtool_ntuple_list; |
| 1103 | |||
| 1104 | /* phy device may attach itself for hardware timestamping */ | ||
| 1105 | struct phy_device *phydev; | ||
| 1060 | }; | 1106 | }; |
| 1061 | #define to_net_dev(d) container_of(d, struct net_device, dev) | 1107 | #define to_net_dev(d) container_of(d, struct net_device, dev) |
| 1062 | 1108 | ||
| @@ -1087,11 +1133,7 @@ static inline void netdev_for_each_tx_queue(struct net_device *dev, | |||
| 1087 | static inline | 1133 | static inline |
| 1088 | struct net *dev_net(const struct net_device *dev) | 1134 | struct net *dev_net(const struct net_device *dev) |
| 1089 | { | 1135 | { |
| 1090 | #ifdef CONFIG_NET_NS | 1136 | return read_pnet(&dev->nd_net); |
| 1091 | return dev->nd_net; | ||
| 1092 | #else | ||
| 1093 | return &init_net; | ||
| 1094 | #endif | ||
| 1095 | } | 1137 | } |
| 1096 | 1138 | ||
| 1097 | static inline | 1139 | static inline |
| @@ -1272,8 +1314,8 @@ extern void dev_add_pack(struct packet_type *pt); | |||
| 1272 | extern void dev_remove_pack(struct packet_type *pt); | 1314 | extern void dev_remove_pack(struct packet_type *pt); |
| 1273 | extern void __dev_remove_pack(struct packet_type *pt); | 1315 | extern void __dev_remove_pack(struct packet_type *pt); |
| 1274 | 1316 | ||
| 1275 | extern struct net_device *dev_get_by_flags(struct net *net, unsigned short flags, | 1317 | extern struct net_device *dev_get_by_flags_rcu(struct net *net, unsigned short flags, |
| 1276 | unsigned short mask); | 1318 | unsigned short mask); |
| 1277 | extern struct net_device *dev_get_by_name(struct net *net, const char *name); | 1319 | extern struct net_device *dev_get_by_name(struct net *net, const char *name); |
| 1278 | extern struct net_device *dev_get_by_name_rcu(struct net *net, const char *name); | 1320 | extern struct net_device *dev_get_by_name_rcu(struct net *net, const char *name); |
| 1279 | extern struct net_device *__dev_get_by_name(struct net *net, const char *name); | 1321 | extern struct net_device *__dev_get_by_name(struct net *net, const char *name); |
| @@ -1291,6 +1333,7 @@ static inline void unregister_netdevice(struct net_device *dev) | |||
| 1291 | unregister_netdevice_queue(dev, NULL); | 1333 | unregister_netdevice_queue(dev, NULL); |
| 1292 | } | 1334 | } |
| 1293 | 1335 | ||
| 1336 | extern int netdev_refcnt_read(const struct net_device *dev); | ||
| 1294 | extern void free_netdev(struct net_device *dev); | 1337 | extern void free_netdev(struct net_device *dev); |
| 1295 | extern void synchronize_net(void); | 1338 | extern void synchronize_net(void); |
| 1296 | extern int register_netdevice_notifier(struct notifier_block *nb); | 1339 | extern int register_netdevice_notifier(struct notifier_block *nb); |
| @@ -1653,11 +1696,34 @@ static inline void netif_wake_subqueue(struct net_device *dev, u16 queue_index) | |||
| 1653 | */ | 1696 | */ |
| 1654 | static inline int netif_is_multiqueue(const struct net_device *dev) | 1697 | static inline int netif_is_multiqueue(const struct net_device *dev) |
| 1655 | { | 1698 | { |
| 1656 | return (dev->num_tx_queues > 1); | 1699 | return dev->num_tx_queues > 1; |
| 1657 | } | 1700 | } |
| 1658 | 1701 | ||
| 1659 | extern void netif_set_real_num_tx_queues(struct net_device *dev, | 1702 | extern int netif_set_real_num_tx_queues(struct net_device *dev, |
| 1660 | unsigned int txq); | 1703 | unsigned int txq); |
| 1704 | |||
| 1705 | #ifdef CONFIG_RPS | ||
| 1706 | extern int netif_set_real_num_rx_queues(struct net_device *dev, | ||
| 1707 | unsigned int rxq); | ||
| 1708 | #else | ||
| 1709 | static inline int netif_set_real_num_rx_queues(struct net_device *dev, | ||
| 1710 | unsigned int rxq) | ||
| 1711 | { | ||
| 1712 | return 0; | ||
| 1713 | } | ||
| 1714 | #endif | ||
| 1715 | |||
| 1716 | static inline int netif_copy_real_num_queues(struct net_device *to_dev, | ||
| 1717 | const struct net_device *from_dev) | ||
| 1718 | { | ||
| 1719 | netif_set_real_num_tx_queues(to_dev, from_dev->real_num_tx_queues); | ||
| 1720 | #ifdef CONFIG_RPS | ||
| 1721 | return netif_set_real_num_rx_queues(to_dev, | ||
| 1722 | from_dev->real_num_rx_queues); | ||
| 1723 | #else | ||
| 1724 | return 0; | ||
| 1725 | #endif | ||
| 1726 | } | ||
| 1661 | 1727 | ||
| 1662 | /* Use this variant when it is known for sure that it | 1728 | /* Use this variant when it is known for sure that it |
| 1663 | * is executing from hardware interrupt context or with hardware interrupts | 1729 | * is executing from hardware interrupt context or with hardware interrupts |
| @@ -1681,8 +1747,7 @@ extern gro_result_t dev_gro_receive(struct napi_struct *napi, | |||
| 1681 | extern gro_result_t napi_skb_finish(gro_result_t ret, struct sk_buff *skb); | 1747 | extern gro_result_t napi_skb_finish(gro_result_t ret, struct sk_buff *skb); |
| 1682 | extern gro_result_t napi_gro_receive(struct napi_struct *napi, | 1748 | extern gro_result_t napi_gro_receive(struct napi_struct *napi, |
| 1683 | struct sk_buff *skb); | 1749 | struct sk_buff *skb); |
| 1684 | extern void napi_reuse_skb(struct napi_struct *napi, | 1750 | extern void napi_gro_flush(struct napi_struct *napi); |
| 1685 | struct sk_buff *skb); | ||
| 1686 | extern struct sk_buff * napi_get_frags(struct napi_struct *napi); | 1751 | extern struct sk_buff * napi_get_frags(struct napi_struct *napi); |
| 1687 | extern gro_result_t napi_frags_finish(struct napi_struct *napi, | 1752 | extern gro_result_t napi_frags_finish(struct napi_struct *napi, |
| 1688 | struct sk_buff *skb, | 1753 | struct sk_buff *skb, |
| @@ -1696,7 +1761,11 @@ static inline void napi_free_frags(struct napi_struct *napi) | |||
| 1696 | napi->skb = NULL; | 1761 | napi->skb = NULL; |
| 1697 | } | 1762 | } |
| 1698 | 1763 | ||
| 1699 | extern void netif_nit_deliver(struct sk_buff *skb); | 1764 | extern int netdev_rx_handler_register(struct net_device *dev, |
| 1765 | rx_handler_func_t *rx_handler, | ||
| 1766 | void *rx_handler_data); | ||
| 1767 | extern void netdev_rx_handler_unregister(struct net_device *dev); | ||
| 1768 | |||
| 1700 | extern int dev_valid_name(const char *name); | 1769 | extern int dev_valid_name(const char *name); |
| 1701 | extern int dev_ioctl(struct net *net, unsigned int cmd, void __user *); | 1770 | extern int dev_ioctl(struct net *net, unsigned int cmd, void __user *); |
| 1702 | extern int dev_ethtool(struct net *net, struct ifreq *); | 1771 | extern int dev_ethtool(struct net *net, struct ifreq *); |
| @@ -1730,7 +1799,7 @@ extern void netdev_run_todo(void); | |||
| 1730 | */ | 1799 | */ |
| 1731 | static inline void dev_put(struct net_device *dev) | 1800 | static inline void dev_put(struct net_device *dev) |
| 1732 | { | 1801 | { |
| 1733 | atomic_dec(&dev->refcnt); | 1802 | irqsafe_cpu_dec(*dev->pcpu_refcnt); |
| 1734 | } | 1803 | } |
| 1735 | 1804 | ||
| 1736 | /** | 1805 | /** |
| @@ -1741,7 +1810,7 @@ static inline void dev_put(struct net_device *dev) | |||
| 1741 | */ | 1810 | */ |
| 1742 | static inline void dev_hold(struct net_device *dev) | 1811 | static inline void dev_hold(struct net_device *dev) |
| 1743 | { | 1812 | { |
| 1744 | atomic_inc(&dev->refcnt); | 1813 | irqsafe_cpu_inc(*dev->pcpu_refcnt); |
| 1745 | } | 1814 | } |
| 1746 | 1815 | ||
| 1747 | /* Carrier loss detection, dial on demand. The functions netif_carrier_on | 1816 | /* Carrier loss detection, dial on demand. The functions netif_carrier_on |
| @@ -1775,6 +1844,8 @@ extern void netif_carrier_on(struct net_device *dev); | |||
| 1775 | 1844 | ||
| 1776 | extern void netif_carrier_off(struct net_device *dev); | 1845 | extern void netif_carrier_off(struct net_device *dev); |
| 1777 | 1846 | ||
| 1847 | extern void netif_notify_peers(struct net_device *dev); | ||
| 1848 | |||
| 1778 | /** | 1849 | /** |
| 1779 | * netif_dormant_on - mark device as dormant. | 1850 | * netif_dormant_on - mark device as dormant. |
| 1780 | * @dev: network device | 1851 | * @dev: network device |
| @@ -2119,8 +2190,10 @@ extern void netdev_features_change(struct net_device *dev); | |||
| 2119 | /* Load a device via the kmod */ | 2190 | /* Load a device via the kmod */ |
| 2120 | extern void dev_load(struct net *net, const char *name); | 2191 | extern void dev_load(struct net *net, const char *name); |
| 2121 | extern void dev_mcast_init(void); | 2192 | extern void dev_mcast_init(void); |
| 2122 | extern const struct net_device_stats *dev_get_stats(struct net_device *dev); | 2193 | extern struct rtnl_link_stats64 *dev_get_stats(struct net_device *dev, |
| 2123 | extern void dev_txq_stats_fold(const struct net_device *dev, struct net_device_stats *stats); | 2194 | struct rtnl_link_stats64 *storage); |
| 2195 | extern void dev_txq_stats_fold(const struct net_device *dev, | ||
| 2196 | struct rtnl_link_stats64 *stats); | ||
| 2124 | 2197 | ||
| 2125 | extern int netdev_max_backlog; | 2198 | extern int netdev_max_backlog; |
| 2126 | extern int netdev_tstamp_prequeue; | 2199 | extern int netdev_tstamp_prequeue; |
| @@ -2148,6 +2221,8 @@ extern void dev_seq_stop(struct seq_file *seq, void *v); | |||
| 2148 | extern int netdev_class_create_file(struct class_attribute *class_attr); | 2221 | extern int netdev_class_create_file(struct class_attribute *class_attr); |
| 2149 | extern void netdev_class_remove_file(struct class_attribute *class_attr); | 2222 | extern void netdev_class_remove_file(struct class_attribute *class_attr); |
| 2150 | 2223 | ||
| 2224 | extern struct kobj_ns_type_operations net_ns_type_operations; | ||
| 2225 | |||
| 2151 | extern char *netdev_drivername(const struct net_device *dev, char *buffer, int len); | 2226 | extern char *netdev_drivername(const struct net_device *dev, char *buffer, int len); |
| 2152 | 2227 | ||
| 2153 | extern void linkwatch_run_queue(void); | 2228 | extern void linkwatch_run_queue(void); |
| @@ -2168,14 +2243,22 @@ static inline int net_gso_ok(int features, int gso_type) | |||
| 2168 | static inline int skb_gso_ok(struct sk_buff *skb, int features) | 2243 | static inline int skb_gso_ok(struct sk_buff *skb, int features) |
| 2169 | { | 2244 | { |
| 2170 | return net_gso_ok(features, skb_shinfo(skb)->gso_type) && | 2245 | return net_gso_ok(features, skb_shinfo(skb)->gso_type) && |
| 2171 | (!skb_has_frags(skb) || (features & NETIF_F_FRAGLIST)); | 2246 | (!skb_has_frag_list(skb) || (features & NETIF_F_FRAGLIST)); |
| 2172 | } | 2247 | } |
| 2173 | 2248 | ||
| 2174 | static inline int netif_needs_gso(struct net_device *dev, struct sk_buff *skb) | 2249 | static inline int netif_needs_gso(struct net_device *dev, struct sk_buff *skb) |
| 2175 | { | 2250 | { |
| 2176 | return skb_is_gso(skb) && | 2251 | if (skb_is_gso(skb)) { |
| 2177 | (!skb_gso_ok(skb, dev->features) || | 2252 | int features = dev->features; |
| 2178 | unlikely(skb->ip_summed != CHECKSUM_PARTIAL)); | 2253 | |
| 2254 | if (skb->protocol == htons(ETH_P_8021Q) || skb->vlan_tci) | ||
| 2255 | features &= dev->vlan_features; | ||
| 2256 | |||
| 2257 | return (!skb_gso_ok(skb, features) || | ||
| 2258 | unlikely(skb->ip_summed != CHECKSUM_PARTIAL)); | ||
| 2259 | } | ||
| 2260 | |||
| 2261 | return 0; | ||
| 2179 | } | 2262 | } |
| 2180 | 2263 | ||
| 2181 | static inline void netif_set_gso_max_size(struct net_device *dev, | 2264 | static inline void netif_set_gso_max_size(struct net_device *dev, |
| @@ -2230,25 +2313,23 @@ static inline const char *netdev_name(const struct net_device *dev) | |||
| 2230 | return dev->name; | 2313 | return dev->name; |
| 2231 | } | 2314 | } |
| 2232 | 2315 | ||
| 2233 | #define netdev_printk(level, netdev, format, args...) \ | 2316 | extern int netdev_printk(const char *level, const struct net_device *dev, |
| 2234 | dev_printk(level, (netdev)->dev.parent, \ | 2317 | const char *format, ...) |
| 2235 | "%s: " format, \ | 2318 | __attribute__ ((format (printf, 3, 4))); |
| 2236 | netdev_name(netdev), ##args) | 2319 | extern int netdev_emerg(const struct net_device *dev, const char *format, ...) |
| 2237 | 2320 | __attribute__ ((format (printf, 2, 3))); | |
| 2238 | #define netdev_emerg(dev, format, args...) \ | 2321 | extern int netdev_alert(const struct net_device *dev, const char *format, ...) |
| 2239 | netdev_printk(KERN_EMERG, dev, format, ##args) | 2322 | __attribute__ ((format (printf, 2, 3))); |
| 2240 | #define netdev_alert(dev, format, args...) \ | 2323 | extern int netdev_crit(const struct net_device *dev, const char *format, ...) |
| 2241 | netdev_printk(KERN_ALERT, dev, format, ##args) | 2324 | __attribute__ ((format (printf, 2, 3))); |
| 2242 | #define netdev_crit(dev, format, args...) \ | 2325 | extern int netdev_err(const struct net_device *dev, const char *format, ...) |
| 2243 | netdev_printk(KERN_CRIT, dev, format, ##args) | 2326 | __attribute__ ((format (printf, 2, 3))); |
| 2244 | #define netdev_err(dev, format, args...) \ | 2327 | extern int netdev_warn(const struct net_device *dev, const char *format, ...) |
| 2245 | netdev_printk(KERN_ERR, dev, format, ##args) | 2328 | __attribute__ ((format (printf, 2, 3))); |
| 2246 | #define netdev_warn(dev, format, args...) \ | 2329 | extern int netdev_notice(const struct net_device *dev, const char *format, ...) |
| 2247 | netdev_printk(KERN_WARNING, dev, format, ##args) | 2330 | __attribute__ ((format (printf, 2, 3))); |
| 2248 | #define netdev_notice(dev, format, args...) \ | 2331 | extern int netdev_info(const struct net_device *dev, const char *format, ...) |
| 2249 | netdev_printk(KERN_NOTICE, dev, format, ##args) | 2332 | __attribute__ ((format (printf, 2, 3))); |
| 2250 | #define netdev_info(dev, format, args...) \ | ||
| 2251 | netdev_printk(KERN_INFO, dev, format, ##args) | ||
| 2252 | 2333 | ||
| 2253 | #if defined(DEBUG) | 2334 | #if defined(DEBUG) |
| 2254 | #define netdev_dbg(__dev, format, args...) \ | 2335 | #define netdev_dbg(__dev, format, args...) \ |
| @@ -2296,20 +2377,26 @@ do { \ | |||
| 2296 | netdev_printk(level, (dev), fmt, ##args); \ | 2377 | netdev_printk(level, (dev), fmt, ##args); \ |
| 2297 | } while (0) | 2378 | } while (0) |
| 2298 | 2379 | ||
| 2380 | #define netif_level(level, priv, type, dev, fmt, args...) \ | ||
| 2381 | do { \ | ||
| 2382 | if (netif_msg_##type(priv)) \ | ||
| 2383 | netdev_##level(dev, fmt, ##args); \ | ||
| 2384 | } while (0) | ||
| 2385 | |||
| 2299 | #define netif_emerg(priv, type, dev, fmt, args...) \ | 2386 | #define netif_emerg(priv, type, dev, fmt, args...) \ |
| 2300 | netif_printk(priv, type, KERN_EMERG, dev, fmt, ##args) | 2387 | netif_level(emerg, priv, type, dev, fmt, ##args) |
| 2301 | #define netif_alert(priv, type, dev, fmt, args...) \ | 2388 | #define netif_alert(priv, type, dev, fmt, args...) \ |
| 2302 | netif_printk(priv, type, KERN_ALERT, dev, fmt, ##args) | 2389 | netif_level(alert, priv, type, dev, fmt, ##args) |
| 2303 | #define netif_crit(priv, type, dev, fmt, args...) \ | 2390 | #define netif_crit(priv, type, dev, fmt, args...) \ |
| 2304 | netif_printk(priv, type, KERN_CRIT, dev, fmt, ##args) | 2391 | netif_level(crit, priv, type, dev, fmt, ##args) |
| 2305 | #define netif_err(priv, type, dev, fmt, args...) \ | 2392 | #define netif_err(priv, type, dev, fmt, args...) \ |
| 2306 | netif_printk(priv, type, KERN_ERR, dev, fmt, ##args) | 2393 | netif_level(err, priv, type, dev, fmt, ##args) |
| 2307 | #define netif_warn(priv, type, dev, fmt, args...) \ | 2394 | #define netif_warn(priv, type, dev, fmt, args...) \ |
| 2308 | netif_printk(priv, type, KERN_WARNING, dev, fmt, ##args) | 2395 | netif_level(warn, priv, type, dev, fmt, ##args) |
| 2309 | #define netif_notice(priv, type, dev, fmt, args...) \ | 2396 | #define netif_notice(priv, type, dev, fmt, args...) \ |
| 2310 | netif_printk(priv, type, KERN_NOTICE, dev, fmt, ##args) | 2397 | netif_level(notice, priv, type, dev, fmt, ##args) |
| 2311 | #define netif_info(priv, type, dev, fmt, args...) \ | 2398 | #define netif_info(priv, type, dev, fmt, args...) \ |
| 2312 | netif_printk(priv, type, KERN_INFO, (dev), fmt, ##args) | 2399 | netif_level(info, priv, type, dev, fmt, ##args) |
| 2313 | 2400 | ||
| 2314 | #if defined(DEBUG) | 2401 | #if defined(DEBUG) |
| 2315 | #define netif_dbg(priv, type, dev, format, args...) \ | 2402 | #define netif_dbg(priv, type, dev, format, args...) \ |
diff --git a/include/linux/netfilter/Kbuild b/include/linux/netfilter/Kbuild index 48767cd16453..9d40effe7ca7 100644 --- a/include/linux/netfilter/Kbuild +++ b/include/linux/netfilter/Kbuild | |||
| @@ -1,13 +1,21 @@ | |||
| 1 | header-y += nf_conntrack_common.h | ||
| 2 | header-y += nf_conntrack_ftp.h | ||
| 1 | header-y += nf_conntrack_sctp.h | 3 | header-y += nf_conntrack_sctp.h |
| 4 | header-y += nf_conntrack_tcp.h | ||
| 2 | header-y += nf_conntrack_tuple_common.h | 5 | header-y += nf_conntrack_tuple_common.h |
| 6 | header-y += nfnetlink.h | ||
| 7 | header-y += nfnetlink_compat.h | ||
| 3 | header-y += nfnetlink_conntrack.h | 8 | header-y += nfnetlink_conntrack.h |
| 4 | header-y += nfnetlink_log.h | 9 | header-y += nfnetlink_log.h |
| 5 | header-y += nfnetlink_queue.h | 10 | header-y += nfnetlink_queue.h |
| 11 | header-y += x_tables.h | ||
| 12 | header-y += xt_CHECKSUM.h | ||
| 6 | header-y += xt_CLASSIFY.h | 13 | header-y += xt_CLASSIFY.h |
| 7 | header-y += xt_CONNMARK.h | 14 | header-y += xt_CONNMARK.h |
| 8 | header-y += xt_CONNSECMARK.h | 15 | header-y += xt_CONNSECMARK.h |
| 9 | header-y += xt_CT.h | 16 | header-y += xt_CT.h |
| 10 | header-y += xt_DSCP.h | 17 | header-y += xt_DSCP.h |
| 18 | header-y += xt_IDLETIMER.h | ||
| 11 | header-y += xt_LED.h | 19 | header-y += xt_LED.h |
| 12 | header-y += xt_MARK.h | 20 | header-y += xt_MARK.h |
| 13 | header-y += xt_NFLOG.h | 21 | header-y += xt_NFLOG.h |
| @@ -18,18 +26,20 @@ header-y += xt_TCPMSS.h | |||
| 18 | header-y += xt_TCPOPTSTRIP.h | 26 | header-y += xt_TCPOPTSTRIP.h |
| 19 | header-y += xt_TEE.h | 27 | header-y += xt_TEE.h |
| 20 | header-y += xt_TPROXY.h | 28 | header-y += xt_TPROXY.h |
| 29 | header-y += xt_cluster.h | ||
| 21 | header-y += xt_comment.h | 30 | header-y += xt_comment.h |
| 22 | header-y += xt_connbytes.h | 31 | header-y += xt_connbytes.h |
| 23 | header-y += xt_connlimit.h | 32 | header-y += xt_connlimit.h |
| 24 | header-y += xt_connmark.h | 33 | header-y += xt_connmark.h |
| 25 | header-y += xt_conntrack.h | 34 | header-y += xt_conntrack.h |
| 26 | header-y += xt_cluster.h | 35 | header-y += xt_cpu.h |
| 27 | header-y += xt_dccp.h | 36 | header-y += xt_dccp.h |
| 28 | header-y += xt_dscp.h | 37 | header-y += xt_dscp.h |
| 29 | header-y += xt_esp.h | 38 | header-y += xt_esp.h |
| 30 | header-y += xt_hashlimit.h | 39 | header-y += xt_hashlimit.h |
| 31 | header-y += xt_iprange.h | ||
| 32 | header-y += xt_helper.h | 40 | header-y += xt_helper.h |
| 41 | header-y += xt_iprange.h | ||
| 42 | header-y += xt_ipvs.h | ||
| 33 | header-y += xt_length.h | 43 | header-y += xt_length.h |
| 34 | header-y += xt_limit.h | 44 | header-y += xt_limit.h |
| 35 | header-y += xt_mac.h | 45 | header-y += xt_mac.h |
| @@ -37,7 +47,9 @@ header-y += xt_mark.h | |||
| 37 | header-y += xt_multiport.h | 47 | header-y += xt_multiport.h |
| 38 | header-y += xt_osf.h | 48 | header-y += xt_osf.h |
| 39 | header-y += xt_owner.h | 49 | header-y += xt_owner.h |
| 50 | header-y += xt_physdev.h | ||
| 40 | header-y += xt_pkttype.h | 51 | header-y += xt_pkttype.h |
| 52 | header-y += xt_policy.h | ||
| 41 | header-y += xt_quota.h | 53 | header-y += xt_quota.h |
| 42 | header-y += xt_rateest.h | 54 | header-y += xt_rateest.h |
| 43 | header-y += xt_realm.h | 55 | header-y += xt_realm.h |
| @@ -50,12 +62,3 @@ header-y += xt_tcpmss.h | |||
| 50 | header-y += xt_tcpudp.h | 62 | header-y += xt_tcpudp.h |
| 51 | header-y += xt_time.h | 63 | header-y += xt_time.h |
| 52 | header-y += xt_u32.h | 64 | header-y += xt_u32.h |
| 53 | |||
| 54 | unifdef-y += nf_conntrack_common.h | ||
| 55 | unifdef-y += nf_conntrack_ftp.h | ||
| 56 | unifdef-y += nf_conntrack_tcp.h | ||
| 57 | unifdef-y += nfnetlink.h | ||
| 58 | unifdef-y += nfnetlink_compat.h | ||
| 59 | unifdef-y += x_tables.h | ||
| 60 | unifdef-y += xt_physdev.h | ||
| 61 | unifdef-y += xt_policy.h | ||
diff --git a/include/linux/netfilter/nf_conntrack_common.h b/include/linux/netfilter/nf_conntrack_common.h index 14e6d32002c4..50cdc2559a5a 100644 --- a/include/linux/netfilter/nf_conntrack_common.h +++ b/include/linux/netfilter/nf_conntrack_common.h | |||
| @@ -76,6 +76,10 @@ enum ip_conntrack_status { | |||
| 76 | /* Conntrack is a template */ | 76 | /* Conntrack is a template */ |
| 77 | IPS_TEMPLATE_BIT = 11, | 77 | IPS_TEMPLATE_BIT = 11, |
| 78 | IPS_TEMPLATE = (1 << IPS_TEMPLATE_BIT), | 78 | IPS_TEMPLATE = (1 << IPS_TEMPLATE_BIT), |
| 79 | |||
| 80 | /* Conntrack is a fake untracked entry */ | ||
| 81 | IPS_UNTRACKED_BIT = 12, | ||
| 82 | IPS_UNTRACKED = (1 << IPS_UNTRACKED_BIT), | ||
| 79 | }; | 83 | }; |
| 80 | 84 | ||
| 81 | /* Connection tracking event types */ | 85 | /* Connection tracking event types */ |
| @@ -94,8 +98,14 @@ enum ip_conntrack_events { | |||
| 94 | 98 | ||
| 95 | enum ip_conntrack_expect_events { | 99 | enum ip_conntrack_expect_events { |
| 96 | IPEXP_NEW, /* new expectation */ | 100 | IPEXP_NEW, /* new expectation */ |
| 101 | IPEXP_DESTROY, /* destroyed expectation */ | ||
| 97 | }; | 102 | }; |
| 98 | 103 | ||
| 104 | /* expectation flags */ | ||
| 105 | #define NF_CT_EXPECT_PERMANENT 0x1 | ||
| 106 | #define NF_CT_EXPECT_INACTIVE 0x2 | ||
| 107 | #define NF_CT_EXPECT_USERSPACE 0x4 | ||
| 108 | |||
| 99 | #ifdef __KERNEL__ | 109 | #ifdef __KERNEL__ |
| 100 | struct ip_conntrack_stat { | 110 | struct ip_conntrack_stat { |
| 101 | unsigned int searched; | 111 | unsigned int searched; |
diff --git a/include/linux/netfilter/nf_conntrack_sip.h b/include/linux/netfilter/nf_conntrack_sip.h index ff8cfbcf3b81..0ce91d56a5f2 100644 --- a/include/linux/netfilter/nf_conntrack_sip.h +++ b/include/linux/netfilter/nf_conntrack_sip.h | |||
| @@ -89,6 +89,7 @@ enum sip_header_types { | |||
| 89 | SIP_HDR_VIA_TCP, | 89 | SIP_HDR_VIA_TCP, |
| 90 | SIP_HDR_EXPIRES, | 90 | SIP_HDR_EXPIRES, |
| 91 | SIP_HDR_CONTENT_LENGTH, | 91 | SIP_HDR_CONTENT_LENGTH, |
| 92 | SIP_HDR_CALL_ID, | ||
| 92 | }; | 93 | }; |
| 93 | 94 | ||
| 94 | enum sdp_header_types { | 95 | enum sdp_header_types { |
diff --git a/include/linux/netfilter/nfnetlink_conntrack.h b/include/linux/netfilter/nfnetlink_conntrack.h index 9ed534c991b9..19711e3ffd42 100644 --- a/include/linux/netfilter/nfnetlink_conntrack.h +++ b/include/linux/netfilter/nfnetlink_conntrack.h | |||
| @@ -39,8 +39,9 @@ enum ctattr_type { | |||
| 39 | CTA_TUPLE_MASTER, | 39 | CTA_TUPLE_MASTER, |
| 40 | CTA_NAT_SEQ_ADJ_ORIG, | 40 | CTA_NAT_SEQ_ADJ_ORIG, |
| 41 | CTA_NAT_SEQ_ADJ_REPLY, | 41 | CTA_NAT_SEQ_ADJ_REPLY, |
| 42 | CTA_SECMARK, | 42 | CTA_SECMARK, /* obsolete */ |
| 43 | CTA_ZONE, | 43 | CTA_ZONE, |
| 44 | CTA_SECCTX, | ||
| 44 | __CTA_MAX | 45 | __CTA_MAX |
| 45 | }; | 46 | }; |
| 46 | #define CTA_MAX (__CTA_MAX - 1) | 47 | #define CTA_MAX (__CTA_MAX - 1) |
| @@ -161,6 +162,7 @@ enum ctattr_expect { | |||
| 161 | CTA_EXPECT_ID, | 162 | CTA_EXPECT_ID, |
| 162 | CTA_EXPECT_HELP_NAME, | 163 | CTA_EXPECT_HELP_NAME, |
| 163 | CTA_EXPECT_ZONE, | 164 | CTA_EXPECT_ZONE, |
| 165 | CTA_EXPECT_FLAGS, | ||
| 164 | __CTA_EXPECT_MAX | 166 | __CTA_EXPECT_MAX |
| 165 | }; | 167 | }; |
| 166 | #define CTA_EXPECT_MAX (__CTA_EXPECT_MAX - 1) | 168 | #define CTA_EXPECT_MAX (__CTA_EXPECT_MAX - 1) |
| @@ -172,4 +174,11 @@ enum ctattr_help { | |||
| 172 | }; | 174 | }; |
| 173 | #define CTA_HELP_MAX (__CTA_HELP_MAX - 1) | 175 | #define CTA_HELP_MAX (__CTA_HELP_MAX - 1) |
| 174 | 176 | ||
| 177 | enum ctattr_secctx { | ||
| 178 | CTA_SECCTX_UNSPEC, | ||
| 179 | CTA_SECCTX_NAME, | ||
| 180 | __CTA_SECCTX_MAX | ||
| 181 | }; | ||
| 182 | #define CTA_SECCTX_MAX (__CTA_SECCTX_MAX - 1) | ||
| 183 | |||
| 175 | #endif /* _IPCONNTRACK_NETLINK_H */ | 184 | #endif /* _IPCONNTRACK_NETLINK_H */ |
diff --git a/include/linux/netfilter/nfnetlink_log.h b/include/linux/netfilter/nfnetlink_log.h index d3bab7a2c9b7..ea9b8d380527 100644 --- a/include/linux/netfilter/nfnetlink_log.h +++ b/include/linux/netfilter/nfnetlink_log.h | |||
| @@ -89,6 +89,7 @@ enum nfulnl_attr_config { | |||
| 89 | #define NFULNL_COPY_NONE 0x00 | 89 | #define NFULNL_COPY_NONE 0x00 |
| 90 | #define NFULNL_COPY_META 0x01 | 90 | #define NFULNL_COPY_META 0x01 |
| 91 | #define NFULNL_COPY_PACKET 0x02 | 91 | #define NFULNL_COPY_PACKET 0x02 |
| 92 | /* 0xff is reserved, don't use it for new copy modes. */ | ||
| 92 | 93 | ||
| 93 | #define NFULNL_CFG_F_SEQ 0x0001 | 94 | #define NFULNL_CFG_F_SEQ 0x0001 |
| 94 | #define NFULNL_CFG_F_SEQ_GLOBAL 0x0002 | 95 | #define NFULNL_CFG_F_SEQ_GLOBAL 0x0002 |
diff --git a/include/linux/netfilter/x_tables.h b/include/linux/netfilter/x_tables.h index 24e5d01d27d0..742bec051440 100644 --- a/include/linux/netfilter/x_tables.h +++ b/include/linux/netfilter/x_tables.h | |||
| @@ -66,6 +66,11 @@ struct xt_standard_target { | |||
| 66 | int verdict; | 66 | int verdict; |
| 67 | }; | 67 | }; |
| 68 | 68 | ||
| 69 | struct xt_error_target { | ||
| 70 | struct xt_entry_target target; | ||
| 71 | char errorname[XT_FUNCTION_MAXNAMELEN]; | ||
| 72 | }; | ||
| 73 | |||
| 69 | /* The argument to IPT_SO_GET_REVISION_*. Returns highest revision | 74 | /* The argument to IPT_SO_GET_REVISION_*. Returns highest revision |
| 70 | * kernel supports, if >= revision. */ | 75 | * kernel supports, if >= revision. */ |
| 71 | struct xt_get_revision { | 76 | struct xt_get_revision { |
diff --git a/include/linux/netfilter/xt_CHECKSUM.h b/include/linux/netfilter/xt_CHECKSUM.h new file mode 100644 index 000000000000..9a2e4661654e --- /dev/null +++ b/include/linux/netfilter/xt_CHECKSUM.h | |||
| @@ -0,0 +1,20 @@ | |||
| 1 | /* Header file for iptables ipt_CHECKSUM target | ||
| 2 | * | ||
| 3 | * (C) 2002 by Harald Welte <laforge@gnumonks.org> | ||
| 4 | * (C) 2010 Red Hat Inc | ||
| 5 | * Author: Michael S. Tsirkin <mst@redhat.com> | ||
| 6 | * | ||
| 7 | * This software is distributed under GNU GPL v2, 1991 | ||
| 8 | */ | ||
| 9 | #ifndef _XT_CHECKSUM_TARGET_H | ||
| 10 | #define _XT_CHECKSUM_TARGET_H | ||
| 11 | |||
| 12 | #include <linux/types.h> | ||
| 13 | |||
| 14 | #define XT_CHECKSUM_OP_FILL 0x01 /* fill in checksum in IP header */ | ||
| 15 | |||
| 16 | struct xt_CHECKSUM_info { | ||
| 17 | __u8 operation; /* bitset of operations */ | ||
| 18 | }; | ||
| 19 | |||
| 20 | #endif /* _XT_CHECKSUM_TARGET_H */ | ||
diff --git a/include/linux/netfilter/xt_IDLETIMER.h b/include/linux/netfilter/xt_IDLETIMER.h new file mode 100644 index 000000000000..208ae9387331 --- /dev/null +++ b/include/linux/netfilter/xt_IDLETIMER.h | |||
| @@ -0,0 +1,45 @@ | |||
| 1 | /* | ||
| 2 | * linux/include/linux/netfilter/xt_IDLETIMER.h | ||
| 3 | * | ||
| 4 | * Header file for Xtables timer target module. | ||
| 5 | * | ||
| 6 | * Copyright (C) 2004, 2010 Nokia Corporation | ||
| 7 | * Written by Timo Teras <ext-timo.teras@nokia.com> | ||
| 8 | * | ||
| 9 | * Converted to x_tables and forward-ported to 2.6.34 | ||
| 10 | * by Luciano Coelho <luciano.coelho@nokia.com> | ||
| 11 | * | ||
| 12 | * Contact: Luciano Coelho <luciano.coelho@nokia.com> | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or | ||
| 15 | * modify it under the terms of the GNU General Public License | ||
| 16 | * version 2 as published by the Free Software Foundation. | ||
| 17 | * | ||
| 18 | * This program is distributed in the hope that it will be useful, but | ||
| 19 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 20 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
| 21 | * General Public License for more details. | ||
| 22 | * | ||
| 23 | * You should have received a copy of the GNU General Public License | ||
| 24 | * along with this program; if not, write to the Free Software | ||
| 25 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA | ||
| 26 | * 02110-1301 USA | ||
| 27 | */ | ||
| 28 | |||
| 29 | #ifndef _XT_IDLETIMER_H | ||
| 30 | #define _XT_IDLETIMER_H | ||
| 31 | |||
| 32 | #include <linux/types.h> | ||
| 33 | |||
| 34 | #define MAX_IDLETIMER_LABEL_SIZE 28 | ||
| 35 | |||
| 36 | struct idletimer_tg_info { | ||
| 37 | __u32 timeout; | ||
| 38 | |||
| 39 | char label[MAX_IDLETIMER_LABEL_SIZE]; | ||
| 40 | |||
| 41 | /* for kernel module internal use only */ | ||
| 42 | struct idletimer_tg *timer __attribute__((aligned(8))); | ||
| 43 | }; | ||
| 44 | |||
| 45 | #endif | ||
diff --git a/include/linux/netfilter/xt_SECMARK.h b/include/linux/netfilter/xt_SECMARK.h index 6fcd3448b186..989092bd6274 100644 --- a/include/linux/netfilter/xt_SECMARK.h +++ b/include/linux/netfilter/xt_SECMARK.h | |||
| @@ -11,18 +11,12 @@ | |||
| 11 | * packets are being marked for. | 11 | * packets are being marked for. |
| 12 | */ | 12 | */ |
| 13 | #define SECMARK_MODE_SEL 0x01 /* SELinux */ | 13 | #define SECMARK_MODE_SEL 0x01 /* SELinux */ |
| 14 | #define SECMARK_SELCTX_MAX 256 | 14 | #define SECMARK_SECCTX_MAX 256 |
| 15 | |||
| 16 | struct xt_secmark_target_selinux_info { | ||
| 17 | __u32 selsid; | ||
| 18 | char selctx[SECMARK_SELCTX_MAX]; | ||
| 19 | }; | ||
| 20 | 15 | ||
| 21 | struct xt_secmark_target_info { | 16 | struct xt_secmark_target_info { |
| 22 | __u8 mode; | 17 | __u8 mode; |
| 23 | union { | 18 | __u32 secid; |
| 24 | struct xt_secmark_target_selinux_info sel; | 19 | char secctx[SECMARK_SECCTX_MAX]; |
| 25 | } u; | ||
| 26 | }; | 20 | }; |
| 27 | 21 | ||
| 28 | #endif /*_XT_SECMARK_H_target */ | 22 | #endif /*_XT_SECMARK_H_target */ |
diff --git a/include/linux/netfilter/xt_TPROXY.h b/include/linux/netfilter/xt_TPROXY.h index 152e8f97132b..3f3d69361289 100644 --- a/include/linux/netfilter/xt_TPROXY.h +++ b/include/linux/netfilter/xt_TPROXY.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _XT_TPROXY_H_target | 1 | #ifndef _XT_TPROXY_H |
| 2 | #define _XT_TPROXY_H_target | 2 | #define _XT_TPROXY_H |
| 3 | 3 | ||
| 4 | /* TPROXY target is capable of marking the packet to perform | 4 | /* TPROXY target is capable of marking the packet to perform |
| 5 | * redirection. We can get rid of that whenever we get support for | 5 | * redirection. We can get rid of that whenever we get support for |
| @@ -11,4 +11,11 @@ struct xt_tproxy_target_info { | |||
| 11 | __be16 lport; | 11 | __be16 lport; |
| 12 | }; | 12 | }; |
| 13 | 13 | ||
| 14 | #endif /* _XT_TPROXY_H_target */ | 14 | struct xt_tproxy_target_info_v1 { |
| 15 | u_int32_t mark_mask; | ||
| 16 | u_int32_t mark_value; | ||
| 17 | union nf_inet_addr laddr; | ||
| 18 | __be16 lport; | ||
| 19 | }; | ||
| 20 | |||
| 21 | #endif /* _XT_TPROXY_H */ | ||
diff --git a/include/linux/netfilter/xt_cpu.h b/include/linux/netfilter/xt_cpu.h new file mode 100644 index 000000000000..93c7f11d8f42 --- /dev/null +++ b/include/linux/netfilter/xt_cpu.h | |||
| @@ -0,0 +1,11 @@ | |||
| 1 | #ifndef _XT_CPU_H | ||
| 2 | #define _XT_CPU_H | ||
| 3 | |||
| 4 | #include <linux/types.h> | ||
| 5 | |||
| 6 | struct xt_cpu_info { | ||
| 7 | __u32 cpu; | ||
| 8 | __u32 invert; | ||
| 9 | }; | ||
| 10 | |||
| 11 | #endif /*_XT_CPU_H*/ | ||
diff --git a/include/linux/netfilter/xt_ipvs.h b/include/linux/netfilter/xt_ipvs.h new file mode 100644 index 000000000000..eff34ac18808 --- /dev/null +++ b/include/linux/netfilter/xt_ipvs.h | |||
| @@ -0,0 +1,29 @@ | |||
| 1 | #ifndef _XT_IPVS_H | ||
| 2 | #define _XT_IPVS_H | ||
| 3 | |||
| 4 | #include <linux/types.h> | ||
| 5 | |||
| 6 | enum { | ||
| 7 | XT_IPVS_IPVS_PROPERTY = 1 << 0, /* all other options imply this one */ | ||
| 8 | XT_IPVS_PROTO = 1 << 1, | ||
| 9 | XT_IPVS_VADDR = 1 << 2, | ||
| 10 | XT_IPVS_VPORT = 1 << 3, | ||
| 11 | XT_IPVS_DIR = 1 << 4, | ||
| 12 | XT_IPVS_METHOD = 1 << 5, | ||
| 13 | XT_IPVS_VPORTCTL = 1 << 6, | ||
| 14 | XT_IPVS_MASK = (1 << 7) - 1, | ||
| 15 | XT_IPVS_ONCE_MASK = XT_IPVS_MASK & ~XT_IPVS_IPVS_PROPERTY | ||
| 16 | }; | ||
| 17 | |||
| 18 | struct xt_ipvs_mtinfo { | ||
| 19 | union nf_inet_addr vaddr, vmask; | ||
| 20 | __be16 vport; | ||
| 21 | __u8 l4proto; | ||
| 22 | __u8 fwd_method; | ||
| 23 | __be16 vportctl; | ||
| 24 | |||
| 25 | __u8 invert; | ||
| 26 | __u8 bitmask; | ||
| 27 | }; | ||
| 28 | |||
| 29 | #endif /* _XT_IPVS_H */ | ||
diff --git a/include/linux/netfilter/xt_quota.h b/include/linux/netfilter/xt_quota.h index 8dc89dfc1361..b0d28c659ab7 100644 --- a/include/linux/netfilter/xt_quota.h +++ b/include/linux/netfilter/xt_quota.h | |||
| @@ -11,9 +11,9 @@ struct xt_quota_priv; | |||
| 11 | struct xt_quota_info { | 11 | struct xt_quota_info { |
| 12 | u_int32_t flags; | 12 | u_int32_t flags; |
| 13 | u_int32_t pad; | 13 | u_int32_t pad; |
| 14 | aligned_u64 quota; | ||
| 14 | 15 | ||
| 15 | /* Used internally by the kernel */ | 16 | /* Used internally by the kernel */ |
| 16 | aligned_u64 quota; | ||
| 17 | struct xt_quota_priv *master; | 17 | struct xt_quota_priv *master; |
| 18 | }; | 18 | }; |
| 19 | 19 | ||
diff --git a/include/linux/netfilter_arp/Kbuild b/include/linux/netfilter_arp/Kbuild index 4f13dfcb92ea..b27439c71037 100644 --- a/include/linux/netfilter_arp/Kbuild +++ b/include/linux/netfilter_arp/Kbuild | |||
| @@ -1,3 +1,2 @@ | |||
| 1 | header-y += arp_tables.h | ||
| 1 | header-y += arpt_mangle.h | 2 | header-y += arpt_mangle.h |
| 2 | |||
| 3 | unifdef-y += arp_tables.h | ||
diff --git a/include/linux/netfilter_arp/arp_tables.h b/include/linux/netfilter_arp/arp_tables.h index e9948c0560f6..adbf4bff87ed 100644 --- a/include/linux/netfilter_arp/arp_tables.h +++ b/include/linux/netfilter_arp/arp_tables.h | |||
| @@ -21,8 +21,21 @@ | |||
| 21 | 21 | ||
| 22 | #include <linux/netfilter/x_tables.h> | 22 | #include <linux/netfilter/x_tables.h> |
| 23 | 23 | ||
| 24 | #ifndef __KERNEL__ | ||
| 24 | #define ARPT_FUNCTION_MAXNAMELEN XT_FUNCTION_MAXNAMELEN | 25 | #define ARPT_FUNCTION_MAXNAMELEN XT_FUNCTION_MAXNAMELEN |
| 25 | #define ARPT_TABLE_MAXNAMELEN XT_TABLE_MAXNAMELEN | 26 | #define ARPT_TABLE_MAXNAMELEN XT_TABLE_MAXNAMELEN |
| 27 | #define arpt_entry_target xt_entry_target | ||
| 28 | #define arpt_standard_target xt_standard_target | ||
| 29 | #define arpt_error_target xt_error_target | ||
| 30 | #define ARPT_CONTINUE XT_CONTINUE | ||
| 31 | #define ARPT_RETURN XT_RETURN | ||
| 32 | #define arpt_counters_info xt_counters_info | ||
| 33 | #define arpt_counters xt_counters | ||
| 34 | #define ARPT_STANDARD_TARGET XT_STANDARD_TARGET | ||
| 35 | #define ARPT_ERROR_TARGET XT_ERROR_TARGET | ||
| 36 | #define ARPT_ENTRY_ITERATE(entries, size, fn, args...) \ | ||
| 37 | XT_ENTRY_ITERATE(struct arpt_entry, entries, size, fn, ## args) | ||
| 38 | #endif | ||
| 26 | 39 | ||
| 27 | #define ARPT_DEV_ADDR_LEN_MAX 16 | 40 | #define ARPT_DEV_ADDR_LEN_MAX 16 |
| 28 | 41 | ||
| @@ -63,9 +76,6 @@ struct arpt_arp { | |||
| 63 | u_int16_t invflags; | 76 | u_int16_t invflags; |
| 64 | }; | 77 | }; |
| 65 | 78 | ||
| 66 | #define arpt_entry_target xt_entry_target | ||
| 67 | #define arpt_standard_target xt_standard_target | ||
| 68 | |||
| 69 | /* Values for "flag" field in struct arpt_ip (general arp structure). | 79 | /* Values for "flag" field in struct arpt_ip (general arp structure). |
| 70 | * No flags defined yet. | 80 | * No flags defined yet. |
| 71 | */ | 81 | */ |
| @@ -125,16 +135,10 @@ struct arpt_entry | |||
| 125 | #define ARPT_SO_GET_REVISION_TARGET (ARPT_BASE_CTL + 3) | 135 | #define ARPT_SO_GET_REVISION_TARGET (ARPT_BASE_CTL + 3) |
| 126 | #define ARPT_SO_GET_MAX (ARPT_SO_GET_REVISION_TARGET) | 136 | #define ARPT_SO_GET_MAX (ARPT_SO_GET_REVISION_TARGET) |
| 127 | 137 | ||
| 128 | /* CONTINUE verdict for targets */ | ||
| 129 | #define ARPT_CONTINUE XT_CONTINUE | ||
| 130 | |||
| 131 | /* For standard target */ | ||
| 132 | #define ARPT_RETURN XT_RETURN | ||
| 133 | |||
| 134 | /* The argument to ARPT_SO_GET_INFO */ | 138 | /* The argument to ARPT_SO_GET_INFO */ |
| 135 | struct arpt_getinfo { | 139 | struct arpt_getinfo { |
| 136 | /* Which table: caller fills this in. */ | 140 | /* Which table: caller fills this in. */ |
| 137 | char name[ARPT_TABLE_MAXNAMELEN]; | 141 | char name[XT_TABLE_MAXNAMELEN]; |
| 138 | 142 | ||
| 139 | /* Kernel fills these in. */ | 143 | /* Kernel fills these in. */ |
| 140 | /* Which hook entry points are valid: bitmask */ | 144 | /* Which hook entry points are valid: bitmask */ |
| @@ -156,7 +160,7 @@ struct arpt_getinfo { | |||
| 156 | /* The argument to ARPT_SO_SET_REPLACE. */ | 160 | /* The argument to ARPT_SO_SET_REPLACE. */ |
| 157 | struct arpt_replace { | 161 | struct arpt_replace { |
| 158 | /* Which table. */ | 162 | /* Which table. */ |
| 159 | char name[ARPT_TABLE_MAXNAMELEN]; | 163 | char name[XT_TABLE_MAXNAMELEN]; |
| 160 | 164 | ||
| 161 | /* Which hook entry points are valid: bitmask. You can't | 165 | /* Which hook entry points are valid: bitmask. You can't |
| 162 | change this. */ | 166 | change this. */ |
| @@ -184,14 +188,10 @@ struct arpt_replace { | |||
| 184 | struct arpt_entry entries[0]; | 188 | struct arpt_entry entries[0]; |
| 185 | }; | 189 | }; |
| 186 | 190 | ||
| 187 | /* The argument to ARPT_SO_ADD_COUNTERS. */ | ||
| 188 | #define arpt_counters_info xt_counters_info | ||
| 189 | #define arpt_counters xt_counters | ||
| 190 | |||
| 191 | /* The argument to ARPT_SO_GET_ENTRIES. */ | 191 | /* The argument to ARPT_SO_GET_ENTRIES. */ |
| 192 | struct arpt_get_entries { | 192 | struct arpt_get_entries { |
| 193 | /* Which table: user fills this in. */ | 193 | /* Which table: user fills this in. */ |
| 194 | char name[ARPT_TABLE_MAXNAMELEN]; | 194 | char name[XT_TABLE_MAXNAMELEN]; |
| 195 | 195 | ||
| 196 | /* User fills this in: total entry size. */ | 196 | /* User fills this in: total entry size. */ |
| 197 | unsigned int size; | 197 | unsigned int size; |
| @@ -200,23 +200,12 @@ struct arpt_get_entries { | |||
| 200 | struct arpt_entry entrytable[0]; | 200 | struct arpt_entry entrytable[0]; |
| 201 | }; | 201 | }; |
| 202 | 202 | ||
| 203 | /* Standard return verdict, or do jump. */ | ||
| 204 | #define ARPT_STANDARD_TARGET XT_STANDARD_TARGET | ||
| 205 | /* Error verdict. */ | ||
| 206 | #define ARPT_ERROR_TARGET XT_ERROR_TARGET | ||
| 207 | |||
| 208 | /* Helper functions */ | 203 | /* Helper functions */ |
| 209 | static __inline__ struct arpt_entry_target *arpt_get_target(struct arpt_entry *e) | 204 | static __inline__ struct xt_entry_target *arpt_get_target(struct arpt_entry *e) |
| 210 | { | 205 | { |
| 211 | return (void *)e + e->target_offset; | 206 | return (void *)e + e->target_offset; |
| 212 | } | 207 | } |
| 213 | 208 | ||
| 214 | #ifndef __KERNEL__ | ||
| 215 | /* fn returns 0 to continue iteration */ | ||
| 216 | #define ARPT_ENTRY_ITERATE(entries, size, fn, args...) \ | ||
| 217 | XT_ENTRY_ITERATE(struct arpt_entry, entries, size, fn, ## args) | ||
| 218 | #endif | ||
| 219 | |||
| 220 | /* | 209 | /* |
| 221 | * Main firewall chains definitions and global var's definitions. | 210 | * Main firewall chains definitions and global var's definitions. |
| 222 | */ | 211 | */ |
| @@ -225,17 +214,12 @@ static __inline__ struct arpt_entry_target *arpt_get_target(struct arpt_entry *e | |||
| 225 | /* Standard entry. */ | 214 | /* Standard entry. */ |
| 226 | struct arpt_standard { | 215 | struct arpt_standard { |
| 227 | struct arpt_entry entry; | 216 | struct arpt_entry entry; |
| 228 | struct arpt_standard_target target; | 217 | struct xt_standard_target target; |
| 229 | }; | ||
| 230 | |||
| 231 | struct arpt_error_target { | ||
| 232 | struct arpt_entry_target target; | ||
| 233 | char errorname[ARPT_FUNCTION_MAXNAMELEN]; | ||
| 234 | }; | 218 | }; |
| 235 | 219 | ||
| 236 | struct arpt_error { | 220 | struct arpt_error { |
| 237 | struct arpt_entry entry; | 221 | struct arpt_entry entry; |
| 238 | struct arpt_error_target target; | 222 | struct xt_error_target target; |
| 239 | }; | 223 | }; |
| 240 | 224 | ||
| 241 | #define ARPT_ENTRY_INIT(__size) \ | 225 | #define ARPT_ENTRY_INIT(__size) \ |
| @@ -247,16 +231,16 @@ struct arpt_error { | |||
| 247 | #define ARPT_STANDARD_INIT(__verdict) \ | 231 | #define ARPT_STANDARD_INIT(__verdict) \ |
| 248 | { \ | 232 | { \ |
| 249 | .entry = ARPT_ENTRY_INIT(sizeof(struct arpt_standard)), \ | 233 | .entry = ARPT_ENTRY_INIT(sizeof(struct arpt_standard)), \ |
| 250 | .target = XT_TARGET_INIT(ARPT_STANDARD_TARGET, \ | 234 | .target = XT_TARGET_INIT(XT_STANDARD_TARGET, \ |
| 251 | sizeof(struct arpt_standard_target)), \ | 235 | sizeof(struct xt_standard_target)), \ |
| 252 | .target.verdict = -(__verdict) - 1, \ | 236 | .target.verdict = -(__verdict) - 1, \ |
| 253 | } | 237 | } |
| 254 | 238 | ||
| 255 | #define ARPT_ERROR_INIT \ | 239 | #define ARPT_ERROR_INIT \ |
| 256 | { \ | 240 | { \ |
| 257 | .entry = ARPT_ENTRY_INIT(sizeof(struct arpt_error)), \ | 241 | .entry = ARPT_ENTRY_INIT(sizeof(struct arpt_error)), \ |
| 258 | .target = XT_TARGET_INIT(ARPT_ERROR_TARGET, \ | 242 | .target = XT_TARGET_INIT(XT_ERROR_TARGET, \ |
| 259 | sizeof(struct arpt_error_target)), \ | 243 | sizeof(struct xt_error_target)), \ |
| 260 | .target.errorname = "ERROR", \ | 244 | .target.errorname = "ERROR", \ |
| 261 | } | 245 | } |
| 262 | 246 | ||
| @@ -271,8 +255,6 @@ extern unsigned int arpt_do_table(struct sk_buff *skb, | |||
| 271 | const struct net_device *out, | 255 | const struct net_device *out, |
| 272 | struct xt_table *table); | 256 | struct xt_table *table); |
| 273 | 257 | ||
| 274 | #define ARPT_ALIGN(s) XT_ALIGN(s) | ||
| 275 | |||
| 276 | #ifdef CONFIG_COMPAT | 258 | #ifdef CONFIG_COMPAT |
| 277 | #include <net/compat.h> | 259 | #include <net/compat.h> |
| 278 | 260 | ||
| @@ -285,14 +267,12 @@ struct compat_arpt_entry { | |||
| 285 | unsigned char elems[0]; | 267 | unsigned char elems[0]; |
| 286 | }; | 268 | }; |
| 287 | 269 | ||
| 288 | static inline struct arpt_entry_target * | 270 | static inline struct xt_entry_target * |
| 289 | compat_arpt_get_target(struct compat_arpt_entry *e) | 271 | compat_arpt_get_target(struct compat_arpt_entry *e) |
| 290 | { | 272 | { |
| 291 | return (void *)e + e->target_offset; | 273 | return (void *)e + e->target_offset; |
| 292 | } | 274 | } |
| 293 | 275 | ||
| 294 | #define COMPAT_ARPT_ALIGN(s) COMPAT_XT_ALIGN(s) | ||
| 295 | |||
| 296 | #endif /* CONFIG_COMPAT */ | 276 | #endif /* CONFIG_COMPAT */ |
| 297 | #endif /*__KERNEL__*/ | 277 | #endif /*__KERNEL__*/ |
| 298 | #endif /* _ARPTABLES_H */ | 278 | #endif /* _ARPTABLES_H */ |
diff --git a/include/linux/netfilter_bridge/Kbuild b/include/linux/netfilter_bridge/Kbuild index 76ff4c47d8c4..e48f1a3f5a4a 100644 --- a/include/linux/netfilter_bridge/Kbuild +++ b/include/linux/netfilter_bridge/Kbuild | |||
| @@ -1,17 +1,18 @@ | |||
| 1 | header-y += ebt_802_3.h | ||
| 1 | header-y += ebt_among.h | 2 | header-y += ebt_among.h |
| 2 | header-y += ebt_arp.h | 3 | header-y += ebt_arp.h |
| 3 | header-y += ebt_arpreply.h | 4 | header-y += ebt_arpreply.h |
| 4 | header-y += ebt_ip.h | 5 | header-y += ebt_ip.h |
| 6 | header-y += ebt_ip6.h | ||
| 5 | header-y += ebt_limit.h | 7 | header-y += ebt_limit.h |
| 6 | header-y += ebt_log.h | 8 | header-y += ebt_log.h |
| 7 | header-y += ebt_mark_m.h | 9 | header-y += ebt_mark_m.h |
| 8 | header-y += ebt_mark_t.h | 10 | header-y += ebt_mark_t.h |
| 9 | header-y += ebt_nat.h | 11 | header-y += ebt_nat.h |
| 12 | header-y += ebt_nflog.h | ||
| 10 | header-y += ebt_pkttype.h | 13 | header-y += ebt_pkttype.h |
| 11 | header-y += ebt_redirect.h | 14 | header-y += ebt_redirect.h |
| 12 | header-y += ebt_stp.h | 15 | header-y += ebt_stp.h |
| 13 | header-y += ebt_ulog.h | 16 | header-y += ebt_ulog.h |
| 14 | header-y += ebt_vlan.h | 17 | header-y += ebt_vlan.h |
| 15 | 18 | header-y += ebtables.h | |
| 16 | unifdef-y += ebtables.h | ||
| 17 | unifdef-y += ebt_802_3.h | ||
diff --git a/include/linux/netfilter_ipv4/Kbuild b/include/linux/netfilter_ipv4/Kbuild index 431b40761920..f9930c87fff3 100644 --- a/include/linux/netfilter_ipv4/Kbuild +++ b/include/linux/netfilter_ipv4/Kbuild | |||
| @@ -1,3 +1,5 @@ | |||
| 1 | header-y += ip_queue.h | ||
| 2 | header-y += ip_tables.h | ||
| 1 | header-y += ipt_CLUSTERIP.h | 3 | header-y += ipt_CLUSTERIP.h |
| 2 | header-y += ipt_ECN.h | 4 | header-y += ipt_ECN.h |
| 3 | header-y += ipt_LOG.h | 5 | header-y += ipt_LOG.h |
| @@ -10,6 +12,3 @@ header-y += ipt_ah.h | |||
| 10 | header-y += ipt_ecn.h | 12 | header-y += ipt_ecn.h |
| 11 | header-y += ipt_realm.h | 13 | header-y += ipt_realm.h |
| 12 | header-y += ipt_ttl.h | 14 | header-y += ipt_ttl.h |
| 13 | |||
| 14 | unifdef-y += ip_queue.h | ||
| 15 | unifdef-y += ip_tables.h | ||
diff --git a/include/linux/netfilter_ipv4/ip_tables.h b/include/linux/netfilter_ipv4/ip_tables.h index 704a7b6e8169..64a5d95c58e8 100644 --- a/include/linux/netfilter_ipv4/ip_tables.h +++ b/include/linux/netfilter_ipv4/ip_tables.h | |||
| @@ -27,12 +27,49 @@ | |||
| 27 | 27 | ||
| 28 | #include <linux/netfilter/x_tables.h> | 28 | #include <linux/netfilter/x_tables.h> |
| 29 | 29 | ||
| 30 | #ifndef __KERNEL__ | ||
| 30 | #define IPT_FUNCTION_MAXNAMELEN XT_FUNCTION_MAXNAMELEN | 31 | #define IPT_FUNCTION_MAXNAMELEN XT_FUNCTION_MAXNAMELEN |
| 31 | #define IPT_TABLE_MAXNAMELEN XT_TABLE_MAXNAMELEN | 32 | #define IPT_TABLE_MAXNAMELEN XT_TABLE_MAXNAMELEN |
| 32 | #define ipt_match xt_match | 33 | #define ipt_match xt_match |
| 33 | #define ipt_target xt_target | 34 | #define ipt_target xt_target |
| 34 | #define ipt_table xt_table | 35 | #define ipt_table xt_table |
| 35 | #define ipt_get_revision xt_get_revision | 36 | #define ipt_get_revision xt_get_revision |
| 37 | #define ipt_entry_match xt_entry_match | ||
| 38 | #define ipt_entry_target xt_entry_target | ||
| 39 | #define ipt_standard_target xt_standard_target | ||
| 40 | #define ipt_error_target xt_error_target | ||
| 41 | #define ipt_counters xt_counters | ||
| 42 | #define IPT_CONTINUE XT_CONTINUE | ||
| 43 | #define IPT_RETURN XT_RETURN | ||
| 44 | |||
| 45 | /* This group is older than old (iptables < v1.4.0-rc1~89) */ | ||
| 46 | #include <linux/netfilter/xt_tcpudp.h> | ||
| 47 | #define ipt_udp xt_udp | ||
| 48 | #define ipt_tcp xt_tcp | ||
| 49 | #define IPT_TCP_INV_SRCPT XT_TCP_INV_SRCPT | ||
| 50 | #define IPT_TCP_INV_DSTPT XT_TCP_INV_DSTPT | ||
| 51 | #define IPT_TCP_INV_FLAGS XT_TCP_INV_FLAGS | ||
| 52 | #define IPT_TCP_INV_OPTION XT_TCP_INV_OPTION | ||
| 53 | #define IPT_TCP_INV_MASK XT_TCP_INV_MASK | ||
| 54 | #define IPT_UDP_INV_SRCPT XT_UDP_INV_SRCPT | ||
| 55 | #define IPT_UDP_INV_DSTPT XT_UDP_INV_DSTPT | ||
| 56 | #define IPT_UDP_INV_MASK XT_UDP_INV_MASK | ||
| 57 | |||
| 58 | /* The argument to IPT_SO_ADD_COUNTERS. */ | ||
| 59 | #define ipt_counters_info xt_counters_info | ||
| 60 | /* Standard return verdict, or do jump. */ | ||
| 61 | #define IPT_STANDARD_TARGET XT_STANDARD_TARGET | ||
| 62 | /* Error verdict. */ | ||
| 63 | #define IPT_ERROR_TARGET XT_ERROR_TARGET | ||
| 64 | |||
| 65 | /* fn returns 0 to continue iteration */ | ||
| 66 | #define IPT_MATCH_ITERATE(e, fn, args...) \ | ||
| 67 | XT_MATCH_ITERATE(struct ipt_entry, e, fn, ## args) | ||
| 68 | |||
| 69 | /* fn returns 0 to continue iteration */ | ||
| 70 | #define IPT_ENTRY_ITERATE(entries, size, fn, args...) \ | ||
| 71 | XT_ENTRY_ITERATE(struct ipt_entry, entries, size, fn, ## args) | ||
| 72 | #endif | ||
| 36 | 73 | ||
| 37 | /* Yes, Virginia, you have to zero the padding. */ | 74 | /* Yes, Virginia, you have to zero the padding. */ |
| 38 | struct ipt_ip { | 75 | struct ipt_ip { |
| @@ -52,12 +89,6 @@ struct ipt_ip { | |||
| 52 | u_int8_t invflags; | 89 | u_int8_t invflags; |
| 53 | }; | 90 | }; |
| 54 | 91 | ||
| 55 | #define ipt_entry_match xt_entry_match | ||
| 56 | #define ipt_entry_target xt_entry_target | ||
| 57 | #define ipt_standard_target xt_standard_target | ||
| 58 | |||
| 59 | #define ipt_counters xt_counters | ||
| 60 | |||
| 61 | /* Values for "flag" field in struct ipt_ip (general ip structure). */ | 92 | /* Values for "flag" field in struct ipt_ip (general ip structure). */ |
| 62 | #define IPT_F_FRAG 0x01 /* Set if rule is a fragment rule */ | 93 | #define IPT_F_FRAG 0x01 /* Set if rule is a fragment rule */ |
| 63 | #define IPT_F_GOTO 0x02 /* Set if jump is a goto */ | 94 | #define IPT_F_GOTO 0x02 /* Set if jump is a goto */ |
| @@ -116,23 +147,6 @@ struct ipt_entry { | |||
| 116 | #define IPT_SO_GET_REVISION_TARGET (IPT_BASE_CTL + 3) | 147 | #define IPT_SO_GET_REVISION_TARGET (IPT_BASE_CTL + 3) |
| 117 | #define IPT_SO_GET_MAX IPT_SO_GET_REVISION_TARGET | 148 | #define IPT_SO_GET_MAX IPT_SO_GET_REVISION_TARGET |
| 118 | 149 | ||
| 119 | #define IPT_CONTINUE XT_CONTINUE | ||
| 120 | #define IPT_RETURN XT_RETURN | ||
| 121 | |||
| 122 | #include <linux/netfilter/xt_tcpudp.h> | ||
| 123 | #define ipt_udp xt_udp | ||
| 124 | #define ipt_tcp xt_tcp | ||
| 125 | |||
| 126 | #define IPT_TCP_INV_SRCPT XT_TCP_INV_SRCPT | ||
| 127 | #define IPT_TCP_INV_DSTPT XT_TCP_INV_DSTPT | ||
| 128 | #define IPT_TCP_INV_FLAGS XT_TCP_INV_FLAGS | ||
| 129 | #define IPT_TCP_INV_OPTION XT_TCP_INV_OPTION | ||
| 130 | #define IPT_TCP_INV_MASK XT_TCP_INV_MASK | ||
| 131 | |||
| 132 | #define IPT_UDP_INV_SRCPT XT_UDP_INV_SRCPT | ||
| 133 | #define IPT_UDP_INV_DSTPT XT_UDP_INV_DSTPT | ||
| 134 | #define IPT_UDP_INV_MASK XT_UDP_INV_MASK | ||
| 135 | |||
| 136 | /* ICMP matching stuff */ | 150 | /* ICMP matching stuff */ |
| 137 | struct ipt_icmp { | 151 | struct ipt_icmp { |
| 138 | u_int8_t type; /* type to match */ | 152 | u_int8_t type; /* type to match */ |
| @@ -146,7 +160,7 @@ struct ipt_icmp { | |||
| 146 | /* The argument to IPT_SO_GET_INFO */ | 160 | /* The argument to IPT_SO_GET_INFO */ |
| 147 | struct ipt_getinfo { | 161 | struct ipt_getinfo { |
| 148 | /* Which table: caller fills this in. */ | 162 | /* Which table: caller fills this in. */ |
| 149 | char name[IPT_TABLE_MAXNAMELEN]; | 163 | char name[XT_TABLE_MAXNAMELEN]; |
| 150 | 164 | ||
| 151 | /* Kernel fills these in. */ | 165 | /* Kernel fills these in. */ |
| 152 | /* Which hook entry points are valid: bitmask */ | 166 | /* Which hook entry points are valid: bitmask */ |
| @@ -168,7 +182,7 @@ struct ipt_getinfo { | |||
| 168 | /* The argument to IPT_SO_SET_REPLACE. */ | 182 | /* The argument to IPT_SO_SET_REPLACE. */ |
| 169 | struct ipt_replace { | 183 | struct ipt_replace { |
| 170 | /* Which table. */ | 184 | /* Which table. */ |
| 171 | char name[IPT_TABLE_MAXNAMELEN]; | 185 | char name[XT_TABLE_MAXNAMELEN]; |
| 172 | 186 | ||
| 173 | /* Which hook entry points are valid: bitmask. You can't | 187 | /* Which hook entry points are valid: bitmask. You can't |
| 174 | change this. */ | 188 | change this. */ |
| @@ -196,13 +210,10 @@ struct ipt_replace { | |||
| 196 | struct ipt_entry entries[0]; | 210 | struct ipt_entry entries[0]; |
| 197 | }; | 211 | }; |
| 198 | 212 | ||
| 199 | /* The argument to IPT_SO_ADD_COUNTERS. */ | ||
| 200 | #define ipt_counters_info xt_counters_info | ||
| 201 | |||
| 202 | /* The argument to IPT_SO_GET_ENTRIES. */ | 213 | /* The argument to IPT_SO_GET_ENTRIES. */ |
| 203 | struct ipt_get_entries { | 214 | struct ipt_get_entries { |
| 204 | /* Which table: user fills this in. */ | 215 | /* Which table: user fills this in. */ |
| 205 | char name[IPT_TABLE_MAXNAMELEN]; | 216 | char name[XT_TABLE_MAXNAMELEN]; |
| 206 | 217 | ||
| 207 | /* User fills this in: total entry size. */ | 218 | /* User fills this in: total entry size. */ |
| 208 | unsigned int size; | 219 | unsigned int size; |
| @@ -211,28 +222,13 @@ struct ipt_get_entries { | |||
| 211 | struct ipt_entry entrytable[0]; | 222 | struct ipt_entry entrytable[0]; |
| 212 | }; | 223 | }; |
| 213 | 224 | ||
| 214 | /* Standard return verdict, or do jump. */ | ||
| 215 | #define IPT_STANDARD_TARGET XT_STANDARD_TARGET | ||
| 216 | /* Error verdict. */ | ||
| 217 | #define IPT_ERROR_TARGET XT_ERROR_TARGET | ||
| 218 | |||
| 219 | /* Helper functions */ | 225 | /* Helper functions */ |
| 220 | static __inline__ struct ipt_entry_target * | 226 | static __inline__ struct xt_entry_target * |
| 221 | ipt_get_target(struct ipt_entry *e) | 227 | ipt_get_target(struct ipt_entry *e) |
| 222 | { | 228 | { |
| 223 | return (void *)e + e->target_offset; | 229 | return (void *)e + e->target_offset; |
| 224 | } | 230 | } |
| 225 | 231 | ||
| 226 | #ifndef __KERNEL__ | ||
| 227 | /* fn returns 0 to continue iteration */ | ||
| 228 | #define IPT_MATCH_ITERATE(e, fn, args...) \ | ||
| 229 | XT_MATCH_ITERATE(struct ipt_entry, e, fn, ## args) | ||
| 230 | |||
| 231 | /* fn returns 0 to continue iteration */ | ||
| 232 | #define IPT_ENTRY_ITERATE(entries, size, fn, args...) \ | ||
| 233 | XT_ENTRY_ITERATE(struct ipt_entry, entries, size, fn, ## args) | ||
| 234 | #endif | ||
| 235 | |||
| 236 | /* | 232 | /* |
| 237 | * Main firewall chains definitions and global var's definitions. | 233 | * Main firewall chains definitions and global var's definitions. |
| 238 | */ | 234 | */ |
| @@ -249,17 +245,12 @@ extern void ipt_unregister_table(struct net *net, struct xt_table *table); | |||
| 249 | /* Standard entry. */ | 245 | /* Standard entry. */ |
| 250 | struct ipt_standard { | 246 | struct ipt_standard { |
| 251 | struct ipt_entry entry; | 247 | struct ipt_entry entry; |
| 252 | struct ipt_standard_target target; | 248 | struct xt_standard_target target; |
| 253 | }; | ||
| 254 | |||
| 255 | struct ipt_error_target { | ||
| 256 | struct ipt_entry_target target; | ||
| 257 | char errorname[IPT_FUNCTION_MAXNAMELEN]; | ||
| 258 | }; | 249 | }; |
| 259 | 250 | ||
| 260 | struct ipt_error { | 251 | struct ipt_error { |
| 261 | struct ipt_entry entry; | 252 | struct ipt_entry entry; |
| 262 | struct ipt_error_target target; | 253 | struct xt_error_target target; |
| 263 | }; | 254 | }; |
| 264 | 255 | ||
| 265 | #define IPT_ENTRY_INIT(__size) \ | 256 | #define IPT_ENTRY_INIT(__size) \ |
| @@ -271,7 +262,7 @@ struct ipt_error { | |||
| 271 | #define IPT_STANDARD_INIT(__verdict) \ | 262 | #define IPT_STANDARD_INIT(__verdict) \ |
| 272 | { \ | 263 | { \ |
| 273 | .entry = IPT_ENTRY_INIT(sizeof(struct ipt_standard)), \ | 264 | .entry = IPT_ENTRY_INIT(sizeof(struct ipt_standard)), \ |
| 274 | .target = XT_TARGET_INIT(IPT_STANDARD_TARGET, \ | 265 | .target = XT_TARGET_INIT(XT_STANDARD_TARGET, \ |
| 275 | sizeof(struct xt_standard_target)), \ | 266 | sizeof(struct xt_standard_target)), \ |
| 276 | .target.verdict = -(__verdict) - 1, \ | 267 | .target.verdict = -(__verdict) - 1, \ |
| 277 | } | 268 | } |
| @@ -279,8 +270,8 @@ struct ipt_error { | |||
| 279 | #define IPT_ERROR_INIT \ | 270 | #define IPT_ERROR_INIT \ |
| 280 | { \ | 271 | { \ |
| 281 | .entry = IPT_ENTRY_INIT(sizeof(struct ipt_error)), \ | 272 | .entry = IPT_ENTRY_INIT(sizeof(struct ipt_error)), \ |
| 282 | .target = XT_TARGET_INIT(IPT_ERROR_TARGET, \ | 273 | .target = XT_TARGET_INIT(XT_ERROR_TARGET, \ |
| 283 | sizeof(struct ipt_error_target)), \ | 274 | sizeof(struct xt_error_target)), \ |
| 284 | .target.errorname = "ERROR", \ | 275 | .target.errorname = "ERROR", \ |
| 285 | } | 276 | } |
| 286 | 277 | ||
| @@ -291,8 +282,6 @@ extern unsigned int ipt_do_table(struct sk_buff *skb, | |||
| 291 | const struct net_device *out, | 282 | const struct net_device *out, |
| 292 | struct xt_table *table); | 283 | struct xt_table *table); |
| 293 | 284 | ||
| 294 | #define IPT_ALIGN(s) XT_ALIGN(s) | ||
| 295 | |||
| 296 | #ifdef CONFIG_COMPAT | 285 | #ifdef CONFIG_COMPAT |
| 297 | #include <net/compat.h> | 286 | #include <net/compat.h> |
| 298 | 287 | ||
| @@ -307,14 +296,12 @@ struct compat_ipt_entry { | |||
| 307 | }; | 296 | }; |
| 308 | 297 | ||
| 309 | /* Helper functions */ | 298 | /* Helper functions */ |
| 310 | static inline struct ipt_entry_target * | 299 | static inline struct xt_entry_target * |
| 311 | compat_ipt_get_target(struct compat_ipt_entry *e) | 300 | compat_ipt_get_target(struct compat_ipt_entry *e) |
| 312 | { | 301 | { |
| 313 | return (void *)e + e->target_offset; | 302 | return (void *)e + e->target_offset; |
| 314 | } | 303 | } |
| 315 | 304 | ||
| 316 | #define COMPAT_IPT_ALIGN(s) COMPAT_XT_ALIGN(s) | ||
| 317 | |||
| 318 | #endif /* CONFIG_COMPAT */ | 305 | #endif /* CONFIG_COMPAT */ |
| 319 | #endif /*__KERNEL__*/ | 306 | #endif /*__KERNEL__*/ |
| 320 | #endif /* _IPTABLES_H */ | 307 | #endif /* _IPTABLES_H */ |
diff --git a/include/linux/netfilter_ipv4/ipt_LOG.h b/include/linux/netfilter_ipv4/ipt_LOG.h index 90fa6525ef9c..dcdbadf9fd4a 100644 --- a/include/linux/netfilter_ipv4/ipt_LOG.h +++ b/include/linux/netfilter_ipv4/ipt_LOG.h | |||
| @@ -7,7 +7,8 @@ | |||
| 7 | #define IPT_LOG_IPOPT 0x04 /* Log IP options */ | 7 | #define IPT_LOG_IPOPT 0x04 /* Log IP options */ |
| 8 | #define IPT_LOG_UID 0x08 /* Log UID owning local socket */ | 8 | #define IPT_LOG_UID 0x08 /* Log UID owning local socket */ |
| 9 | #define IPT_LOG_NFLOG 0x10 /* Unsupported, don't reuse */ | 9 | #define IPT_LOG_NFLOG 0x10 /* Unsupported, don't reuse */ |
| 10 | #define IPT_LOG_MASK 0x1f | 10 | #define IPT_LOG_MACDECODE 0x20 /* Decode MAC header */ |
| 11 | #define IPT_LOG_MASK 0x2f | ||
| 11 | 12 | ||
| 12 | struct ipt_log_info { | 13 | struct ipt_log_info { |
| 13 | unsigned char level; | 14 | unsigned char level; |
diff --git a/include/linux/netfilter_ipv6/Kbuild b/include/linux/netfilter_ipv6/Kbuild index e864eaee9e5e..bd095bc075e9 100644 --- a/include/linux/netfilter_ipv6/Kbuild +++ b/include/linux/netfilter_ipv6/Kbuild | |||
| @@ -1,12 +1,11 @@ | |||
| 1 | header-y += ip6_tables.h | ||
| 1 | header-y += ip6t_HL.h | 2 | header-y += ip6t_HL.h |
| 2 | header-y += ip6t_LOG.h | 3 | header-y += ip6t_LOG.h |
| 3 | header-y += ip6t_REJECT.h | 4 | header-y += ip6t_REJECT.h |
| 4 | header-y += ip6t_ah.h | 5 | header-y += ip6t_ah.h |
| 5 | header-y += ip6t_frag.h | 6 | header-y += ip6t_frag.h |
| 6 | header-y += ip6t_ipv6header.h | ||
| 7 | header-y += ip6t_hl.h | 7 | header-y += ip6t_hl.h |
| 8 | header-y += ip6t_ipv6header.h | ||
| 8 | header-y += ip6t_mh.h | 9 | header-y += ip6t_mh.h |
| 9 | header-y += ip6t_opts.h | 10 | header-y += ip6t_opts.h |
| 10 | header-y += ip6t_rt.h | 11 | header-y += ip6t_rt.h |
| 11 | |||
| 12 | unifdef-y += ip6_tables.h | ||
diff --git a/include/linux/netfilter_ipv6/ip6_tables.h b/include/linux/netfilter_ipv6/ip6_tables.h index 18442ff19c07..c9784f7a9c1f 100644 --- a/include/linux/netfilter_ipv6/ip6_tables.h +++ b/include/linux/netfilter_ipv6/ip6_tables.h | |||
| @@ -27,13 +27,42 @@ | |||
| 27 | 27 | ||
| 28 | #include <linux/netfilter/x_tables.h> | 28 | #include <linux/netfilter/x_tables.h> |
| 29 | 29 | ||
| 30 | #ifndef __KERNEL__ | ||
| 30 | #define IP6T_FUNCTION_MAXNAMELEN XT_FUNCTION_MAXNAMELEN | 31 | #define IP6T_FUNCTION_MAXNAMELEN XT_FUNCTION_MAXNAMELEN |
| 31 | #define IP6T_TABLE_MAXNAMELEN XT_TABLE_MAXNAMELEN | 32 | #define IP6T_TABLE_MAXNAMELEN XT_TABLE_MAXNAMELEN |
| 32 | |||
| 33 | #define ip6t_match xt_match | 33 | #define ip6t_match xt_match |
| 34 | #define ip6t_target xt_target | 34 | #define ip6t_target xt_target |
| 35 | #define ip6t_table xt_table | 35 | #define ip6t_table xt_table |
| 36 | #define ip6t_get_revision xt_get_revision | 36 | #define ip6t_get_revision xt_get_revision |
| 37 | #define ip6t_entry_match xt_entry_match | ||
| 38 | #define ip6t_entry_target xt_entry_target | ||
| 39 | #define ip6t_standard_target xt_standard_target | ||
| 40 | #define ip6t_error_target xt_error_target | ||
| 41 | #define ip6t_counters xt_counters | ||
| 42 | #define IP6T_CONTINUE XT_CONTINUE | ||
| 43 | #define IP6T_RETURN XT_RETURN | ||
| 44 | |||
| 45 | /* Pre-iptables-1.4.0 */ | ||
| 46 | #include <linux/netfilter/xt_tcpudp.h> | ||
| 47 | #define ip6t_tcp xt_tcp | ||
| 48 | #define ip6t_udp xt_udp | ||
| 49 | #define IP6T_TCP_INV_SRCPT XT_TCP_INV_SRCPT | ||
| 50 | #define IP6T_TCP_INV_DSTPT XT_TCP_INV_DSTPT | ||
| 51 | #define IP6T_TCP_INV_FLAGS XT_TCP_INV_FLAGS | ||
| 52 | #define IP6T_TCP_INV_OPTION XT_TCP_INV_OPTION | ||
| 53 | #define IP6T_TCP_INV_MASK XT_TCP_INV_MASK | ||
| 54 | #define IP6T_UDP_INV_SRCPT XT_UDP_INV_SRCPT | ||
| 55 | #define IP6T_UDP_INV_DSTPT XT_UDP_INV_DSTPT | ||
| 56 | #define IP6T_UDP_INV_MASK XT_UDP_INV_MASK | ||
| 57 | |||
| 58 | #define ip6t_counters_info xt_counters_info | ||
| 59 | #define IP6T_STANDARD_TARGET XT_STANDARD_TARGET | ||
| 60 | #define IP6T_ERROR_TARGET XT_ERROR_TARGET | ||
| 61 | #define IP6T_MATCH_ITERATE(e, fn, args...) \ | ||
| 62 | XT_MATCH_ITERATE(struct ip6t_entry, e, fn, ## args) | ||
| 63 | #define IP6T_ENTRY_ITERATE(entries, size, fn, args...) \ | ||
| 64 | XT_ENTRY_ITERATE(struct ip6t_entry, entries, size, fn, ## args) | ||
| 65 | #endif | ||
| 37 | 66 | ||
| 38 | /* Yes, Virginia, you have to zero the padding. */ | 67 | /* Yes, Virginia, you have to zero the padding. */ |
| 39 | struct ip6t_ip6 { | 68 | struct ip6t_ip6 { |
| @@ -62,12 +91,6 @@ struct ip6t_ip6 { | |||
| 62 | u_int8_t invflags; | 91 | u_int8_t invflags; |
| 63 | }; | 92 | }; |
| 64 | 93 | ||
| 65 | #define ip6t_entry_match xt_entry_match | ||
| 66 | #define ip6t_entry_target xt_entry_target | ||
| 67 | #define ip6t_standard_target xt_standard_target | ||
| 68 | |||
| 69 | #define ip6t_counters xt_counters | ||
| 70 | |||
| 71 | /* Values for "flag" field in struct ip6t_ip6 (general ip6 structure). */ | 94 | /* Values for "flag" field in struct ip6t_ip6 (general ip6 structure). */ |
| 72 | #define IP6T_F_PROTO 0x01 /* Set if rule cares about upper | 95 | #define IP6T_F_PROTO 0x01 /* Set if rule cares about upper |
| 73 | protocols */ | 96 | protocols */ |
| @@ -112,17 +135,12 @@ struct ip6t_entry { | |||
| 112 | /* Standard entry */ | 135 | /* Standard entry */ |
| 113 | struct ip6t_standard { | 136 | struct ip6t_standard { |
| 114 | struct ip6t_entry entry; | 137 | struct ip6t_entry entry; |
| 115 | struct ip6t_standard_target target; | 138 | struct xt_standard_target target; |
| 116 | }; | ||
| 117 | |||
| 118 | struct ip6t_error_target { | ||
| 119 | struct ip6t_entry_target target; | ||
| 120 | char errorname[IP6T_FUNCTION_MAXNAMELEN]; | ||
| 121 | }; | 139 | }; |
| 122 | 140 | ||
| 123 | struct ip6t_error { | 141 | struct ip6t_error { |
| 124 | struct ip6t_entry entry; | 142 | struct ip6t_entry entry; |
| 125 | struct ip6t_error_target target; | 143 | struct xt_error_target target; |
| 126 | }; | 144 | }; |
| 127 | 145 | ||
| 128 | #define IP6T_ENTRY_INIT(__size) \ | 146 | #define IP6T_ENTRY_INIT(__size) \ |
| @@ -134,16 +152,16 @@ struct ip6t_error { | |||
| 134 | #define IP6T_STANDARD_INIT(__verdict) \ | 152 | #define IP6T_STANDARD_INIT(__verdict) \ |
| 135 | { \ | 153 | { \ |
| 136 | .entry = IP6T_ENTRY_INIT(sizeof(struct ip6t_standard)), \ | 154 | .entry = IP6T_ENTRY_INIT(sizeof(struct ip6t_standard)), \ |
| 137 | .target = XT_TARGET_INIT(IP6T_STANDARD_TARGET, \ | 155 | .target = XT_TARGET_INIT(XT_STANDARD_TARGET, \ |
| 138 | sizeof(struct ip6t_standard_target)), \ | 156 | sizeof(struct xt_standard_target)), \ |
| 139 | .target.verdict = -(__verdict) - 1, \ | 157 | .target.verdict = -(__verdict) - 1, \ |
| 140 | } | 158 | } |
| 141 | 159 | ||
| 142 | #define IP6T_ERROR_INIT \ | 160 | #define IP6T_ERROR_INIT \ |
| 143 | { \ | 161 | { \ |
| 144 | .entry = IP6T_ENTRY_INIT(sizeof(struct ip6t_error)), \ | 162 | .entry = IP6T_ENTRY_INIT(sizeof(struct ip6t_error)), \ |
| 145 | .target = XT_TARGET_INIT(IP6T_ERROR_TARGET, \ | 163 | .target = XT_TARGET_INIT(XT_ERROR_TARGET, \ |
| 146 | sizeof(struct ip6t_error_target)), \ | 164 | sizeof(struct xt_error_target)), \ |
| 147 | .target.errorname = "ERROR", \ | 165 | .target.errorname = "ERROR", \ |
| 148 | } | 166 | } |
| 149 | 167 | ||
| @@ -166,30 +184,6 @@ struct ip6t_error { | |||
| 166 | #define IP6T_SO_GET_REVISION_TARGET (IP6T_BASE_CTL + 5) | 184 | #define IP6T_SO_GET_REVISION_TARGET (IP6T_BASE_CTL + 5) |
| 167 | #define IP6T_SO_GET_MAX IP6T_SO_GET_REVISION_TARGET | 185 | #define IP6T_SO_GET_MAX IP6T_SO_GET_REVISION_TARGET |
| 168 | 186 | ||
| 169 | /* CONTINUE verdict for targets */ | ||
| 170 | #define IP6T_CONTINUE XT_CONTINUE | ||
| 171 | |||
| 172 | /* For standard target */ | ||
| 173 | #define IP6T_RETURN XT_RETURN | ||
| 174 | |||
| 175 | /* TCP/UDP matching stuff */ | ||
| 176 | #include <linux/netfilter/xt_tcpudp.h> | ||
| 177 | |||
| 178 | #define ip6t_tcp xt_tcp | ||
| 179 | #define ip6t_udp xt_udp | ||
| 180 | |||
| 181 | /* Values for "inv" field in struct ipt_tcp. */ | ||
| 182 | #define IP6T_TCP_INV_SRCPT XT_TCP_INV_SRCPT | ||
| 183 | #define IP6T_TCP_INV_DSTPT XT_TCP_INV_DSTPT | ||
| 184 | #define IP6T_TCP_INV_FLAGS XT_TCP_INV_FLAGS | ||
| 185 | #define IP6T_TCP_INV_OPTION XT_TCP_INV_OPTION | ||
| 186 | #define IP6T_TCP_INV_MASK XT_TCP_INV_MASK | ||
| 187 | |||
| 188 | /* Values for "invflags" field in struct ipt_udp. */ | ||
| 189 | #define IP6T_UDP_INV_SRCPT XT_UDP_INV_SRCPT | ||
| 190 | #define IP6T_UDP_INV_DSTPT XT_UDP_INV_DSTPT | ||
| 191 | #define IP6T_UDP_INV_MASK XT_UDP_INV_MASK | ||
| 192 | |||
| 193 | /* ICMP matching stuff */ | 187 | /* ICMP matching stuff */ |
| 194 | struct ip6t_icmp { | 188 | struct ip6t_icmp { |
| 195 | u_int8_t type; /* type to match */ | 189 | u_int8_t type; /* type to match */ |
| @@ -203,7 +197,7 @@ struct ip6t_icmp { | |||
| 203 | /* The argument to IP6T_SO_GET_INFO */ | 197 | /* The argument to IP6T_SO_GET_INFO */ |
| 204 | struct ip6t_getinfo { | 198 | struct ip6t_getinfo { |
| 205 | /* Which table: caller fills this in. */ | 199 | /* Which table: caller fills this in. */ |
| 206 | char name[IP6T_TABLE_MAXNAMELEN]; | 200 | char name[XT_TABLE_MAXNAMELEN]; |
| 207 | 201 | ||
| 208 | /* Kernel fills these in. */ | 202 | /* Kernel fills these in. */ |
| 209 | /* Which hook entry points are valid: bitmask */ | 203 | /* Which hook entry points are valid: bitmask */ |
| @@ -225,7 +219,7 @@ struct ip6t_getinfo { | |||
| 225 | /* The argument to IP6T_SO_SET_REPLACE. */ | 219 | /* The argument to IP6T_SO_SET_REPLACE. */ |
| 226 | struct ip6t_replace { | 220 | struct ip6t_replace { |
| 227 | /* Which table. */ | 221 | /* Which table. */ |
| 228 | char name[IP6T_TABLE_MAXNAMELEN]; | 222 | char name[XT_TABLE_MAXNAMELEN]; |
| 229 | 223 | ||
| 230 | /* Which hook entry points are valid: bitmask. You can't | 224 | /* Which hook entry points are valid: bitmask. You can't |
| 231 | change this. */ | 225 | change this. */ |
| @@ -253,13 +247,10 @@ struct ip6t_replace { | |||
| 253 | struct ip6t_entry entries[0]; | 247 | struct ip6t_entry entries[0]; |
| 254 | }; | 248 | }; |
| 255 | 249 | ||
| 256 | /* The argument to IP6T_SO_ADD_COUNTERS. */ | ||
| 257 | #define ip6t_counters_info xt_counters_info | ||
| 258 | |||
| 259 | /* The argument to IP6T_SO_GET_ENTRIES. */ | 250 | /* The argument to IP6T_SO_GET_ENTRIES. */ |
| 260 | struct ip6t_get_entries { | 251 | struct ip6t_get_entries { |
| 261 | /* Which table: user fills this in. */ | 252 | /* Which table: user fills this in. */ |
| 262 | char name[IP6T_TABLE_MAXNAMELEN]; | 253 | char name[XT_TABLE_MAXNAMELEN]; |
| 263 | 254 | ||
| 264 | /* User fills this in: total entry size. */ | 255 | /* User fills this in: total entry size. */ |
| 265 | unsigned int size; | 256 | unsigned int size; |
| @@ -268,28 +259,13 @@ struct ip6t_get_entries { | |||
| 268 | struct ip6t_entry entrytable[0]; | 259 | struct ip6t_entry entrytable[0]; |
| 269 | }; | 260 | }; |
| 270 | 261 | ||
| 271 | /* Standard return verdict, or do jump. */ | ||
| 272 | #define IP6T_STANDARD_TARGET XT_STANDARD_TARGET | ||
| 273 | /* Error verdict. */ | ||
| 274 | #define IP6T_ERROR_TARGET XT_ERROR_TARGET | ||
| 275 | |||
| 276 | /* Helper functions */ | 262 | /* Helper functions */ |
| 277 | static __inline__ struct ip6t_entry_target * | 263 | static __inline__ struct xt_entry_target * |
| 278 | ip6t_get_target(struct ip6t_entry *e) | 264 | ip6t_get_target(struct ip6t_entry *e) |
| 279 | { | 265 | { |
| 280 | return (void *)e + e->target_offset; | 266 | return (void *)e + e->target_offset; |
| 281 | } | 267 | } |
| 282 | 268 | ||
| 283 | #ifndef __KERNEL__ | ||
| 284 | /* fn returns 0 to continue iteration */ | ||
| 285 | #define IP6T_MATCH_ITERATE(e, fn, args...) \ | ||
| 286 | XT_MATCH_ITERATE(struct ip6t_entry, e, fn, ## args) | ||
| 287 | |||
| 288 | /* fn returns 0 to continue iteration */ | ||
| 289 | #define IP6T_ENTRY_ITERATE(entries, size, fn, args...) \ | ||
| 290 | XT_ENTRY_ITERATE(struct ip6t_entry, entries, size, fn, ## args) | ||
| 291 | #endif | ||
| 292 | |||
| 293 | /* | 269 | /* |
| 294 | * Main firewall chains definitions and global var's definitions. | 270 | * Main firewall chains definitions and global var's definitions. |
| 295 | */ | 271 | */ |
| @@ -316,8 +292,6 @@ extern int ip6t_ext_hdr(u8 nexthdr); | |||
| 316 | extern int ipv6_find_hdr(const struct sk_buff *skb, unsigned int *offset, | 292 | extern int ipv6_find_hdr(const struct sk_buff *skb, unsigned int *offset, |
| 317 | int target, unsigned short *fragoff); | 293 | int target, unsigned short *fragoff); |
| 318 | 294 | ||
| 319 | #define IP6T_ALIGN(s) XT_ALIGN(s) | ||
| 320 | |||
| 321 | #ifdef CONFIG_COMPAT | 295 | #ifdef CONFIG_COMPAT |
| 322 | #include <net/compat.h> | 296 | #include <net/compat.h> |
| 323 | 297 | ||
| @@ -331,14 +305,12 @@ struct compat_ip6t_entry { | |||
| 331 | unsigned char elems[0]; | 305 | unsigned char elems[0]; |
| 332 | }; | 306 | }; |
| 333 | 307 | ||
| 334 | static inline struct ip6t_entry_target * | 308 | static inline struct xt_entry_target * |
| 335 | compat_ip6t_get_target(struct compat_ip6t_entry *e) | 309 | compat_ip6t_get_target(struct compat_ip6t_entry *e) |
| 336 | { | 310 | { |
| 337 | return (void *)e + e->target_offset; | 311 | return (void *)e + e->target_offset; |
| 338 | } | 312 | } |
| 339 | 313 | ||
| 340 | #define COMPAT_IP6T_ALIGN(s) COMPAT_XT_ALIGN(s) | ||
| 341 | |||
| 342 | #endif /* CONFIG_COMPAT */ | 314 | #endif /* CONFIG_COMPAT */ |
| 343 | #endif /*__KERNEL__*/ | 315 | #endif /*__KERNEL__*/ |
| 344 | #endif /* _IP6_TABLES_H */ | 316 | #endif /* _IP6_TABLES_H */ |
diff --git a/include/linux/netfilter_ipv6/ip6t_LOG.h b/include/linux/netfilter_ipv6/ip6t_LOG.h index 0d0119b0458c..9dd5579e02ec 100644 --- a/include/linux/netfilter_ipv6/ip6t_LOG.h +++ b/include/linux/netfilter_ipv6/ip6t_LOG.h | |||
| @@ -7,7 +7,8 @@ | |||
| 7 | #define IP6T_LOG_IPOPT 0x04 /* Log IP options */ | 7 | #define IP6T_LOG_IPOPT 0x04 /* Log IP options */ |
| 8 | #define IP6T_LOG_UID 0x08 /* Log UID owning local socket */ | 8 | #define IP6T_LOG_UID 0x08 /* Log UID owning local socket */ |
| 9 | #define IP6T_LOG_NFLOG 0x10 /* Unsupported, don't use */ | 9 | #define IP6T_LOG_NFLOG 0x10 /* Unsupported, don't use */ |
| 10 | #define IP6T_LOG_MASK 0x1f | 10 | #define IP6T_LOG_MACDECODE 0x20 /* Decode MAC header */ |
| 11 | #define IP6T_LOG_MASK 0x2f | ||
| 11 | 12 | ||
| 12 | struct ip6t_log_info { | 13 | struct ip6t_log_info { |
| 13 | unsigned char level; | 14 | unsigned char level; |
diff --git a/include/linux/netlink.h b/include/linux/netlink.h index 59d066936ab9..123566912d73 100644 --- a/include/linux/netlink.h +++ b/include/linux/netlink.h | |||
| @@ -27,8 +27,6 @@ | |||
| 27 | 27 | ||
| 28 | #define MAX_LINKS 32 | 28 | #define MAX_LINKS 32 |
| 29 | 29 | ||
| 30 | struct net; | ||
| 31 | |||
| 32 | struct sockaddr_nl { | 30 | struct sockaddr_nl { |
| 33 | sa_family_t nl_family; /* AF_NETLINK */ | 31 | sa_family_t nl_family; /* AF_NETLINK */ |
| 34 | unsigned short nl_pad; /* zero */ | 32 | unsigned short nl_pad; /* zero */ |
| @@ -151,6 +149,8 @@ struct nlattr { | |||
| 151 | #include <linux/capability.h> | 149 | #include <linux/capability.h> |
| 152 | #include <linux/skbuff.h> | 150 | #include <linux/skbuff.h> |
| 153 | 151 | ||
| 152 | struct net; | ||
| 153 | |||
| 154 | static inline struct nlmsghdr *nlmsg_hdr(const struct sk_buff *skb) | 154 | static inline struct nlmsghdr *nlmsg_hdr(const struct sk_buff *skb) |
| 155 | { | 155 | { |
| 156 | return (struct nlmsghdr *)skb->data; | 156 | return (struct nlmsghdr *)skb->data; |
diff --git a/include/linux/netpoll.h b/include/linux/netpoll.h index e9e231215865..79358bb712c6 100644 --- a/include/linux/netpoll.h +++ b/include/linux/netpoll.h | |||
| @@ -14,7 +14,6 @@ | |||
| 14 | 14 | ||
| 15 | struct netpoll { | 15 | struct netpoll { |
| 16 | struct net_device *dev; | 16 | struct net_device *dev; |
| 17 | struct net_device *real_dev; | ||
| 18 | char dev_name[IFNAMSIZ]; | 17 | char dev_name[IFNAMSIZ]; |
| 19 | const char *name; | 18 | const char *name; |
| 20 | void (*rx_hook)(struct netpoll *, int, char *, int); | 19 | void (*rx_hook)(struct netpoll *, int, char *, int); |
| @@ -46,36 +45,49 @@ void netpoll_poll(struct netpoll *np); | |||
| 46 | void netpoll_send_udp(struct netpoll *np, const char *msg, int len); | 45 | void netpoll_send_udp(struct netpoll *np, const char *msg, int len); |
| 47 | void netpoll_print_options(struct netpoll *np); | 46 | void netpoll_print_options(struct netpoll *np); |
| 48 | int netpoll_parse_options(struct netpoll *np, char *opt); | 47 | int netpoll_parse_options(struct netpoll *np, char *opt); |
| 48 | int __netpoll_setup(struct netpoll *np); | ||
| 49 | int netpoll_setup(struct netpoll *np); | 49 | int netpoll_setup(struct netpoll *np); |
| 50 | int netpoll_trap(void); | 50 | int netpoll_trap(void); |
| 51 | void netpoll_set_trap(int trap); | 51 | void netpoll_set_trap(int trap); |
| 52 | void __netpoll_cleanup(struct netpoll *np); | ||
| 52 | void netpoll_cleanup(struct netpoll *np); | 53 | void netpoll_cleanup(struct netpoll *np); |
| 53 | int __netpoll_rx(struct sk_buff *skb); | 54 | int __netpoll_rx(struct sk_buff *skb); |
| 54 | void netpoll_send_skb(struct netpoll *np, struct sk_buff *skb); | 55 | void netpoll_send_skb_on_dev(struct netpoll *np, struct sk_buff *skb, |
| 56 | struct net_device *dev); | ||
| 57 | static inline void netpoll_send_skb(struct netpoll *np, struct sk_buff *skb) | ||
| 58 | { | ||
| 59 | netpoll_send_skb_on_dev(np, skb, np->dev); | ||
| 60 | } | ||
| 61 | |||
| 55 | 62 | ||
| 56 | 63 | ||
| 57 | #ifdef CONFIG_NETPOLL | 64 | #ifdef CONFIG_NETPOLL |
| 58 | static inline bool netpoll_rx(struct sk_buff *skb) | 65 | static inline bool netpoll_rx(struct sk_buff *skb) |
| 59 | { | 66 | { |
| 60 | struct netpoll_info *npinfo = skb->dev->npinfo; | 67 | struct netpoll_info *npinfo; |
| 61 | unsigned long flags; | 68 | unsigned long flags; |
| 62 | bool ret = false; | 69 | bool ret = false; |
| 63 | 70 | ||
| 71 | local_irq_save(flags); | ||
| 72 | npinfo = rcu_dereference_bh(skb->dev->npinfo); | ||
| 73 | |||
| 64 | if (!npinfo || (list_empty(&npinfo->rx_np) && !npinfo->rx_flags)) | 74 | if (!npinfo || (list_empty(&npinfo->rx_np) && !npinfo->rx_flags)) |
| 65 | return false; | 75 | goto out; |
| 66 | 76 | ||
| 67 | spin_lock_irqsave(&npinfo->rx_lock, flags); | 77 | spin_lock(&npinfo->rx_lock); |
| 68 | /* check rx_flags again with the lock held */ | 78 | /* check rx_flags again with the lock held */ |
| 69 | if (npinfo->rx_flags && __netpoll_rx(skb)) | 79 | if (npinfo->rx_flags && __netpoll_rx(skb)) |
| 70 | ret = true; | 80 | ret = true; |
| 71 | spin_unlock_irqrestore(&npinfo->rx_lock, flags); | 81 | spin_unlock(&npinfo->rx_lock); |
| 72 | 82 | ||
| 83 | out: | ||
| 84 | local_irq_restore(flags); | ||
| 73 | return ret; | 85 | return ret; |
| 74 | } | 86 | } |
| 75 | 87 | ||
| 76 | static inline int netpoll_rx_on(struct sk_buff *skb) | 88 | static inline int netpoll_rx_on(struct sk_buff *skb) |
| 77 | { | 89 | { |
| 78 | struct netpoll_info *npinfo = skb->dev->npinfo; | 90 | struct netpoll_info *npinfo = rcu_dereference_bh(skb->dev->npinfo); |
| 79 | 91 | ||
| 80 | return npinfo && (!list_empty(&npinfo->rx_np) || npinfo->rx_flags); | 92 | return npinfo && (!list_empty(&npinfo->rx_np) || npinfo->rx_flags); |
| 81 | } | 93 | } |
| @@ -91,7 +103,6 @@ static inline void *netpoll_poll_lock(struct napi_struct *napi) | |||
| 91 | { | 103 | { |
| 92 | struct net_device *dev = napi->dev; | 104 | struct net_device *dev = napi->dev; |
| 93 | 105 | ||
| 94 | rcu_read_lock(); /* deal with race on ->npinfo */ | ||
| 95 | if (dev && dev->npinfo) { | 106 | if (dev && dev->npinfo) { |
| 96 | spin_lock(&napi->poll_lock); | 107 | spin_lock(&napi->poll_lock); |
| 97 | napi->poll_owner = smp_processor_id(); | 108 | napi->poll_owner = smp_processor_id(); |
| @@ -108,11 +119,15 @@ static inline void netpoll_poll_unlock(void *have) | |||
| 108 | napi->poll_owner = -1; | 119 | napi->poll_owner = -1; |
| 109 | spin_unlock(&napi->poll_lock); | 120 | spin_unlock(&napi->poll_lock); |
| 110 | } | 121 | } |
| 111 | rcu_read_unlock(); | 122 | } |
| 123 | |||
| 124 | static inline int netpoll_tx_running(struct net_device *dev) | ||
| 125 | { | ||
| 126 | return irqs_disabled(); | ||
| 112 | } | 127 | } |
| 113 | 128 | ||
| 114 | #else | 129 | #else |
| 115 | static inline int netpoll_rx(struct sk_buff *skb) | 130 | static inline bool netpoll_rx(struct sk_buff *skb) |
| 116 | { | 131 | { |
| 117 | return 0; | 132 | return 0; |
| 118 | } | 133 | } |
| @@ -134,6 +149,10 @@ static inline void netpoll_poll_unlock(void *have) | |||
| 134 | static inline void netpoll_netdev_init(struct net_device *dev) | 149 | static inline void netpoll_netdev_init(struct net_device *dev) |
| 135 | { | 150 | { |
| 136 | } | 151 | } |
| 152 | static inline int netpoll_tx_running(struct net_device *dev) | ||
| 153 | { | ||
| 154 | return 0; | ||
| 155 | } | ||
| 137 | #endif | 156 | #endif |
| 138 | 157 | ||
| 139 | #endif | 158 | #endif |
diff --git a/include/linux/nfs4.h b/include/linux/nfs4.h index 9b8299af3741..4925b22219d2 100644 --- a/include/linux/nfs4.h +++ b/include/linux/nfs4.h | |||
| @@ -17,7 +17,9 @@ | |||
| 17 | 17 | ||
| 18 | #define NFS4_BITMAP_SIZE 2 | 18 | #define NFS4_BITMAP_SIZE 2 |
| 19 | #define NFS4_VERIFIER_SIZE 8 | 19 | #define NFS4_VERIFIER_SIZE 8 |
| 20 | #define NFS4_STATEID_SIZE 16 | 20 | #define NFS4_STATEID_SEQID_SIZE 4 |
| 21 | #define NFS4_STATEID_OTHER_SIZE 12 | ||
| 22 | #define NFS4_STATEID_SIZE (NFS4_STATEID_SEQID_SIZE + NFS4_STATEID_OTHER_SIZE) | ||
| 21 | #define NFS4_FHSIZE 128 | 23 | #define NFS4_FHSIZE 128 |
| 22 | #define NFS4_MAXPATHLEN PATH_MAX | 24 | #define NFS4_MAXPATHLEN PATH_MAX |
| 23 | #define NFS4_MAXNAMLEN NAME_MAX | 25 | #define NFS4_MAXNAMLEN NAME_MAX |
| @@ -61,6 +63,9 @@ | |||
| 61 | #define NFS4_SHARE_SIGNAL_DELEG_WHEN_RESRC_AVAIL 0x10000 | 63 | #define NFS4_SHARE_SIGNAL_DELEG_WHEN_RESRC_AVAIL 0x10000 |
| 62 | #define NFS4_SHARE_PUSH_DELEG_WHEN_UNCONTENDED 0x20000 | 64 | #define NFS4_SHARE_PUSH_DELEG_WHEN_UNCONTENDED 0x20000 |
| 63 | 65 | ||
| 66 | #define NFS4_CDFC4_FORE 0x1 | ||
| 67 | #define NFS4_CDFC4_BACK 0x2 | ||
| 68 | |||
| 64 | #define NFS4_SET_TO_SERVER_TIME 0 | 69 | #define NFS4_SET_TO_SERVER_TIME 0 |
| 65 | #define NFS4_SET_TO_CLIENT_TIME 1 | 70 | #define NFS4_SET_TO_CLIENT_TIME 1 |
| 66 | 71 | ||
| @@ -167,7 +172,16 @@ struct nfs4_acl { | |||
| 167 | }; | 172 | }; |
| 168 | 173 | ||
| 169 | typedef struct { char data[NFS4_VERIFIER_SIZE]; } nfs4_verifier; | 174 | typedef struct { char data[NFS4_VERIFIER_SIZE]; } nfs4_verifier; |
| 170 | typedef struct { char data[NFS4_STATEID_SIZE]; } nfs4_stateid; | 175 | |
| 176 | struct nfs41_stateid { | ||
| 177 | __be32 seqid; | ||
| 178 | char other[NFS4_STATEID_OTHER_SIZE]; | ||
| 179 | } __attribute__ ((packed)); | ||
| 180 | |||
| 181 | typedef union { | ||
| 182 | char data[NFS4_STATEID_SIZE]; | ||
| 183 | struct nfs41_stateid stateid; | ||
| 184 | } nfs4_stateid; | ||
| 171 | 185 | ||
| 172 | enum nfs_opnum4 { | 186 | enum nfs_opnum4 { |
| 173 | OP_ACCESS = 3, | 187 | OP_ACCESS = 3, |
| @@ -471,6 +485,8 @@ enum lock_type4 { | |||
| 471 | #define FATTR4_WORD1_TIME_MODIFY (1UL << 21) | 485 | #define FATTR4_WORD1_TIME_MODIFY (1UL << 21) |
| 472 | #define FATTR4_WORD1_TIME_MODIFY_SET (1UL << 22) | 486 | #define FATTR4_WORD1_TIME_MODIFY_SET (1UL << 22) |
| 473 | #define FATTR4_WORD1_MOUNTED_ON_FILEID (1UL << 23) | 487 | #define FATTR4_WORD1_MOUNTED_ON_FILEID (1UL << 23) |
| 488 | #define FATTR4_WORD1_FS_LAYOUT_TYPES (1UL << 30) | ||
| 489 | #define FATTR4_WORD2_LAYOUT_BLKSIZE (1UL << 1) | ||
| 474 | 490 | ||
| 475 | #define NFSPROC4_NULL 0 | 491 | #define NFSPROC4_NULL 0 |
| 476 | #define NFSPROC4_COMPOUND 1 | 492 | #define NFSPROC4_COMPOUND 1 |
| @@ -523,6 +539,7 @@ enum { | |||
| 523 | NFSPROC4_CLNT_GETACL, | 539 | NFSPROC4_CLNT_GETACL, |
| 524 | NFSPROC4_CLNT_SETACL, | 540 | NFSPROC4_CLNT_SETACL, |
| 525 | NFSPROC4_CLNT_FS_LOCATIONS, | 541 | NFSPROC4_CLNT_FS_LOCATIONS, |
| 542 | NFSPROC4_CLNT_RELEASE_LOCKOWNER, | ||
| 526 | 543 | ||
| 527 | /* nfs41 */ | 544 | /* nfs41 */ |
| 528 | NFSPROC4_CLNT_EXCHANGE_ID, | 545 | NFSPROC4_CLNT_EXCHANGE_ID, |
| @@ -531,6 +548,8 @@ enum { | |||
| 531 | NFSPROC4_CLNT_SEQUENCE, | 548 | NFSPROC4_CLNT_SEQUENCE, |
| 532 | NFSPROC4_CLNT_GET_LEASE_TIME, | 549 | NFSPROC4_CLNT_GET_LEASE_TIME, |
| 533 | NFSPROC4_CLNT_RECLAIM_COMPLETE, | 550 | NFSPROC4_CLNT_RECLAIM_COMPLETE, |
| 551 | NFSPROC4_CLNT_LAYOUTGET, | ||
| 552 | NFSPROC4_CLNT_GETDEVICEINFO, | ||
| 534 | }; | 553 | }; |
| 535 | 554 | ||
| 536 | /* nfs41 types */ | 555 | /* nfs41 types */ |
| @@ -549,6 +568,49 @@ enum state_protect_how4 { | |||
| 549 | SP4_SSV = 2 | 568 | SP4_SSV = 2 |
| 550 | }; | 569 | }; |
| 551 | 570 | ||
| 571 | enum pnfs_layouttype { | ||
| 572 | LAYOUT_NFSV4_1_FILES = 1, | ||
| 573 | LAYOUT_OSD2_OBJECTS = 2, | ||
| 574 | LAYOUT_BLOCK_VOLUME = 3, | ||
| 575 | }; | ||
| 576 | |||
| 577 | /* used for both layout return and recall */ | ||
| 578 | enum pnfs_layoutreturn_type { | ||
| 579 | RETURN_FILE = 1, | ||
| 580 | RETURN_FSID = 2, | ||
| 581 | RETURN_ALL = 3 | ||
| 582 | }; | ||
| 583 | |||
| 584 | enum pnfs_iomode { | ||
| 585 | IOMODE_READ = 1, | ||
| 586 | IOMODE_RW = 2, | ||
| 587 | IOMODE_ANY = 3, | ||
| 588 | }; | ||
| 589 | |||
| 590 | enum pnfs_notify_deviceid_type4 { | ||
| 591 | NOTIFY_DEVICEID4_CHANGE = 1 << 1, | ||
| 592 | NOTIFY_DEVICEID4_DELETE = 1 << 2, | ||
| 593 | }; | ||
| 594 | |||
| 595 | #define NFL4_UFLG_MASK 0x0000003F | ||
| 596 | #define NFL4_UFLG_DENSE 0x00000001 | ||
| 597 | #define NFL4_UFLG_COMMIT_THRU_MDS 0x00000002 | ||
| 598 | #define NFL4_UFLG_STRIPE_UNIT_SIZE_MASK 0xFFFFFFC0 | ||
| 599 | |||
| 600 | /* Encoded in the loh_body field of type layouthint4 */ | ||
| 601 | enum filelayout_hint_care4 { | ||
| 602 | NFLH4_CARE_DENSE = NFL4_UFLG_DENSE, | ||
| 603 | NFLH4_CARE_COMMIT_THRU_MDS = NFL4_UFLG_COMMIT_THRU_MDS, | ||
| 604 | NFLH4_CARE_STRIPE_UNIT_SIZE = 0x00000040, | ||
| 605 | NFLH4_CARE_STRIPE_COUNT = 0x00000080 | ||
| 606 | }; | ||
| 607 | |||
| 608 | #define NFS4_DEVICEID4_SIZE 16 | ||
| 609 | |||
| 610 | struct nfs4_deviceid { | ||
| 611 | char data[NFS4_DEVICEID4_SIZE]; | ||
| 612 | }; | ||
| 613 | |||
| 552 | #endif | 614 | #endif |
| 553 | #endif | 615 | #endif |
| 554 | 616 | ||
diff --git a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h index bad4d121b16e..bba26684acdc 100644 --- a/include/linux/nfs_fs.h +++ b/include/linux/nfs_fs.h | |||
| @@ -72,13 +72,20 @@ struct nfs_access_entry { | |||
| 72 | int mask; | 72 | int mask; |
| 73 | }; | 73 | }; |
| 74 | 74 | ||
| 75 | struct nfs_lock_context { | ||
| 76 | atomic_t count; | ||
| 77 | struct list_head list; | ||
| 78 | struct nfs_open_context *open_context; | ||
| 79 | fl_owner_t lockowner; | ||
| 80 | pid_t pid; | ||
| 81 | }; | ||
| 82 | |||
| 75 | struct nfs4_state; | 83 | struct nfs4_state; |
| 76 | struct nfs_open_context { | 84 | struct nfs_open_context { |
| 77 | atomic_t count; | 85 | struct nfs_lock_context lock_context; |
| 78 | struct path path; | 86 | struct path path; |
| 79 | struct rpc_cred *cred; | 87 | struct rpc_cred *cred; |
| 80 | struct nfs4_state *state; | 88 | struct nfs4_state *state; |
| 81 | fl_owner_t lockowner; | ||
| 82 | fmode_t mode; | 89 | fmode_t mode; |
| 83 | 90 | ||
| 84 | unsigned long flags; | 91 | unsigned long flags; |
| @@ -178,9 +185,12 @@ struct nfs_inode { | |||
| 178 | struct nfs4_cached_acl *nfs4_acl; | 185 | struct nfs4_cached_acl *nfs4_acl; |
| 179 | /* NFSv4 state */ | 186 | /* NFSv4 state */ |
| 180 | struct list_head open_states; | 187 | struct list_head open_states; |
| 181 | struct nfs_delegation *delegation; | 188 | struct nfs_delegation __rcu *delegation; |
| 182 | fmode_t delegation_state; | 189 | fmode_t delegation_state; |
| 183 | struct rw_semaphore rwsem; | 190 | struct rw_semaphore rwsem; |
| 191 | |||
| 192 | /* pNFS layout information */ | ||
| 193 | struct pnfs_layout_hdr *layout; | ||
| 184 | #endif /* CONFIG_NFS_V4*/ | 194 | #endif /* CONFIG_NFS_V4*/ |
| 185 | #ifdef CONFIG_NFS_FSCACHE | 195 | #ifdef CONFIG_NFS_FSCACHE |
| 186 | struct fscache_cookie *fscache; | 196 | struct fscache_cookie *fscache; |
| @@ -353,8 +363,13 @@ extern void nfs_setattr_update_inode(struct inode *inode, struct iattr *attr); | |||
| 353 | extern struct nfs_open_context *get_nfs_open_context(struct nfs_open_context *ctx); | 363 | extern struct nfs_open_context *get_nfs_open_context(struct nfs_open_context *ctx); |
| 354 | extern void put_nfs_open_context(struct nfs_open_context *ctx); | 364 | extern void put_nfs_open_context(struct nfs_open_context *ctx); |
| 355 | extern struct nfs_open_context *nfs_find_open_context(struct inode *inode, struct rpc_cred *cred, fmode_t mode); | 365 | extern struct nfs_open_context *nfs_find_open_context(struct inode *inode, struct rpc_cred *cred, fmode_t mode); |
| 366 | extern struct nfs_open_context *alloc_nfs_open_context(struct path *path, struct rpc_cred *cred, fmode_t f_mode); | ||
| 367 | extern void nfs_file_set_open_context(struct file *filp, struct nfs_open_context *ctx); | ||
| 368 | extern struct nfs_lock_context *nfs_get_lock_context(struct nfs_open_context *ctx); | ||
| 369 | extern void nfs_put_lock_context(struct nfs_lock_context *l_ctx); | ||
| 356 | extern u64 nfs_compat_user_ino64(u64 fileid); | 370 | extern u64 nfs_compat_user_ino64(u64 fileid); |
| 357 | extern void nfs_fattr_init(struct nfs_fattr *fattr); | 371 | extern void nfs_fattr_init(struct nfs_fattr *fattr); |
| 372 | extern unsigned long nfs_inc_attr_generation_counter(void); | ||
| 358 | 373 | ||
| 359 | extern struct nfs_fattr *nfs_alloc_fattr(void); | 374 | extern struct nfs_fattr *nfs_alloc_fattr(void); |
| 360 | 375 | ||
| @@ -370,9 +385,12 @@ static inline void nfs_free_fhandle(const struct nfs_fh *fh) | |||
| 370 | kfree(fh); | 385 | kfree(fh); |
| 371 | } | 386 | } |
| 372 | 387 | ||
| 388 | /* | ||
| 389 | * linux/fs/nfs/nfsroot.c | ||
| 390 | */ | ||
| 391 | extern int nfs_root_data(char **root_device, char **root_data); /*__init*/ | ||
| 373 | /* linux/net/ipv4/ipconfig.c: trims ip addr off front of name, too. */ | 392 | /* linux/net/ipv4/ipconfig.c: trims ip addr off front of name, too. */ |
| 374 | extern __be32 root_nfs_parse_addr(char *name); /*__init*/ | 393 | extern __be32 root_nfs_parse_addr(char *name); /*__init*/ |
| 375 | extern unsigned long nfs_inc_attr_generation_counter(void); | ||
| 376 | 394 | ||
| 377 | /* | 395 | /* |
| 378 | * linux/fs/nfs/file.c | 396 | * linux/fs/nfs/file.c |
| @@ -470,10 +488,10 @@ extern void nfs_release_automount_timer(void); | |||
| 470 | /* | 488 | /* |
| 471 | * linux/fs/nfs/unlink.c | 489 | * linux/fs/nfs/unlink.c |
| 472 | */ | 490 | */ |
| 473 | extern int nfs_async_unlink(struct inode *dir, struct dentry *dentry); | ||
| 474 | extern void nfs_complete_unlink(struct dentry *dentry, struct inode *); | 491 | extern void nfs_complete_unlink(struct dentry *dentry, struct inode *); |
| 475 | extern void nfs_block_sillyrename(struct dentry *dentry); | 492 | extern void nfs_block_sillyrename(struct dentry *dentry); |
| 476 | extern void nfs_unblock_sillyrename(struct dentry *dentry); | 493 | extern void nfs_unblock_sillyrename(struct dentry *dentry); |
| 494 | extern int nfs_sillyrename(struct inode *dir, struct dentry *dentry); | ||
| 477 | 495 | ||
| 478 | /* | 496 | /* |
| 479 | * linux/fs/nfs/write.c | 497 | * linux/fs/nfs/write.c |
| @@ -575,10 +593,6 @@ nfs_fileid_to_ino_t(u64 fileid) | |||
| 575 | return ino; | 593 | return ino; |
| 576 | } | 594 | } |
| 577 | 595 | ||
| 578 | /* NFS root */ | ||
| 579 | |||
| 580 | extern void * nfs_root_data(void); | ||
| 581 | |||
| 582 | #define nfs_wait_event(clnt, wq, condition) \ | 596 | #define nfs_wait_event(clnt, wq, condition) \ |
| 583 | ({ \ | 597 | ({ \ |
| 584 | int __retval = wait_event_killable(wq, condition); \ | 598 | int __retval = wait_event_killable(wq, condition); \ |
| @@ -604,6 +618,8 @@ extern void * nfs_root_data(void); | |||
| 604 | #define NFSDBG_CLIENT 0x0200 | 618 | #define NFSDBG_CLIENT 0x0200 |
| 605 | #define NFSDBG_MOUNT 0x0400 | 619 | #define NFSDBG_MOUNT 0x0400 |
| 606 | #define NFSDBG_FSCACHE 0x0800 | 620 | #define NFSDBG_FSCACHE 0x0800 |
| 621 | #define NFSDBG_PNFS 0x1000 | ||
| 622 | #define NFSDBG_PNFS_LD 0x2000 | ||
| 607 | #define NFSDBG_ALL 0xFFFF | 623 | #define NFSDBG_ALL 0xFFFF |
| 608 | 624 | ||
| 609 | #ifdef __KERNEL__ | 625 | #ifdef __KERNEL__ |
diff --git a/include/linux/nfs_fs_sb.h b/include/linux/nfs_fs_sb.h index d6e10a4c06e5..452d96436d26 100644 --- a/include/linux/nfs_fs_sb.h +++ b/include/linux/nfs_fs_sb.h | |||
| @@ -15,6 +15,7 @@ struct nlm_host; | |||
| 15 | struct nfs4_sequence_args; | 15 | struct nfs4_sequence_args; |
| 16 | struct nfs4_sequence_res; | 16 | struct nfs4_sequence_res; |
| 17 | struct nfs_server; | 17 | struct nfs_server; |
| 18 | struct nfs4_minor_version_ops; | ||
| 18 | 19 | ||
| 19 | /* | 20 | /* |
| 20 | * The nfs_client identifies our client state to the server. | 21 | * The nfs_client identifies our client state to the server. |
| @@ -70,11 +71,7 @@ struct nfs_client { | |||
| 70 | */ | 71 | */ |
| 71 | char cl_ipaddr[48]; | 72 | char cl_ipaddr[48]; |
| 72 | unsigned char cl_id_uniquifier; | 73 | unsigned char cl_id_uniquifier; |
| 73 | int (* cl_call_sync)(struct nfs_server *server, | 74 | const struct nfs4_minor_version_ops *cl_mvops; |
| 74 | struct rpc_message *msg, | ||
| 75 | struct nfs4_sequence_args *args, | ||
| 76 | struct nfs4_sequence_res *res, | ||
| 77 | int cache_reply); | ||
| 78 | #endif /* CONFIG_NFS_V4 */ | 75 | #endif /* CONFIG_NFS_V4 */ |
| 79 | 76 | ||
| 80 | #ifdef CONFIG_NFS_V4_1 | 77 | #ifdef CONFIG_NFS_V4_1 |
| @@ -85,6 +82,8 @@ struct nfs_client { | |||
| 85 | /* The flags used for obtaining the clientid during EXCHANGE_ID */ | 82 | /* The flags used for obtaining the clientid during EXCHANGE_ID */ |
| 86 | u32 cl_exchange_flags; | 83 | u32 cl_exchange_flags; |
| 87 | struct nfs4_session *cl_session; /* sharred session */ | 84 | struct nfs4_session *cl_session; /* sharred session */ |
| 85 | struct list_head cl_layouts; | ||
| 86 | struct pnfs_deviceid_cache *cl_devid_cache; /* pNFS deviceid cache */ | ||
| 88 | #endif /* CONFIG_NFS_V4_1 */ | 87 | #endif /* CONFIG_NFS_V4_1 */ |
| 89 | 88 | ||
| 90 | #ifdef CONFIG_NFS_FSCACHE | 89 | #ifdef CONFIG_NFS_FSCACHE |
| @@ -127,6 +126,7 @@ struct nfs_server { | |||
| 127 | 126 | ||
| 128 | struct nfs_fsid fsid; | 127 | struct nfs_fsid fsid; |
| 129 | __u64 maxfilesize; /* maximum file size */ | 128 | __u64 maxfilesize; /* maximum file size */ |
| 129 | struct timespec time_delta; /* smallest time granularity */ | ||
| 130 | unsigned long mount_time; /* when this fs was mounted */ | 130 | unsigned long mount_time; /* when this fs was mounted */ |
| 131 | dev_t s_dev; /* superblock dev numbers */ | 131 | dev_t s_dev; /* superblock dev numbers */ |
| 132 | 132 | ||
| @@ -147,6 +147,7 @@ struct nfs_server { | |||
| 147 | u32 acl_bitmask; /* V4 bitmask representing the ACEs | 147 | u32 acl_bitmask; /* V4 bitmask representing the ACEs |
| 148 | that are supported on this | 148 | that are supported on this |
| 149 | filesystem */ | 149 | filesystem */ |
| 150 | struct pnfs_layoutdriver_type *pnfs_curr_ld; /* Active layout driver */ | ||
| 150 | #endif | 151 | #endif |
| 151 | void (*destroy)(struct nfs_server *); | 152 | void (*destroy)(struct nfs_server *); |
| 152 | 153 | ||
diff --git a/include/linux/nfs_idmap.h b/include/linux/nfs_idmap.h index 91a1c24e0cbf..e8352dc5afb5 100644 --- a/include/linux/nfs_idmap.h +++ b/include/linux/nfs_idmap.h | |||
| @@ -66,13 +66,40 @@ struct idmap_msg { | |||
| 66 | /* Forward declaration to make this header independent of others */ | 66 | /* Forward declaration to make this header independent of others */ |
| 67 | struct nfs_client; | 67 | struct nfs_client; |
| 68 | 68 | ||
| 69 | #ifdef CONFIG_NFS_USE_NEW_IDMAPPER | ||
| 70 | |||
| 71 | int nfs_idmap_init(void); | ||
| 72 | void nfs_idmap_quit(void); | ||
| 73 | |||
| 74 | static inline int nfs_idmap_new(struct nfs_client *clp) | ||
| 75 | { | ||
| 76 | return 0; | ||
| 77 | } | ||
| 78 | |||
| 79 | static inline void nfs_idmap_delete(struct nfs_client *clp) | ||
| 80 | { | ||
| 81 | } | ||
| 82 | |||
| 83 | #else /* CONFIG_NFS_USE_NEW_IDMAPPER not set */ | ||
| 84 | |||
| 85 | static inline int nfs_idmap_init(void) | ||
| 86 | { | ||
| 87 | return 0; | ||
| 88 | } | ||
| 89 | |||
| 90 | static inline void nfs_idmap_quit(void) | ||
| 91 | { | ||
| 92 | } | ||
| 93 | |||
| 69 | int nfs_idmap_new(struct nfs_client *); | 94 | int nfs_idmap_new(struct nfs_client *); |
| 70 | void nfs_idmap_delete(struct nfs_client *); | 95 | void nfs_idmap_delete(struct nfs_client *); |
| 71 | 96 | ||
| 97 | #endif /* CONFIG_NFS_USE_NEW_IDMAPPER */ | ||
| 98 | |||
| 72 | int nfs_map_name_to_uid(struct nfs_client *, const char *, size_t, __u32 *); | 99 | int nfs_map_name_to_uid(struct nfs_client *, const char *, size_t, __u32 *); |
| 73 | int nfs_map_group_to_gid(struct nfs_client *, const char *, size_t, __u32 *); | 100 | int nfs_map_group_to_gid(struct nfs_client *, const char *, size_t, __u32 *); |
| 74 | int nfs_map_uid_to_name(struct nfs_client *, __u32, char *); | 101 | int nfs_map_uid_to_name(struct nfs_client *, __u32, char *, size_t); |
| 75 | int nfs_map_gid_to_group(struct nfs_client *, __u32, char *); | 102 | int nfs_map_gid_to_group(struct nfs_client *, __u32, char *, size_t); |
| 76 | 103 | ||
| 77 | extern unsigned int nfs_idmap_cache_timeout; | 104 | extern unsigned int nfs_idmap_cache_timeout; |
| 78 | #endif /* __KERNEL__ */ | 105 | #endif /* __KERNEL__ */ |
diff --git a/include/linux/nfs_mount.h b/include/linux/nfs_mount.h index 4499016e6d0d..576bddd72e04 100644 --- a/include/linux/nfs_mount.h +++ b/include/linux/nfs_mount.h | |||
| @@ -69,5 +69,9 @@ struct nfs_mount_data { | |||
| 69 | #define NFS_MOUNT_LOOKUP_CACHE_NONEG 0x10000 | 69 | #define NFS_MOUNT_LOOKUP_CACHE_NONEG 0x10000 |
| 70 | #define NFS_MOUNT_LOOKUP_CACHE_NONE 0x20000 | 70 | #define NFS_MOUNT_LOOKUP_CACHE_NONE 0x20000 |
| 71 | #define NFS_MOUNT_NORESVPORT 0x40000 | 71 | #define NFS_MOUNT_NORESVPORT 0x40000 |
| 72 | #define NFS_MOUNT_LEGACY_INTERFACE 0x80000 | ||
| 73 | |||
| 74 | #define NFS_MOUNT_LOCAL_FLOCK 0x100000 | ||
| 75 | #define NFS_MOUNT_LOCAL_FCNTL 0x200000 | ||
| 72 | 76 | ||
| 73 | #endif | 77 | #endif |
diff --git a/include/linux/nfs_page.h b/include/linux/nfs_page.h index 3c60685d972b..f8b60e7f4c44 100644 --- a/include/linux/nfs_page.h +++ b/include/linux/nfs_page.h | |||
| @@ -39,6 +39,7 @@ struct nfs_page { | |||
| 39 | struct list_head wb_list; /* Defines state of page: */ | 39 | struct list_head wb_list; /* Defines state of page: */ |
| 40 | struct page *wb_page; /* page to read in/write out */ | 40 | struct page *wb_page; /* page to read in/write out */ |
| 41 | struct nfs_open_context *wb_context; /* File state context info */ | 41 | struct nfs_open_context *wb_context; /* File state context info */ |
| 42 | struct nfs_lock_context *wb_lock_context; /* lock context info */ | ||
| 42 | atomic_t wb_complete; /* i/os we're waiting for */ | 43 | atomic_t wb_complete; /* i/os we're waiting for */ |
| 43 | pgoff_t wb_index; /* Offset >> PAGE_CACHE_SHIFT */ | 44 | pgoff_t wb_index; /* Offset >> PAGE_CACHE_SHIFT */ |
| 44 | unsigned int wb_offset, /* Offset & ~PAGE_CACHE_MASK */ | 45 | unsigned int wb_offset, /* Offset & ~PAGE_CACHE_MASK */ |
diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h index 51914d7d6cc4..ba6cc8f223c9 100644 --- a/include/linux/nfs_xdr.h +++ b/include/linux/nfs_xdr.h | |||
| @@ -112,7 +112,9 @@ struct nfs_fsinfo { | |||
| 112 | __u32 wtmult; /* writes should be multiple of this */ | 112 | __u32 wtmult; /* writes should be multiple of this */ |
| 113 | __u32 dtpref; /* pref. readdir transfer size */ | 113 | __u32 dtpref; /* pref. readdir transfer size */ |
| 114 | __u64 maxfilesize; | 114 | __u64 maxfilesize; |
| 115 | struct timespec time_delta; /* server time granularity */ | ||
| 115 | __u32 lease_time; /* in seconds */ | 116 | __u32 lease_time; /* in seconds */ |
| 117 | __u32 layouttype; /* supported pnfs layout driver */ | ||
| 116 | }; | 118 | }; |
| 117 | 119 | ||
| 118 | struct nfs_fsstat { | 120 | struct nfs_fsstat { |
| @@ -170,7 +172,7 @@ struct nfs4_sequence_args { | |||
| 170 | 172 | ||
| 171 | struct nfs4_sequence_res { | 173 | struct nfs4_sequence_res { |
| 172 | struct nfs4_session *sr_session; | 174 | struct nfs4_session *sr_session; |
| 173 | u8 sr_slotid; /* slot used to send request */ | 175 | struct nfs4_slot *sr_slot; /* slot used to send request */ |
| 174 | int sr_status; /* sequence operation status */ | 176 | int sr_status; /* sequence operation status */ |
| 175 | unsigned long sr_renewal_time; | 177 | unsigned long sr_renewal_time; |
| 176 | u32 sr_status_flags; | 178 | u32 sr_status_flags; |
| @@ -185,6 +187,55 @@ struct nfs4_get_lease_time_res { | |||
| 185 | struct nfs4_sequence_res lr_seq_res; | 187 | struct nfs4_sequence_res lr_seq_res; |
| 186 | }; | 188 | }; |
| 187 | 189 | ||
| 190 | #define PNFS_LAYOUT_MAXSIZE 4096 | ||
| 191 | |||
| 192 | struct nfs4_layoutdriver_data { | ||
| 193 | __u32 len; | ||
| 194 | void *buf; | ||
| 195 | }; | ||
| 196 | |||
| 197 | struct pnfs_layout_range { | ||
| 198 | u32 iomode; | ||
| 199 | u64 offset; | ||
| 200 | u64 length; | ||
| 201 | }; | ||
| 202 | |||
| 203 | struct nfs4_layoutget_args { | ||
| 204 | __u32 type; | ||
| 205 | struct pnfs_layout_range range; | ||
| 206 | __u64 minlength; | ||
| 207 | __u32 maxcount; | ||
| 208 | struct inode *inode; | ||
| 209 | struct nfs_open_context *ctx; | ||
| 210 | struct nfs4_sequence_args seq_args; | ||
| 211 | }; | ||
| 212 | |||
| 213 | struct nfs4_layoutget_res { | ||
| 214 | __u32 return_on_close; | ||
| 215 | struct pnfs_layout_range range; | ||
| 216 | __u32 type; | ||
| 217 | nfs4_stateid stateid; | ||
| 218 | struct nfs4_layoutdriver_data layout; | ||
| 219 | struct nfs4_sequence_res seq_res; | ||
| 220 | }; | ||
| 221 | |||
| 222 | struct nfs4_layoutget { | ||
| 223 | struct nfs4_layoutget_args args; | ||
| 224 | struct nfs4_layoutget_res res; | ||
| 225 | struct pnfs_layout_segment **lsegpp; | ||
| 226 | int status; | ||
| 227 | }; | ||
| 228 | |||
| 229 | struct nfs4_getdeviceinfo_args { | ||
| 230 | struct pnfs_device *pdev; | ||
| 231 | struct nfs4_sequence_args seq_args; | ||
| 232 | }; | ||
| 233 | |||
| 234 | struct nfs4_getdeviceinfo_res { | ||
| 235 | struct pnfs_device *pdev; | ||
| 236 | struct nfs4_sequence_res seq_res; | ||
| 237 | }; | ||
| 238 | |||
| 188 | /* | 239 | /* |
| 189 | * Arguments to the open call. | 240 | * Arguments to the open call. |
| 190 | */ | 241 | */ |
| @@ -196,8 +247,10 @@ struct nfs_openargs { | |||
| 196 | __u64 clientid; | 247 | __u64 clientid; |
| 197 | __u64 id; | 248 | __u64 id; |
| 198 | union { | 249 | union { |
| 199 | struct iattr * attrs; /* UNCHECKED, GUARDED */ | 250 | struct { |
| 200 | nfs4_verifier verifier; /* EXCLUSIVE */ | 251 | struct iattr * attrs; /* UNCHECKED, GUARDED */ |
| 252 | nfs4_verifier verifier; /* EXCLUSIVE */ | ||
| 253 | }; | ||
| 201 | nfs4_stateid delegation; /* CLAIM_DELEGATE_CUR */ | 254 | nfs4_stateid delegation; /* CLAIM_DELEGATE_CUR */ |
| 202 | fmode_t delegation_type; /* CLAIM_PREVIOUS */ | 255 | fmode_t delegation_type; /* CLAIM_PREVIOUS */ |
| 203 | } u; | 256 | } u; |
| @@ -313,6 +366,10 @@ struct nfs_lockt_res { | |||
| 313 | struct nfs4_sequence_res seq_res; | 366 | struct nfs4_sequence_res seq_res; |
| 314 | }; | 367 | }; |
| 315 | 368 | ||
| 369 | struct nfs_release_lockowner_args { | ||
| 370 | struct nfs_lowner lock_owner; | ||
| 371 | }; | ||
| 372 | |||
| 316 | struct nfs4_delegreturnargs { | 373 | struct nfs4_delegreturnargs { |
| 317 | const struct nfs_fh *fhandle; | 374 | const struct nfs_fh *fhandle; |
| 318 | const nfs4_stateid *stateid; | 375 | const nfs4_stateid *stateid; |
| @@ -332,6 +389,7 @@ struct nfs4_delegreturnres { | |||
| 332 | struct nfs_readargs { | 389 | struct nfs_readargs { |
| 333 | struct nfs_fh * fh; | 390 | struct nfs_fh * fh; |
| 334 | struct nfs_open_context *context; | 391 | struct nfs_open_context *context; |
| 392 | struct nfs_lock_context *lock_context; | ||
| 335 | __u64 offset; | 393 | __u64 offset; |
| 336 | __u32 count; | 394 | __u32 count; |
| 337 | unsigned int pgbase; | 395 | unsigned int pgbase; |
| @@ -352,6 +410,7 @@ struct nfs_readres { | |||
| 352 | struct nfs_writeargs { | 410 | struct nfs_writeargs { |
| 353 | struct nfs_fh * fh; | 411 | struct nfs_fh * fh; |
| 354 | struct nfs_open_context *context; | 412 | struct nfs_open_context *context; |
| 413 | struct nfs_lock_context *lock_context; | ||
| 355 | __u64 offset; | 414 | __u64 offset; |
| 356 | __u32 count; | 415 | __u32 count; |
| 357 | enum nfs3_stable_how stable; | 416 | enum nfs3_stable_how stable; |
| @@ -392,6 +451,27 @@ struct nfs_removeres { | |||
| 392 | }; | 451 | }; |
| 393 | 452 | ||
| 394 | /* | 453 | /* |
| 454 | * Common arguments to the rename call | ||
| 455 | */ | ||
| 456 | struct nfs_renameargs { | ||
| 457 | const struct nfs_fh *old_dir; | ||
| 458 | const struct nfs_fh *new_dir; | ||
| 459 | const struct qstr *old_name; | ||
| 460 | const struct qstr *new_name; | ||
| 461 | const u32 *bitmask; | ||
| 462 | struct nfs4_sequence_args seq_args; | ||
| 463 | }; | ||
| 464 | |||
| 465 | struct nfs_renameres { | ||
| 466 | const struct nfs_server *server; | ||
| 467 | struct nfs4_change_info old_cinfo; | ||
| 468 | struct nfs_fattr *old_fattr; | ||
| 469 | struct nfs4_change_info new_cinfo; | ||
| 470 | struct nfs_fattr *new_fattr; | ||
| 471 | struct nfs4_sequence_res seq_res; | ||
| 472 | }; | ||
| 473 | |||
| 474 | /* | ||
| 395 | * Argument struct for decode_entry function | 475 | * Argument struct for decode_entry function |
| 396 | */ | 476 | */ |
| 397 | struct nfs_entry { | 477 | struct nfs_entry { |
| @@ -426,15 +506,6 @@ struct nfs_createargs { | |||
| 426 | struct iattr * sattr; | 506 | struct iattr * sattr; |
| 427 | }; | 507 | }; |
| 428 | 508 | ||
| 429 | struct nfs_renameargs { | ||
| 430 | struct nfs_fh * fromfh; | ||
| 431 | const char * fromname; | ||
| 432 | unsigned int fromlen; | ||
| 433 | struct nfs_fh * tofh; | ||
| 434 | const char * toname; | ||
| 435 | unsigned int tolen; | ||
| 436 | }; | ||
| 437 | |||
| 438 | struct nfs_setattrargs { | 509 | struct nfs_setattrargs { |
| 439 | struct nfs_fh * fh; | 510 | struct nfs_fh * fh; |
| 440 | nfs4_stateid stateid; | 511 | nfs4_stateid stateid; |
| @@ -578,15 +649,6 @@ struct nfs3_mknodargs { | |||
| 578 | dev_t rdev; | 649 | dev_t rdev; |
| 579 | }; | 650 | }; |
| 580 | 651 | ||
| 581 | struct nfs3_renameargs { | ||
| 582 | struct nfs_fh * fromfh; | ||
| 583 | const char * fromname; | ||
| 584 | unsigned int fromlen; | ||
| 585 | struct nfs_fh * tofh; | ||
| 586 | const char * toname; | ||
| 587 | unsigned int tolen; | ||
| 588 | }; | ||
| 589 | |||
| 590 | struct nfs3_linkargs { | 652 | struct nfs3_linkargs { |
| 591 | struct nfs_fh * fromfh; | 653 | struct nfs_fh * fromfh; |
| 592 | struct nfs_fh * tofh; | 654 | struct nfs_fh * tofh; |
| @@ -621,11 +683,6 @@ struct nfs3_readlinkargs { | |||
| 621 | struct page ** pages; | 683 | struct page ** pages; |
| 622 | }; | 684 | }; |
| 623 | 685 | ||
| 624 | struct nfs3_renameres { | ||
| 625 | struct nfs_fattr * fromattr; | ||
| 626 | struct nfs_fattr * toattr; | ||
| 627 | }; | ||
| 628 | |||
| 629 | struct nfs3_linkres { | 686 | struct nfs3_linkres { |
| 630 | struct nfs_fattr * dir_attr; | 687 | struct nfs_fattr * dir_attr; |
| 631 | struct nfs_fattr * fattr; | 688 | struct nfs_fattr * fattr; |
| @@ -772,6 +829,7 @@ struct nfs4_readdir_arg { | |||
| 772 | struct page ** pages; /* zero-copy data */ | 829 | struct page ** pages; /* zero-copy data */ |
| 773 | unsigned int pgbase; /* zero-copy data */ | 830 | unsigned int pgbase; /* zero-copy data */ |
| 774 | const u32 * bitmask; | 831 | const u32 * bitmask; |
| 832 | int plus; | ||
| 775 | struct nfs4_sequence_args seq_args; | 833 | struct nfs4_sequence_args seq_args; |
| 776 | }; | 834 | }; |
| 777 | 835 | ||
| @@ -793,24 +851,6 @@ struct nfs4_readlink_res { | |||
| 793 | struct nfs4_sequence_res seq_res; | 851 | struct nfs4_sequence_res seq_res; |
| 794 | }; | 852 | }; |
| 795 | 853 | ||
| 796 | struct nfs4_rename_arg { | ||
| 797 | const struct nfs_fh * old_dir; | ||
| 798 | const struct nfs_fh * new_dir; | ||
| 799 | const struct qstr * old_name; | ||
| 800 | const struct qstr * new_name; | ||
| 801 | const u32 * bitmask; | ||
| 802 | struct nfs4_sequence_args seq_args; | ||
| 803 | }; | ||
| 804 | |||
| 805 | struct nfs4_rename_res { | ||
| 806 | const struct nfs_server * server; | ||
| 807 | struct nfs4_change_info old_cinfo; | ||
| 808 | struct nfs_fattr * old_fattr; | ||
| 809 | struct nfs4_change_info new_cinfo; | ||
| 810 | struct nfs_fattr * new_fattr; | ||
| 811 | struct nfs4_sequence_res seq_res; | ||
| 812 | }; | ||
| 813 | |||
| 814 | #define NFS4_SETCLIENTID_NAMELEN (127) | 854 | #define NFS4_SETCLIENTID_NAMELEN (127) |
| 815 | struct nfs4_setclientid { | 855 | struct nfs4_setclientid { |
| 816 | const nfs4_verifier * sc_verifier; | 856 | const nfs4_verifier * sc_verifier; |
| @@ -1024,19 +1064,21 @@ struct nfs_rpc_ops { | |||
| 1024 | int (*readlink)(struct inode *, struct page *, unsigned int, | 1064 | int (*readlink)(struct inode *, struct page *, unsigned int, |
| 1025 | unsigned int); | 1065 | unsigned int); |
| 1026 | int (*create) (struct inode *, struct dentry *, | 1066 | int (*create) (struct inode *, struct dentry *, |
| 1027 | struct iattr *, int, struct nameidata *); | 1067 | struct iattr *, int, struct nfs_open_context *); |
| 1028 | int (*remove) (struct inode *, struct qstr *); | 1068 | int (*remove) (struct inode *, struct qstr *); |
| 1029 | void (*unlink_setup) (struct rpc_message *, struct inode *dir); | 1069 | void (*unlink_setup) (struct rpc_message *, struct inode *dir); |
| 1030 | int (*unlink_done) (struct rpc_task *, struct inode *); | 1070 | int (*unlink_done) (struct rpc_task *, struct inode *); |
| 1031 | int (*rename) (struct inode *, struct qstr *, | 1071 | int (*rename) (struct inode *, struct qstr *, |
| 1032 | struct inode *, struct qstr *); | 1072 | struct inode *, struct qstr *); |
| 1073 | void (*rename_setup) (struct rpc_message *msg, struct inode *dir); | ||
| 1074 | int (*rename_done) (struct rpc_task *task, struct inode *old_dir, struct inode *new_dir); | ||
| 1033 | int (*link) (struct inode *, struct inode *, struct qstr *); | 1075 | int (*link) (struct inode *, struct inode *, struct qstr *); |
| 1034 | int (*symlink) (struct inode *, struct dentry *, struct page *, | 1076 | int (*symlink) (struct inode *, struct dentry *, struct page *, |
| 1035 | unsigned int, struct iattr *); | 1077 | unsigned int, struct iattr *); |
| 1036 | int (*mkdir) (struct inode *, struct dentry *, struct iattr *); | 1078 | int (*mkdir) (struct inode *, struct dentry *, struct iattr *); |
| 1037 | int (*rmdir) (struct inode *, struct qstr *); | 1079 | int (*rmdir) (struct inode *, struct qstr *); |
| 1038 | int (*readdir) (struct dentry *, struct rpc_cred *, | 1080 | int (*readdir) (struct dentry *, struct rpc_cred *, |
| 1039 | u64, struct page *, unsigned int, int); | 1081 | u64, struct page **, unsigned int, int); |
| 1040 | int (*mknod) (struct inode *, struct dentry *, struct iattr *, | 1082 | int (*mknod) (struct inode *, struct dentry *, struct iattr *, |
| 1041 | dev_t); | 1083 | dev_t); |
| 1042 | int (*statfs) (struct nfs_server *, struct nfs_fh *, | 1084 | int (*statfs) (struct nfs_server *, struct nfs_fh *, |
| @@ -1046,7 +1088,7 @@ struct nfs_rpc_ops { | |||
| 1046 | int (*pathconf) (struct nfs_server *, struct nfs_fh *, | 1088 | int (*pathconf) (struct nfs_server *, struct nfs_fh *, |
| 1047 | struct nfs_pathconf *); | 1089 | struct nfs_pathconf *); |
| 1048 | int (*set_capabilities)(struct nfs_server *, struct nfs_fh *); | 1090 | int (*set_capabilities)(struct nfs_server *, struct nfs_fh *); |
| 1049 | __be32 *(*decode_dirent)(__be32 *, struct nfs_entry *, int plus); | 1091 | __be32 *(*decode_dirent)(struct xdr_stream *, struct nfs_entry *, struct nfs_server *, int plus); |
| 1050 | void (*read_setup) (struct nfs_read_data *, struct rpc_message *); | 1092 | void (*read_setup) (struct nfs_read_data *, struct rpc_message *); |
| 1051 | int (*read_done) (struct rpc_task *, struct nfs_read_data *); | 1093 | int (*read_done) (struct rpc_task *, struct nfs_read_data *); |
| 1052 | void (*write_setup) (struct nfs_write_data *, struct rpc_message *); | 1094 | void (*write_setup) (struct nfs_write_data *, struct rpc_message *); |
| @@ -1057,6 +1099,10 @@ struct nfs_rpc_ops { | |||
| 1057 | int (*lock_check_bounds)(const struct file_lock *); | 1099 | int (*lock_check_bounds)(const struct file_lock *); |
| 1058 | void (*clear_acl_cache)(struct inode *); | 1100 | void (*clear_acl_cache)(struct inode *); |
| 1059 | void (*close_context)(struct nfs_open_context *ctx, int); | 1101 | void (*close_context)(struct nfs_open_context *ctx, int); |
| 1102 | struct inode * (*open_context) (struct inode *dir, | ||
| 1103 | struct nfs_open_context *ctx, | ||
| 1104 | int open_flags, | ||
| 1105 | struct iattr *iattr); | ||
| 1060 | }; | 1106 | }; |
| 1061 | 1107 | ||
| 1062 | /* | 1108 | /* |
diff --git a/include/linux/nfsd/Kbuild b/include/linux/nfsd/Kbuild index fc972048e572..55d1467de3c1 100644 --- a/include/linux/nfsd/Kbuild +++ b/include/linux/nfsd/Kbuild | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | unifdef-y += const.h | 1 | header-y += const.h |
| 2 | unifdef-y += debug.h | 2 | header-y += debug.h |
| 3 | unifdef-y += export.h | 3 | header-y += export.h |
| 4 | unifdef-y += nfsfh.h | 4 | header-y += nfsfh.h |
| 5 | unifdef-y += stats.h | 5 | header-y += stats.h |
| 6 | unifdef-y += syscall.h | 6 | header-y += syscall.h |
diff --git a/include/linux/nilfs2_fs.h b/include/linux/nilfs2_fs.h index 8c2c6116e788..227e49dd5720 100644 --- a/include/linux/nilfs2_fs.h +++ b/include/linux/nilfs2_fs.h | |||
| @@ -4,16 +4,16 @@ | |||
| 4 | * Copyright (C) 2005-2008 Nippon Telegraph and Telephone Corporation. | 4 | * Copyright (C) 2005-2008 Nippon Telegraph and Telephone Corporation. |
| 5 | * | 5 | * |
| 6 | * This program is free software; you can redistribute it and/or modify | 6 | * This program is free software; you can redistribute it and/or modify |
| 7 | * it under the terms of the GNU General Public License as published by | 7 | * it under the terms of the GNU Lesser General Public License as published |
| 8 | * the Free Software Foundation; either version 2 of the License, or | 8 | * by the Free Software Foundation; either version 2.1 of the License, or |
| 9 | * (at your option) any later version. | 9 | * (at your option) any later version. |
| 10 | * | 10 | * |
| 11 | * This program is distributed in the hope that it will be useful, | 11 | * This program is distributed in the hope that it will be useful, |
| 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 14 | * GNU General Public License for more details. | 14 | * GNU Lesser General Public License for more details. |
| 15 | * | 15 | * |
| 16 | * You should have received a copy of the GNU General Public License | 16 | * You should have received a copy of the GNU Lesser General Public License |
| 17 | * along with this program; if not, write to the Free Software | 17 | * along with this program; if not, write to the Free Software |
| 18 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | 18 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
| 19 | * | 19 | * |
| @@ -147,7 +147,6 @@ struct nilfs_super_root { | |||
| 147 | #define NILFS_MOUNT_ERRORS_CONT 0x0010 /* Continue on errors */ | 147 | #define NILFS_MOUNT_ERRORS_CONT 0x0010 /* Continue on errors */ |
| 148 | #define NILFS_MOUNT_ERRORS_RO 0x0020 /* Remount fs ro on errors */ | 148 | #define NILFS_MOUNT_ERRORS_RO 0x0020 /* Remount fs ro on errors */ |
| 149 | #define NILFS_MOUNT_ERRORS_PANIC 0x0040 /* Panic on errors */ | 149 | #define NILFS_MOUNT_ERRORS_PANIC 0x0040 /* Panic on errors */ |
| 150 | #define NILFS_MOUNT_SNAPSHOT 0x0080 /* Snapshot flag */ | ||
| 151 | #define NILFS_MOUNT_BARRIER 0x1000 /* Use block barriers */ | 150 | #define NILFS_MOUNT_BARRIER 0x1000 /* Use block barriers */ |
| 152 | #define NILFS_MOUNT_STRICT_ORDER 0x2000 /* Apply strict in-order | 151 | #define NILFS_MOUNT_STRICT_ORDER 0x2000 /* Apply strict in-order |
| 153 | semantics also for data */ | 152 | semantics also for data */ |
| @@ -160,7 +159,7 @@ struct nilfs_super_root { | |||
| 160 | * struct nilfs_super_block - structure of super block on disk | 159 | * struct nilfs_super_block - structure of super block on disk |
| 161 | */ | 160 | */ |
| 162 | struct nilfs_super_block { | 161 | struct nilfs_super_block { |
| 163 | __le32 s_rev_level; /* Revision level */ | 162 | /*00*/ __le32 s_rev_level; /* Revision level */ |
| 164 | __le16 s_minor_rev_level; /* minor revision level */ | 163 | __le16 s_minor_rev_level; /* minor revision level */ |
| 165 | __le16 s_magic; /* Magic signature */ | 164 | __le16 s_magic; /* Magic signature */ |
| 166 | 165 | ||
| @@ -169,50 +168,53 @@ struct nilfs_super_block { | |||
| 169 | is excluded. */ | 168 | is excluded. */ |
| 170 | __le16 s_flags; /* flags */ | 169 | __le16 s_flags; /* flags */ |
| 171 | __le32 s_crc_seed; /* Seed value of CRC calculation */ | 170 | __le32 s_crc_seed; /* Seed value of CRC calculation */ |
| 172 | __le32 s_sum; /* Check sum of super block */ | 171 | /*10*/ __le32 s_sum; /* Check sum of super block */ |
| 173 | 172 | ||
| 174 | __le32 s_log_block_size; /* Block size represented as follows | 173 | __le32 s_log_block_size; /* Block size represented as follows |
| 175 | blocksize = | 174 | blocksize = |
| 176 | 1 << (s_log_block_size + 10) */ | 175 | 1 << (s_log_block_size + 10) */ |
| 177 | __le64 s_nsegments; /* Number of segments in filesystem */ | 176 | __le64 s_nsegments; /* Number of segments in filesystem */ |
| 178 | __le64 s_dev_size; /* block device size in bytes */ | 177 | /*20*/ __le64 s_dev_size; /* block device size in bytes */ |
| 179 | __le64 s_first_data_block; /* 1st seg disk block number */ | 178 | __le64 s_first_data_block; /* 1st seg disk block number */ |
| 180 | __le32 s_blocks_per_segment; /* number of blocks per full segment */ | 179 | /*30*/ __le32 s_blocks_per_segment; /* number of blocks per full segment */ |
| 181 | __le32 s_r_segments_percentage; /* Reserved segments percentage */ | 180 | __le32 s_r_segments_percentage; /* Reserved segments percentage */ |
| 182 | 181 | ||
| 183 | __le64 s_last_cno; /* Last checkpoint number */ | 182 | __le64 s_last_cno; /* Last checkpoint number */ |
| 184 | __le64 s_last_pseg; /* disk block addr pseg written last */ | 183 | /*40*/ __le64 s_last_pseg; /* disk block addr pseg written last */ |
| 185 | __le64 s_last_seq; /* seq. number of seg written last */ | 184 | __le64 s_last_seq; /* seq. number of seg written last */ |
| 186 | __le64 s_free_blocks_count; /* Free blocks count */ | 185 | /*50*/ __le64 s_free_blocks_count; /* Free blocks count */ |
| 187 | 186 | ||
| 188 | __le64 s_ctime; /* Creation time (execution time of | 187 | __le64 s_ctime; /* Creation time (execution time of |
| 189 | newfs) */ | 188 | newfs) */ |
| 190 | __le64 s_mtime; /* Mount time */ | 189 | /*60*/ __le64 s_mtime; /* Mount time */ |
| 191 | __le64 s_wtime; /* Write time */ | 190 | __le64 s_wtime; /* Write time */ |
| 192 | __le16 s_mnt_count; /* Mount count */ | 191 | /*70*/ __le16 s_mnt_count; /* Mount count */ |
| 193 | __le16 s_max_mnt_count; /* Maximal mount count */ | 192 | __le16 s_max_mnt_count; /* Maximal mount count */ |
| 194 | __le16 s_state; /* File system state */ | 193 | __le16 s_state; /* File system state */ |
| 195 | __le16 s_errors; /* Behaviour when detecting errors */ | 194 | __le16 s_errors; /* Behaviour when detecting errors */ |
| 196 | __le64 s_lastcheck; /* time of last check */ | 195 | __le64 s_lastcheck; /* time of last check */ |
| 197 | 196 | ||
| 198 | __le32 s_checkinterval; /* max. time between checks */ | 197 | /*80*/ __le32 s_checkinterval; /* max. time between checks */ |
| 199 | __le32 s_creator_os; /* OS */ | 198 | __le32 s_creator_os; /* OS */ |
| 200 | __le16 s_def_resuid; /* Default uid for reserved blocks */ | 199 | __le16 s_def_resuid; /* Default uid for reserved blocks */ |
| 201 | __le16 s_def_resgid; /* Default gid for reserved blocks */ | 200 | __le16 s_def_resgid; /* Default gid for reserved blocks */ |
| 202 | __le32 s_first_ino; /* First non-reserved inode */ | 201 | __le32 s_first_ino; /* First non-reserved inode */ |
| 203 | 202 | ||
| 204 | __le16 s_inode_size; /* Size of an inode */ | 203 | /*90*/ __le16 s_inode_size; /* Size of an inode */ |
| 205 | __le16 s_dat_entry_size; /* Size of a dat entry */ | 204 | __le16 s_dat_entry_size; /* Size of a dat entry */ |
| 206 | __le16 s_checkpoint_size; /* Size of a checkpoint */ | 205 | __le16 s_checkpoint_size; /* Size of a checkpoint */ |
| 207 | __le16 s_segment_usage_size; /* Size of a segment usage */ | 206 | __le16 s_segment_usage_size; /* Size of a segment usage */ |
| 208 | 207 | ||
| 209 | __u8 s_uuid[16]; /* 128-bit uuid for volume */ | 208 | /*98*/ __u8 s_uuid[16]; /* 128-bit uuid for volume */ |
| 210 | char s_volume_name[80]; /* volume name */ | 209 | /*A8*/ char s_volume_name[80]; /* volume name */ |
| 211 | 210 | ||
| 212 | __le32 s_c_interval; /* Commit interval of segment */ | 211 | /*F8*/ __le32 s_c_interval; /* Commit interval of segment */ |
| 213 | __le32 s_c_block_max; /* Threshold of data amount for | 212 | __le32 s_c_block_max; /* Threshold of data amount for |
| 214 | the segment construction */ | 213 | the segment construction */ |
| 215 | __u32 s_reserved[192]; /* padding to the end of the block */ | 214 | /*100*/ __le64 s_feature_compat; /* Compatible feature set */ |
| 215 | __le64 s_feature_compat_ro; /* Read-only compatible feature set */ | ||
| 216 | __le64 s_feature_incompat; /* Incompatible feature set */ | ||
| 217 | __u32 s_reserved[186]; /* padding to the end of the block */ | ||
| 216 | }; | 218 | }; |
| 217 | 219 | ||
| 218 | /* | 220 | /* |
| @@ -226,6 +228,17 @@ struct nilfs_super_block { | |||
| 226 | */ | 228 | */ |
| 227 | #define NILFS_CURRENT_REV 2 /* current major revision */ | 229 | #define NILFS_CURRENT_REV 2 /* current major revision */ |
| 228 | #define NILFS_MINOR_REV 0 /* minor revision */ | 230 | #define NILFS_MINOR_REV 0 /* minor revision */ |
| 231 | #define NILFS_MIN_SUPP_REV 2 /* minimum supported revision */ | ||
| 232 | |||
| 233 | /* | ||
| 234 | * Feature set definitions | ||
| 235 | * | ||
| 236 | * If there is a bit set in the incompatible feature set that the kernel | ||
| 237 | * doesn't know about, it should refuse to mount the filesystem. | ||
| 238 | */ | ||
| 239 | #define NILFS_FEATURE_COMPAT_SUPP 0ULL | ||
| 240 | #define NILFS_FEATURE_COMPAT_RO_SUPP 0ULL | ||
| 241 | #define NILFS_FEATURE_INCOMPAT_SUPP 0ULL | ||
| 229 | 242 | ||
| 230 | /* | 243 | /* |
| 231 | * Bytes count of super_block for CRC-calculation | 244 | * Bytes count of super_block for CRC-calculation |
| @@ -257,6 +270,14 @@ struct nilfs_super_block { | |||
| 257 | segments */ | 270 | segments */ |
| 258 | 271 | ||
| 259 | /* | 272 | /* |
| 273 | * We call DAT, cpfile, and sufile root metadata files. Inodes of | ||
| 274 | * these files are written in super root block instead of ifile, and | ||
| 275 | * garbage collector doesn't keep any past versions of these files. | ||
| 276 | */ | ||
| 277 | #define NILFS_ROOT_METADATA_FILE(ino) \ | ||
| 278 | ((ino) >= NILFS_DAT_INO && (ino) <= NILFS_SUFILE_INO) | ||
| 279 | |||
| 280 | /* | ||
| 260 | * bytes offset of secondary super block | 281 | * bytes offset of secondary super block |
| 261 | */ | 282 | */ |
| 262 | #define NILFS_SB2_OFFSET_BYTES(devsize) ((((devsize) >> 12) - 1) << 12) | 283 | #define NILFS_SB2_OFFSET_BYTES(devsize) ((((devsize) >> 12) - 1) << 12) |
| @@ -274,6 +295,12 @@ struct nilfs_super_block { | |||
| 274 | #define NILFS_NAME_LEN 255 | 295 | #define NILFS_NAME_LEN 255 |
| 275 | 296 | ||
| 276 | /* | 297 | /* |
| 298 | * Block size limitations | ||
| 299 | */ | ||
| 300 | #define NILFS_MIN_BLOCK_SIZE 1024 | ||
| 301 | #define NILFS_MAX_BLOCK_SIZE 65536 | ||
| 302 | |||
| 303 | /* | ||
| 277 | * The new version of the directory entry. Since V0 structures are | 304 | * The new version of the directory entry. Since V0 structures are |
| 278 | * stored in intel byte order, and the name_len field could never be | 305 | * stored in intel byte order, and the name_len field could never be |
| 279 | * bigger than 255 chars, it's safe to reclaim the extra byte for the | 306 | * bigger than 255 chars, it's safe to reclaim the extra byte for the |
| @@ -313,7 +340,25 @@ enum { | |||
| 313 | #define NILFS_DIR_ROUND (NILFS_DIR_PAD - 1) | 340 | #define NILFS_DIR_ROUND (NILFS_DIR_PAD - 1) |
| 314 | #define NILFS_DIR_REC_LEN(name_len) (((name_len) + 12 + NILFS_DIR_ROUND) & \ | 341 | #define NILFS_DIR_REC_LEN(name_len) (((name_len) + 12 + NILFS_DIR_ROUND) & \ |
| 315 | ~NILFS_DIR_ROUND) | 342 | ~NILFS_DIR_ROUND) |
| 343 | #define NILFS_MAX_REC_LEN ((1<<16)-1) | ||
| 344 | |||
| 345 | static inline unsigned nilfs_rec_len_from_disk(__le16 dlen) | ||
| 346 | { | ||
| 347 | unsigned len = le16_to_cpu(dlen); | ||
| 316 | 348 | ||
| 349 | if (len == NILFS_MAX_REC_LEN) | ||
| 350 | return 1 << 16; | ||
| 351 | return len; | ||
| 352 | } | ||
| 353 | |||
| 354 | static inline __le16 nilfs_rec_len_to_disk(unsigned len) | ||
| 355 | { | ||
| 356 | if (len == (1 << 16)) | ||
| 357 | return cpu_to_le16(NILFS_MAX_REC_LEN); | ||
| 358 | else if (len > (1 << 16)) | ||
| 359 | BUG(); | ||
| 360 | return cpu_to_le16(len); | ||
| 361 | } | ||
| 317 | 362 | ||
| 318 | /** | 363 | /** |
| 319 | * struct nilfs_finfo - file information | 364 | * struct nilfs_finfo - file information |
diff --git a/include/linux/nl80211.h b/include/linux/nl80211.h index b7c77f9712f4..0edb2566c14c 100644 --- a/include/linux/nl80211.h +++ b/include/linux/nl80211.h | |||
| @@ -40,6 +40,43 @@ | |||
| 40 | */ | 40 | */ |
| 41 | 41 | ||
| 42 | /** | 42 | /** |
| 43 | * DOC: Frame transmission/registration support | ||
| 44 | * | ||
| 45 | * Frame transmission and registration support exists to allow userspace | ||
| 46 | * management entities such as wpa_supplicant react to management frames | ||
| 47 | * that are not being handled by the kernel. This includes, for example, | ||
| 48 | * certain classes of action frames that cannot be handled in the kernel | ||
| 49 | * for various reasons. | ||
| 50 | * | ||
| 51 | * Frame registration is done on a per-interface basis and registrations | ||
| 52 | * cannot be removed other than by closing the socket. It is possible to | ||
| 53 | * specify a registration filter to register, for example, only for a | ||
| 54 | * certain type of action frame. In particular with action frames, those | ||
| 55 | * that userspace registers for will not be returned as unhandled by the | ||
| 56 | * driver, so that the registered application has to take responsibility | ||
| 57 | * for doing that. | ||
| 58 | * | ||
| 59 | * The type of frame that can be registered for is also dependent on the | ||
| 60 | * driver and interface type. The frame types are advertised in wiphy | ||
| 61 | * attributes so applications know what to expect. | ||
| 62 | * | ||
| 63 | * NOTE: When an interface changes type while registrations are active, | ||
| 64 | * these registrations are ignored until the interface type is | ||
| 65 | * changed again. This means that changing the interface type can | ||
| 66 | * lead to a situation that couldn't otherwise be produced, but | ||
| 67 | * any such registrations will be dormant in the sense that they | ||
| 68 | * will not be serviced, i.e. they will not receive any frames. | ||
| 69 | * | ||
| 70 | * Frame transmission allows userspace to send for example the required | ||
| 71 | * responses to action frames. It is subject to some sanity checking, | ||
| 72 | * but many frames can be transmitted. When a frame was transmitted, its | ||
| 73 | * status is indicated to the sending socket. | ||
| 74 | * | ||
| 75 | * For more technical details, see the corresponding command descriptions | ||
| 76 | * below. | ||
| 77 | */ | ||
| 78 | |||
| 79 | /** | ||
| 43 | * enum nl80211_commands - supported nl80211 commands | 80 | * enum nl80211_commands - supported nl80211 commands |
| 44 | * | 81 | * |
| 45 | * @NL80211_CMD_UNSPEC: unspecified command to catch errors | 82 | * @NL80211_CMD_UNSPEC: unspecified command to catch errors |
| @@ -132,7 +169,7 @@ | |||
| 132 | * %NL80211_ATTR_REG_RULE_POWER_MAX_ANT_GAIN and | 169 | * %NL80211_ATTR_REG_RULE_POWER_MAX_ANT_GAIN and |
| 133 | * %NL80211_ATTR_REG_RULE_POWER_MAX_EIRP. | 170 | * %NL80211_ATTR_REG_RULE_POWER_MAX_EIRP. |
| 134 | * @NL80211_CMD_REQ_SET_REG: ask the wireless core to set the regulatory domain | 171 | * @NL80211_CMD_REQ_SET_REG: ask the wireless core to set the regulatory domain |
| 135 | * to the the specified ISO/IEC 3166-1 alpha2 country code. The core will | 172 | * to the specified ISO/IEC 3166-1 alpha2 country code. The core will |
| 136 | * store this as a valid request and then query userspace for it. | 173 | * store this as a valid request and then query userspace for it. |
| 137 | * | 174 | * |
| 138 | * @NL80211_CMD_GET_MESH_PARAMS: Get mesh networking properties for the | 175 | * @NL80211_CMD_GET_MESH_PARAMS: Get mesh networking properties for the |
| @@ -258,7 +295,9 @@ | |||
| 258 | * auth and assoc steps. For this, you need to specify the SSID in a | 295 | * auth and assoc steps. For this, you need to specify the SSID in a |
| 259 | * %NL80211_ATTR_SSID attribute, and can optionally specify the association | 296 | * %NL80211_ATTR_SSID attribute, and can optionally specify the association |
| 260 | * IEs in %NL80211_ATTR_IE, %NL80211_ATTR_AUTH_TYPE, %NL80211_ATTR_MAC, | 297 | * IEs in %NL80211_ATTR_IE, %NL80211_ATTR_AUTH_TYPE, %NL80211_ATTR_MAC, |
| 261 | * %NL80211_ATTR_WIPHY_FREQ and %NL80211_ATTR_CONTROL_PORT. | 298 | * %NL80211_ATTR_WIPHY_FREQ, %NL80211_ATTR_CONTROL_PORT, |
| 299 | * %NL80211_ATTR_CONTROL_PORT_ETHERTYPE and | ||
| 300 | * %NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT. | ||
| 262 | * It is also sent as an event, with the BSSID and response IEs when the | 301 | * It is also sent as an event, with the BSSID and response IEs when the |
| 263 | * connection is established or failed to be established. This can be | 302 | * connection is established or failed to be established. This can be |
| 264 | * determined by the STATUS_CODE attribute. | 303 | * determined by the STATUS_CODE attribute. |
| @@ -276,8 +315,8 @@ | |||
| 276 | * channel for the specified amount of time. This can be used to do | 315 | * channel for the specified amount of time. This can be used to do |
| 277 | * off-channel operations like transmit a Public Action frame and wait for | 316 | * off-channel operations like transmit a Public Action frame and wait for |
| 278 | * a response while being associated to an AP on another channel. | 317 | * a response while being associated to an AP on another channel. |
| 279 | * %NL80211_ATTR_WIPHY or %NL80211_ATTR_IFINDEX is used to specify which | 318 | * %NL80211_ATTR_IFINDEX is used to specify which interface (and thus |
| 280 | * radio is used. %NL80211_ATTR_WIPHY_FREQ is used to specify the | 319 | * radio) is used. %NL80211_ATTR_WIPHY_FREQ is used to specify the |
| 281 | * frequency for the operation and %NL80211_ATTR_WIPHY_CHANNEL_TYPE may be | 320 | * frequency for the operation and %NL80211_ATTR_WIPHY_CHANNEL_TYPE may be |
| 282 | * optionally used to specify additional channel parameters. | 321 | * optionally used to specify additional channel parameters. |
| 283 | * %NL80211_ATTR_DURATION is used to specify the duration in milliseconds | 322 | * %NL80211_ATTR_DURATION is used to specify the duration in milliseconds |
| @@ -301,16 +340,20 @@ | |||
| 301 | * rate selection. %NL80211_ATTR_IFINDEX is used to specify the interface | 340 | * rate selection. %NL80211_ATTR_IFINDEX is used to specify the interface |
| 302 | * and @NL80211_ATTR_TX_RATES the set of allowed rates. | 341 | * and @NL80211_ATTR_TX_RATES the set of allowed rates. |
| 303 | * | 342 | * |
| 304 | * @NL80211_CMD_REGISTER_ACTION: Register for receiving certain action frames | 343 | * @NL80211_CMD_REGISTER_FRAME: Register for receiving certain mgmt frames |
| 305 | * (via @NL80211_CMD_ACTION) for processing in userspace. This command | 344 | * (via @NL80211_CMD_FRAME) for processing in userspace. This command |
| 306 | * requires an interface index and a match attribute containing the first | 345 | * requires an interface index, a frame type attribute (optional for |
| 307 | * few bytes of the frame that should match, e.g. a single byte for only | 346 | * backward compatibility reasons, if not given assumes action frames) |
| 308 | * a category match or four bytes for vendor frames including the OUI. | 347 | * and a match attribute containing the first few bytes of the frame |
| 309 | * The registration cannot be dropped, but is removed automatically | 348 | * that should match, e.g. a single byte for only a category match or |
| 310 | * when the netlink socket is closed. Multiple registrations can be made. | 349 | * four bytes for vendor frames including the OUI. The registration |
| 311 | * @NL80211_CMD_ACTION: Action frame TX request and RX notification. This | 350 | * cannot be dropped, but is removed automatically when the netlink |
| 312 | * command is used both as a request to transmit an Action frame and as an | 351 | * socket is closed. Multiple registrations can be made. |
| 313 | * event indicating reception of an Action frame that was not processed in | 352 | * @NL80211_CMD_REGISTER_ACTION: Alias for @NL80211_CMD_REGISTER_FRAME for |
| 353 | * backward compatibility | ||
| 354 | * @NL80211_CMD_FRAME: Management frame TX request and RX notification. This | ||
| 355 | * command is used both as a request to transmit a management frame and | ||
| 356 | * as an event indicating reception of a frame that was not processed in | ||
| 314 | * kernel code, but is for us (i.e., which may need to be processed in a | 357 | * kernel code, but is for us (i.e., which may need to be processed in a |
| 315 | * user space application). %NL80211_ATTR_FRAME is used to specify the | 358 | * user space application). %NL80211_ATTR_FRAME is used to specify the |
| 316 | * frame contents (including header). %NL80211_ATTR_WIPHY_FREQ (and | 359 | * frame contents (including header). %NL80211_ATTR_WIPHY_FREQ (and |
| @@ -320,11 +363,14 @@ | |||
| 320 | * operational channel). When called, this operation returns a cookie | 363 | * operational channel). When called, this operation returns a cookie |
| 321 | * (%NL80211_ATTR_COOKIE) that will be included with the TX status event | 364 | * (%NL80211_ATTR_COOKIE) that will be included with the TX status event |
| 322 | * pertaining to the TX request. | 365 | * pertaining to the TX request. |
| 323 | * @NL80211_CMD_ACTION_TX_STATUS: Report TX status of an Action frame | 366 | * @NL80211_CMD_ACTION: Alias for @NL80211_CMD_FRAME for backward compatibility. |
| 324 | * transmitted with %NL80211_CMD_ACTION. %NL80211_ATTR_COOKIE identifies | 367 | * @NL80211_CMD_FRAME_TX_STATUS: Report TX status of a management frame |
| 368 | * transmitted with %NL80211_CMD_FRAME. %NL80211_ATTR_COOKIE identifies | ||
| 325 | * the TX command and %NL80211_ATTR_FRAME includes the contents of the | 369 | * the TX command and %NL80211_ATTR_FRAME includes the contents of the |
| 326 | * frame. %NL80211_ATTR_ACK flag is included if the recipient acknowledged | 370 | * frame. %NL80211_ATTR_ACK flag is included if the recipient acknowledged |
| 327 | * the frame. | 371 | * the frame. |
| 372 | * @NL80211_CMD_ACTION_TX_STATUS: Alias for @NL80211_CMD_FRAME_TX_STATUS for | ||
| 373 | * backward compatibility. | ||
| 328 | * @NL80211_CMD_SET_CQM: Connection quality monitor configuration. This command | 374 | * @NL80211_CMD_SET_CQM: Connection quality monitor configuration. This command |
| 329 | * is used to configure connection quality monitoring notification trigger | 375 | * is used to configure connection quality monitoring notification trigger |
| 330 | * levels. | 376 | * levels. |
| @@ -341,6 +387,8 @@ | |||
| 341 | * of any other interfaces, and other interfaces will again take | 387 | * of any other interfaces, and other interfaces will again take |
| 342 | * precedence when they are used. | 388 | * precedence when they are used. |
| 343 | * | 389 | * |
| 390 | * @NL80211_CMD_SET_WDS_PEER: Set the MAC address of the peer on a WDS interface. | ||
| 391 | * | ||
| 344 | * @NL80211_CMD_MAX: highest used command number | 392 | * @NL80211_CMD_MAX: highest used command number |
| 345 | * @__NL80211_CMD_AFTER_LAST: internal use | 393 | * @__NL80211_CMD_AFTER_LAST: internal use |
| 346 | */ | 394 | */ |
| @@ -429,9 +477,12 @@ enum nl80211_commands { | |||
| 429 | 477 | ||
| 430 | NL80211_CMD_SET_TX_BITRATE_MASK, | 478 | NL80211_CMD_SET_TX_BITRATE_MASK, |
| 431 | 479 | ||
| 432 | NL80211_CMD_REGISTER_ACTION, | 480 | NL80211_CMD_REGISTER_FRAME, |
| 433 | NL80211_CMD_ACTION, | 481 | NL80211_CMD_REGISTER_ACTION = NL80211_CMD_REGISTER_FRAME, |
| 434 | NL80211_CMD_ACTION_TX_STATUS, | 482 | NL80211_CMD_FRAME, |
| 483 | NL80211_CMD_ACTION = NL80211_CMD_FRAME, | ||
| 484 | NL80211_CMD_FRAME_TX_STATUS, | ||
| 485 | NL80211_CMD_ACTION_TX_STATUS = NL80211_CMD_FRAME_TX_STATUS, | ||
| 435 | 486 | ||
| 436 | NL80211_CMD_SET_POWER_SAVE, | 487 | NL80211_CMD_SET_POWER_SAVE, |
| 437 | NL80211_CMD_GET_POWER_SAVE, | 488 | NL80211_CMD_GET_POWER_SAVE, |
| @@ -440,6 +491,7 @@ enum nl80211_commands { | |||
| 440 | NL80211_CMD_NOTIFY_CQM, | 491 | NL80211_CMD_NOTIFY_CQM, |
| 441 | 492 | ||
| 442 | NL80211_CMD_SET_CHANNEL, | 493 | NL80211_CMD_SET_CHANNEL, |
| 494 | NL80211_CMD_SET_WDS_PEER, | ||
| 443 | 495 | ||
| 444 | /* add new commands above here */ | 496 | /* add new commands above here */ |
| 445 | 497 | ||
| @@ -639,6 +691,15 @@ enum nl80211_commands { | |||
| 639 | * request, the driver will assume that the port is unauthorized until | 691 | * request, the driver will assume that the port is unauthorized until |
| 640 | * authorized by user space. Otherwise, port is marked authorized by | 692 | * authorized by user space. Otherwise, port is marked authorized by |
| 641 | * default in station mode. | 693 | * default in station mode. |
| 694 | * @NL80211_ATTR_CONTROL_PORT_ETHERTYPE: A 16-bit value indicating the | ||
| 695 | * ethertype that will be used for key negotiation. It can be | ||
| 696 | * specified with the associate and connect commands. If it is not | ||
| 697 | * specified, the value defaults to 0x888E (PAE, 802.1X). This | ||
| 698 | * attribute is also used as a flag in the wiphy information to | ||
| 699 | * indicate that protocols other than PAE are supported. | ||
| 700 | * @NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT: When included along with | ||
| 701 | * %NL80211_ATTR_CONTROL_PORT_ETHERTYPE, indicates that the custom | ||
| 702 | * ethertype frames used for key negotiation must not be encrypted. | ||
| 642 | * | 703 | * |
| 643 | * @NL80211_ATTR_TESTDATA: Testmode data blob, passed through to the driver. | 704 | * @NL80211_ATTR_TESTDATA: Testmode data blob, passed through to the driver. |
| 644 | * We recommend using nested, driver-specific attributes within this. | 705 | * We recommend using nested, driver-specific attributes within this. |
| @@ -708,7 +769,16 @@ enum nl80211_commands { | |||
| 708 | * is used with %NL80211_CMD_SET_TX_BITRATE_MASK. | 769 | * is used with %NL80211_CMD_SET_TX_BITRATE_MASK. |
| 709 | * | 770 | * |
| 710 | * @NL80211_ATTR_FRAME_MATCH: A binary attribute which typically must contain | 771 | * @NL80211_ATTR_FRAME_MATCH: A binary attribute which typically must contain |
| 711 | * at least one byte, currently used with @NL80211_CMD_REGISTER_ACTION. | 772 | * at least one byte, currently used with @NL80211_CMD_REGISTER_FRAME. |
| 773 | * @NL80211_ATTR_FRAME_TYPE: A u16 indicating the frame type/subtype for the | ||
| 774 | * @NL80211_CMD_REGISTER_FRAME command. | ||
| 775 | * @NL80211_ATTR_TX_FRAME_TYPES: wiphy capability attribute, which is a | ||
| 776 | * nested attribute of %NL80211_ATTR_FRAME_TYPE attributes, containing | ||
| 777 | * information about which frame types can be transmitted with | ||
| 778 | * %NL80211_CMD_FRAME. | ||
| 779 | * @NL80211_ATTR_RX_FRAME_TYPES: wiphy capability attribute, which is a | ||
| 780 | * nested attribute of %NL80211_ATTR_FRAME_TYPE attributes, containing | ||
| 781 | * information about which frame types can be registered for RX. | ||
| 712 | * | 782 | * |
| 713 | * @NL80211_ATTR_ACK: Flag attribute indicating that the frame was | 783 | * @NL80211_ATTR_ACK: Flag attribute indicating that the frame was |
| 714 | * acknowledged by the recipient. | 784 | * acknowledged by the recipient. |
| @@ -725,6 +795,15 @@ enum nl80211_commands { | |||
| 725 | * @NL80211_ATTR_AP_ISOLATE: (AP mode) Do not forward traffic between stations | 795 | * @NL80211_ATTR_AP_ISOLATE: (AP mode) Do not forward traffic between stations |
| 726 | * connected to this BSS. | 796 | * connected to this BSS. |
| 727 | * | 797 | * |
| 798 | * @NL80211_ATTR_WIPHY_TX_POWER_SETTING: Transmit power setting type. See | ||
| 799 | * &enum nl80211_tx_power_setting for possible values. | ||
| 800 | * @NL80211_ATTR_WIPHY_TX_POWER_LEVEL: Transmit power level in signed mBm units. | ||
| 801 | * This is used in association with @NL80211_ATTR_WIPHY_TX_POWER_SETTING | ||
| 802 | * for non-automatic settings. | ||
| 803 | * | ||
| 804 | * @NL80211_ATTR_SUPPORT_IBSS_RSN: The device supports IBSS RSN, which mostly | ||
| 805 | * means support for per-station GTKs. | ||
| 806 | * | ||
| 728 | * @NL80211_ATTR_MAX: highest attribute number currently defined | 807 | * @NL80211_ATTR_MAX: highest attribute number currently defined |
| 729 | * @__NL80211_ATTR_AFTER_LAST: internal use | 808 | * @__NL80211_ATTR_AFTER_LAST: internal use |
| 730 | */ | 809 | */ |
| @@ -882,6 +961,18 @@ enum nl80211_attrs { | |||
| 882 | 961 | ||
| 883 | NL80211_ATTR_AP_ISOLATE, | 962 | NL80211_ATTR_AP_ISOLATE, |
| 884 | 963 | ||
| 964 | NL80211_ATTR_WIPHY_TX_POWER_SETTING, | ||
| 965 | NL80211_ATTR_WIPHY_TX_POWER_LEVEL, | ||
| 966 | |||
| 967 | NL80211_ATTR_TX_FRAME_TYPES, | ||
| 968 | NL80211_ATTR_RX_FRAME_TYPES, | ||
| 969 | NL80211_ATTR_FRAME_TYPE, | ||
| 970 | |||
| 971 | NL80211_ATTR_CONTROL_PORT_ETHERTYPE, | ||
| 972 | NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT, | ||
| 973 | |||
| 974 | NL80211_ATTR_SUPPORT_IBSS_RSN, | ||
| 975 | |||
| 885 | /* add attributes here, update the policy in nl80211.c */ | 976 | /* add attributes here, update the policy in nl80211.c */ |
| 886 | 977 | ||
| 887 | __NL80211_ATTR_AFTER_LAST, | 978 | __NL80211_ATTR_AFTER_LAST, |
| @@ -937,8 +1028,10 @@ enum nl80211_attrs { | |||
| 937 | * @NL80211_IFTYPE_WDS: wireless distribution interface | 1028 | * @NL80211_IFTYPE_WDS: wireless distribution interface |
| 938 | * @NL80211_IFTYPE_MONITOR: monitor interface receiving all frames | 1029 | * @NL80211_IFTYPE_MONITOR: monitor interface receiving all frames |
| 939 | * @NL80211_IFTYPE_MESH_POINT: mesh point | 1030 | * @NL80211_IFTYPE_MESH_POINT: mesh point |
| 1031 | * @NL80211_IFTYPE_P2P_CLIENT: P2P client | ||
| 1032 | * @NL80211_IFTYPE_P2P_GO: P2P group owner | ||
| 940 | * @NL80211_IFTYPE_MAX: highest interface type number currently defined | 1033 | * @NL80211_IFTYPE_MAX: highest interface type number currently defined |
| 941 | * @__NL80211_IFTYPE_AFTER_LAST: internal use | 1034 | * @NUM_NL80211_IFTYPES: number of defined interface types |
| 942 | * | 1035 | * |
| 943 | * These values are used with the %NL80211_ATTR_IFTYPE | 1036 | * These values are used with the %NL80211_ATTR_IFTYPE |
| 944 | * to set the type of an interface. | 1037 | * to set the type of an interface. |
| @@ -953,10 +1046,12 @@ enum nl80211_iftype { | |||
| 953 | NL80211_IFTYPE_WDS, | 1046 | NL80211_IFTYPE_WDS, |
| 954 | NL80211_IFTYPE_MONITOR, | 1047 | NL80211_IFTYPE_MONITOR, |
| 955 | NL80211_IFTYPE_MESH_POINT, | 1048 | NL80211_IFTYPE_MESH_POINT, |
| 1049 | NL80211_IFTYPE_P2P_CLIENT, | ||
| 1050 | NL80211_IFTYPE_P2P_GO, | ||
| 956 | 1051 | ||
| 957 | /* keep last */ | 1052 | /* keep last */ |
| 958 | __NL80211_IFTYPE_AFTER_LAST, | 1053 | NUM_NL80211_IFTYPES, |
| 959 | NL80211_IFTYPE_MAX = __NL80211_IFTYPE_AFTER_LAST - 1 | 1054 | NL80211_IFTYPE_MAX = NUM_NL80211_IFTYPES - 1 |
| 960 | }; | 1055 | }; |
| 961 | 1056 | ||
| 962 | /** | 1057 | /** |
| @@ -965,11 +1060,14 @@ enum nl80211_iftype { | |||
| 965 | * Station flags. When a station is added to an AP interface, it is | 1060 | * Station flags. When a station is added to an AP interface, it is |
| 966 | * assumed to be already associated (and hence authenticated.) | 1061 | * assumed to be already associated (and hence authenticated.) |
| 967 | * | 1062 | * |
| 1063 | * @__NL80211_STA_FLAG_INVALID: attribute number 0 is reserved | ||
| 968 | * @NL80211_STA_FLAG_AUTHORIZED: station is authorized (802.1X) | 1064 | * @NL80211_STA_FLAG_AUTHORIZED: station is authorized (802.1X) |
| 969 | * @NL80211_STA_FLAG_SHORT_PREAMBLE: station is capable of receiving frames | 1065 | * @NL80211_STA_FLAG_SHORT_PREAMBLE: station is capable of receiving frames |
| 970 | * with short barker preamble | 1066 | * with short barker preamble |
| 971 | * @NL80211_STA_FLAG_WME: station is WME/QoS capable | 1067 | * @NL80211_STA_FLAG_WME: station is WME/QoS capable |
| 972 | * @NL80211_STA_FLAG_MFP: station uses management frame protection | 1068 | * @NL80211_STA_FLAG_MFP: station uses management frame protection |
| 1069 | * @NL80211_STA_FLAG_MAX: highest station flag number currently defined | ||
| 1070 | * @__NL80211_STA_FLAG_AFTER_LAST: internal use | ||
| 973 | */ | 1071 | */ |
| 974 | enum nl80211_sta_flags { | 1072 | enum nl80211_sta_flags { |
| 975 | __NL80211_STA_FLAG_INVALID, | 1073 | __NL80211_STA_FLAG_INVALID, |
| @@ -1039,6 +1137,8 @@ enum nl80211_rate_info { | |||
| 1039 | * @NL80211_STA_INFO_RX_PACKETS: total received packet (u32, from this station) | 1137 | * @NL80211_STA_INFO_RX_PACKETS: total received packet (u32, from this station) |
| 1040 | * @NL80211_STA_INFO_TX_PACKETS: total transmitted packets (u32, to this | 1138 | * @NL80211_STA_INFO_TX_PACKETS: total transmitted packets (u32, to this |
| 1041 | * station) | 1139 | * station) |
| 1140 | * @NL80211_STA_INFO_TX_RETRIES: total retries (u32, to this station) | ||
| 1141 | * @NL80211_STA_INFO_TX_FAILED: total failed packets (u32, to this station) | ||
| 1042 | */ | 1142 | */ |
| 1043 | enum nl80211_sta_info { | 1143 | enum nl80211_sta_info { |
| 1044 | __NL80211_STA_INFO_INVALID, | 1144 | __NL80211_STA_INFO_INVALID, |
| @@ -1052,6 +1152,8 @@ enum nl80211_sta_info { | |||
| 1052 | NL80211_STA_INFO_TX_BITRATE, | 1152 | NL80211_STA_INFO_TX_BITRATE, |
| 1053 | NL80211_STA_INFO_RX_PACKETS, | 1153 | NL80211_STA_INFO_RX_PACKETS, |
| 1054 | NL80211_STA_INFO_TX_PACKETS, | 1154 | NL80211_STA_INFO_TX_PACKETS, |
| 1155 | NL80211_STA_INFO_TX_RETRIES, | ||
| 1156 | NL80211_STA_INFO_TX_FAILED, | ||
| 1055 | 1157 | ||
| 1056 | /* keep last */ | 1158 | /* keep last */ |
| 1057 | __NL80211_STA_INFO_AFTER_LAST, | 1159 | __NL80211_STA_INFO_AFTER_LAST, |
| @@ -1082,14 +1184,17 @@ enum nl80211_mpath_flags { | |||
| 1082 | * information about a mesh path. | 1184 | * information about a mesh path. |
| 1083 | * | 1185 | * |
| 1084 | * @__NL80211_MPATH_INFO_INVALID: attribute number 0 is reserved | 1186 | * @__NL80211_MPATH_INFO_INVALID: attribute number 0 is reserved |
| 1085 | * @NL80211_ATTR_MPATH_FRAME_QLEN: number of queued frames for this destination | 1187 | * @NL80211_MPATH_INFO_FRAME_QLEN: number of queued frames for this destination |
| 1086 | * @NL80211_ATTR_MPATH_SN: destination sequence number | 1188 | * @NL80211_MPATH_INFO_SN: destination sequence number |
| 1087 | * @NL80211_ATTR_MPATH_METRIC: metric (cost) of this mesh path | 1189 | * @NL80211_MPATH_INFO_METRIC: metric (cost) of this mesh path |
| 1088 | * @NL80211_ATTR_MPATH_EXPTIME: expiration time for the path, in msec from now | 1190 | * @NL80211_MPATH_INFO_EXPTIME: expiration time for the path, in msec from now |
| 1089 | * @NL80211_ATTR_MPATH_FLAGS: mesh path flags, enumerated in | 1191 | * @NL80211_MPATH_INFO_FLAGS: mesh path flags, enumerated in |
| 1090 | * &enum nl80211_mpath_flags; | 1192 | * &enum nl80211_mpath_flags; |
| 1091 | * @NL80211_ATTR_MPATH_DISCOVERY_TIMEOUT: total path discovery timeout, in msec | 1193 | * @NL80211_MPATH_INFO_DISCOVERY_TIMEOUT: total path discovery timeout, in msec |
| 1092 | * @NL80211_ATTR_MPATH_DISCOVERY_RETRIES: mesh path discovery retries | 1194 | * @NL80211_MPATH_INFO_DISCOVERY_RETRIES: mesh path discovery retries |
| 1195 | * @NL80211_MPATH_INFO_MAX: highest mesh path information attribute number | ||
| 1196 | * currently defind | ||
| 1197 | * @__NL80211_MPATH_INFO_AFTER_LAST: internal use | ||
| 1093 | */ | 1198 | */ |
| 1094 | enum nl80211_mpath_info { | 1199 | enum nl80211_mpath_info { |
| 1095 | __NL80211_MPATH_INFO_INVALID, | 1200 | __NL80211_MPATH_INFO_INVALID, |
| @@ -1118,6 +1223,8 @@ enum nl80211_mpath_info { | |||
| 1118 | * @NL80211_BAND_ATTR_HT_CAPA: HT capabilities, as in the HT information IE | 1223 | * @NL80211_BAND_ATTR_HT_CAPA: HT capabilities, as in the HT information IE |
| 1119 | * @NL80211_BAND_ATTR_HT_AMPDU_FACTOR: A-MPDU factor, as in 11n | 1224 | * @NL80211_BAND_ATTR_HT_AMPDU_FACTOR: A-MPDU factor, as in 11n |
| 1120 | * @NL80211_BAND_ATTR_HT_AMPDU_DENSITY: A-MPDU density, as in 11n | 1225 | * @NL80211_BAND_ATTR_HT_AMPDU_DENSITY: A-MPDU density, as in 11n |
| 1226 | * @NL80211_BAND_ATTR_MAX: highest band attribute currently defined | ||
| 1227 | * @__NL80211_BAND_ATTR_AFTER_LAST: internal use | ||
| 1121 | */ | 1228 | */ |
| 1122 | enum nl80211_band_attr { | 1229 | enum nl80211_band_attr { |
| 1123 | __NL80211_BAND_ATTR_INVALID, | 1230 | __NL80211_BAND_ATTR_INVALID, |
| @@ -1138,6 +1245,7 @@ enum nl80211_band_attr { | |||
| 1138 | 1245 | ||
| 1139 | /** | 1246 | /** |
| 1140 | * enum nl80211_frequency_attr - frequency attributes | 1247 | * enum nl80211_frequency_attr - frequency attributes |
| 1248 | * @__NL80211_FREQUENCY_ATTR_INVALID: attribute number 0 is reserved | ||
| 1141 | * @NL80211_FREQUENCY_ATTR_FREQ: Frequency in MHz | 1249 | * @NL80211_FREQUENCY_ATTR_FREQ: Frequency in MHz |
| 1142 | * @NL80211_FREQUENCY_ATTR_DISABLED: Channel is disabled in current | 1250 | * @NL80211_FREQUENCY_ATTR_DISABLED: Channel is disabled in current |
| 1143 | * regulatory domain. | 1251 | * regulatory domain. |
| @@ -1149,6 +1257,9 @@ enum nl80211_band_attr { | |||
| 1149 | * on this channel in current regulatory domain. | 1257 | * on this channel in current regulatory domain. |
| 1150 | * @NL80211_FREQUENCY_ATTR_MAX_TX_POWER: Maximum transmission power in mBm | 1258 | * @NL80211_FREQUENCY_ATTR_MAX_TX_POWER: Maximum transmission power in mBm |
| 1151 | * (100 * dBm). | 1259 | * (100 * dBm). |
| 1260 | * @NL80211_FREQUENCY_ATTR_MAX: highest frequency attribute number | ||
| 1261 | * currently defined | ||
| 1262 | * @__NL80211_FREQUENCY_ATTR_AFTER_LAST: internal use | ||
| 1152 | */ | 1263 | */ |
| 1153 | enum nl80211_frequency_attr { | 1264 | enum nl80211_frequency_attr { |
| 1154 | __NL80211_FREQUENCY_ATTR_INVALID, | 1265 | __NL80211_FREQUENCY_ATTR_INVALID, |
| @@ -1168,9 +1279,13 @@ enum nl80211_frequency_attr { | |||
| 1168 | 1279 | ||
| 1169 | /** | 1280 | /** |
| 1170 | * enum nl80211_bitrate_attr - bitrate attributes | 1281 | * enum nl80211_bitrate_attr - bitrate attributes |
| 1282 | * @__NL80211_BITRATE_ATTR_INVALID: attribute number 0 is reserved | ||
| 1171 | * @NL80211_BITRATE_ATTR_RATE: Bitrate in units of 100 kbps | 1283 | * @NL80211_BITRATE_ATTR_RATE: Bitrate in units of 100 kbps |
| 1172 | * @NL80211_BITRATE_ATTR_2GHZ_SHORTPREAMBLE: Short preamble supported | 1284 | * @NL80211_BITRATE_ATTR_2GHZ_SHORTPREAMBLE: Short preamble supported |
| 1173 | * in 2.4 GHz band. | 1285 | * in 2.4 GHz band. |
| 1286 | * @NL80211_BITRATE_ATTR_MAX: highest bitrate attribute number | ||
| 1287 | * currently defined | ||
| 1288 | * @__NL80211_BITRATE_ATTR_AFTER_LAST: internal use | ||
| 1174 | */ | 1289 | */ |
| 1175 | enum nl80211_bitrate_attr { | 1290 | enum nl80211_bitrate_attr { |
| 1176 | __NL80211_BITRATE_ATTR_INVALID, | 1291 | __NL80211_BITRATE_ATTR_INVALID, |
| @@ -1226,6 +1341,7 @@ enum nl80211_reg_type { | |||
| 1226 | 1341 | ||
| 1227 | /** | 1342 | /** |
| 1228 | * enum nl80211_reg_rule_attr - regulatory rule attributes | 1343 | * enum nl80211_reg_rule_attr - regulatory rule attributes |
| 1344 | * @__NL80211_REG_RULE_ATTR_INVALID: attribute number 0 is reserved | ||
| 1229 | * @NL80211_ATTR_REG_RULE_FLAGS: a set of flags which specify additional | 1345 | * @NL80211_ATTR_REG_RULE_FLAGS: a set of flags which specify additional |
| 1230 | * considerations for a given frequency range. These are the | 1346 | * considerations for a given frequency range. These are the |
| 1231 | * &enum nl80211_reg_rule_flags. | 1347 | * &enum nl80211_reg_rule_flags. |
| @@ -1242,6 +1358,9 @@ enum nl80211_reg_type { | |||
| 1242 | * If you don't have one then don't send this. | 1358 | * If you don't have one then don't send this. |
| 1243 | * @NL80211_ATTR_POWER_RULE_MAX_EIRP: the maximum allowed EIRP for | 1359 | * @NL80211_ATTR_POWER_RULE_MAX_EIRP: the maximum allowed EIRP for |
| 1244 | * a given frequency range. The value is in mBm (100 * dBm). | 1360 | * a given frequency range. The value is in mBm (100 * dBm). |
| 1361 | * @NL80211_REG_RULE_ATTR_MAX: highest regulatory rule attribute number | ||
| 1362 | * currently defined | ||
| 1363 | * @__NL80211_REG_RULE_ATTR_AFTER_LAST: internal use | ||
| 1245 | */ | 1364 | */ |
| 1246 | enum nl80211_reg_rule_attr { | 1365 | enum nl80211_reg_rule_attr { |
| 1247 | __NL80211_REG_RULE_ATTR_INVALID, | 1366 | __NL80211_REG_RULE_ATTR_INVALID, |
| @@ -1293,11 +1412,31 @@ enum nl80211_reg_rule_flags { | |||
| 1293 | * @__NL80211_SURVEY_INFO_INVALID: attribute number 0 is reserved | 1412 | * @__NL80211_SURVEY_INFO_INVALID: attribute number 0 is reserved |
| 1294 | * @NL80211_SURVEY_INFO_FREQUENCY: center frequency of channel | 1413 | * @NL80211_SURVEY_INFO_FREQUENCY: center frequency of channel |
| 1295 | * @NL80211_SURVEY_INFO_NOISE: noise level of channel (u8, dBm) | 1414 | * @NL80211_SURVEY_INFO_NOISE: noise level of channel (u8, dBm) |
| 1415 | * @NL80211_SURVEY_INFO_IN_USE: channel is currently being used | ||
| 1416 | * @NL80211_SURVEY_INFO_CHANNEL_TIME: amount of time (in ms) that the radio | ||
| 1417 | * spent on this channel | ||
| 1418 | * @NL80211_SURVEY_INFO_CHANNEL_TIME_BUSY: amount of the time the primary | ||
| 1419 | * channel was sensed busy (either due to activity or energy detect) | ||
| 1420 | * @NL80211_SURVEY_INFO_CHANNEL_TIME_EXT_BUSY: amount of time the extension | ||
| 1421 | * channel was sensed busy | ||
| 1422 | * @NL80211_SURVEY_INFO_CHANNEL_TIME_RX: amount of time the radio spent | ||
| 1423 | * receiving data | ||
| 1424 | * @NL80211_SURVEY_INFO_CHANNEL_TIME_TX: amount of time the radio spent | ||
| 1425 | * transmitting data | ||
| 1426 | * @NL80211_SURVEY_INFO_MAX: highest survey info attribute number | ||
| 1427 | * currently defined | ||
| 1428 | * @__NL80211_SURVEY_INFO_AFTER_LAST: internal use | ||
| 1296 | */ | 1429 | */ |
| 1297 | enum nl80211_survey_info { | 1430 | enum nl80211_survey_info { |
| 1298 | __NL80211_SURVEY_INFO_INVALID, | 1431 | __NL80211_SURVEY_INFO_INVALID, |
| 1299 | NL80211_SURVEY_INFO_FREQUENCY, | 1432 | NL80211_SURVEY_INFO_FREQUENCY, |
| 1300 | NL80211_SURVEY_INFO_NOISE, | 1433 | NL80211_SURVEY_INFO_NOISE, |
| 1434 | NL80211_SURVEY_INFO_IN_USE, | ||
| 1435 | NL80211_SURVEY_INFO_CHANNEL_TIME, | ||
| 1436 | NL80211_SURVEY_INFO_CHANNEL_TIME_BUSY, | ||
| 1437 | NL80211_SURVEY_INFO_CHANNEL_TIME_EXT_BUSY, | ||
| 1438 | NL80211_SURVEY_INFO_CHANNEL_TIME_RX, | ||
| 1439 | NL80211_SURVEY_INFO_CHANNEL_TIME_TX, | ||
| 1301 | 1440 | ||
| 1302 | /* keep last */ | 1441 | /* keep last */ |
| 1303 | __NL80211_SURVEY_INFO_AFTER_LAST, | 1442 | __NL80211_SURVEY_INFO_AFTER_LAST, |
| @@ -1457,6 +1596,7 @@ enum nl80211_channel_type { | |||
| 1457 | * enum nl80211_bss - netlink attributes for a BSS | 1596 | * enum nl80211_bss - netlink attributes for a BSS |
| 1458 | * | 1597 | * |
| 1459 | * @__NL80211_BSS_INVALID: invalid | 1598 | * @__NL80211_BSS_INVALID: invalid |
| 1599 | * @NL80211_BSS_BSSID: BSSID of the BSS (6 octets) | ||
| 1460 | * @NL80211_BSS_FREQUENCY: frequency in MHz (u32) | 1600 | * @NL80211_BSS_FREQUENCY: frequency in MHz (u32) |
| 1461 | * @NL80211_BSS_TSF: TSF of the received probe response/beacon (u64) | 1601 | * @NL80211_BSS_TSF: TSF of the received probe response/beacon (u64) |
| 1462 | * @NL80211_BSS_BEACON_INTERVAL: beacon interval of the (I)BSS (u16) | 1602 | * @NL80211_BSS_BEACON_INTERVAL: beacon interval of the (I)BSS (u16) |
| @@ -1500,6 +1640,12 @@ enum nl80211_bss { | |||
| 1500 | 1640 | ||
| 1501 | /** | 1641 | /** |
| 1502 | * enum nl80211_bss_status - BSS "status" | 1642 | * enum nl80211_bss_status - BSS "status" |
| 1643 | * @NL80211_BSS_STATUS_AUTHENTICATED: Authenticated with this BSS. | ||
| 1644 | * @NL80211_BSS_STATUS_ASSOCIATED: Associated with this BSS. | ||
| 1645 | * @NL80211_BSS_STATUS_IBSS_JOINED: Joined to this IBSS. | ||
| 1646 | * | ||
| 1647 | * The BSS status is a BSS attribute in scan dumps, which | ||
| 1648 | * indicates the status the interface has wrt. this BSS. | ||
| 1503 | */ | 1649 | */ |
| 1504 | enum nl80211_bss_status { | 1650 | enum nl80211_bss_status { |
| 1505 | NL80211_BSS_STATUS_AUTHENTICATED, | 1651 | NL80211_BSS_STATUS_AUTHENTICATED, |
| @@ -1537,11 +1683,14 @@ enum nl80211_auth_type { | |||
| 1537 | * @NL80211_KEYTYPE_GROUP: Group (broadcast/multicast) key | 1683 | * @NL80211_KEYTYPE_GROUP: Group (broadcast/multicast) key |
| 1538 | * @NL80211_KEYTYPE_PAIRWISE: Pairwise (unicast/individual) key | 1684 | * @NL80211_KEYTYPE_PAIRWISE: Pairwise (unicast/individual) key |
| 1539 | * @NL80211_KEYTYPE_PEERKEY: PeerKey (DLS) | 1685 | * @NL80211_KEYTYPE_PEERKEY: PeerKey (DLS) |
| 1686 | * @NUM_NL80211_KEYTYPES: number of defined key types | ||
| 1540 | */ | 1687 | */ |
| 1541 | enum nl80211_key_type { | 1688 | enum nl80211_key_type { |
| 1542 | NL80211_KEYTYPE_GROUP, | 1689 | NL80211_KEYTYPE_GROUP, |
| 1543 | NL80211_KEYTYPE_PAIRWISE, | 1690 | NL80211_KEYTYPE_PAIRWISE, |
| 1544 | NL80211_KEYTYPE_PEERKEY, | 1691 | NL80211_KEYTYPE_PEERKEY, |
| 1692 | |||
| 1693 | NUM_NL80211_KEYTYPES | ||
| 1545 | }; | 1694 | }; |
| 1546 | 1695 | ||
| 1547 | /** | 1696 | /** |
| @@ -1572,6 +1721,9 @@ enum nl80211_wpa_versions { | |||
| 1572 | * CCMP keys, each six bytes in little endian | 1721 | * CCMP keys, each six bytes in little endian |
| 1573 | * @NL80211_KEY_DEFAULT: flag indicating default key | 1722 | * @NL80211_KEY_DEFAULT: flag indicating default key |
| 1574 | * @NL80211_KEY_DEFAULT_MGMT: flag indicating default management key | 1723 | * @NL80211_KEY_DEFAULT_MGMT: flag indicating default management key |
| 1724 | * @NL80211_KEY_TYPE: the key type from enum nl80211_key_type, if not | ||
| 1725 | * specified the default depends on whether a MAC address was | ||
| 1726 | * given with the command using the key or not (u32) | ||
| 1575 | * @__NL80211_KEY_AFTER_LAST: internal | 1727 | * @__NL80211_KEY_AFTER_LAST: internal |
| 1576 | * @NL80211_KEY_MAX: highest key attribute | 1728 | * @NL80211_KEY_MAX: highest key attribute |
| 1577 | */ | 1729 | */ |
| @@ -1583,6 +1735,7 @@ enum nl80211_key_attributes { | |||
| 1583 | NL80211_KEY_SEQ, | 1735 | NL80211_KEY_SEQ, |
| 1584 | NL80211_KEY_DEFAULT, | 1736 | NL80211_KEY_DEFAULT, |
| 1585 | NL80211_KEY_DEFAULT_MGMT, | 1737 | NL80211_KEY_DEFAULT_MGMT, |
| 1738 | NL80211_KEY_TYPE, | ||
| 1586 | 1739 | ||
| 1587 | /* keep last */ | 1740 | /* keep last */ |
| 1588 | __NL80211_KEY_AFTER_LAST, | 1741 | __NL80211_KEY_AFTER_LAST, |
| @@ -1610,8 +1763,8 @@ enum nl80211_tx_rate_attributes { | |||
| 1610 | 1763 | ||
| 1611 | /** | 1764 | /** |
| 1612 | * enum nl80211_band - Frequency band | 1765 | * enum nl80211_band - Frequency band |
| 1613 | * @NL80211_BAND_2GHZ - 2.4 GHz ISM band | 1766 | * @NL80211_BAND_2GHZ: 2.4 GHz ISM band |
| 1614 | * @NL80211_BAND_5GHZ - around 5 GHz band (4.9 - 5.7 GHz) | 1767 | * @NL80211_BAND_5GHZ: around 5 GHz band (4.9 - 5.7 GHz) |
| 1615 | */ | 1768 | */ |
| 1616 | enum nl80211_band { | 1769 | enum nl80211_band { |
| 1617 | NL80211_BAND_2GHZ, | 1770 | NL80211_BAND_2GHZ, |
| @@ -1649,9 +1802,9 @@ enum nl80211_attr_cqm { | |||
| 1649 | 1802 | ||
| 1650 | /** | 1803 | /** |
| 1651 | * enum nl80211_cqm_rssi_threshold_event - RSSI threshold event | 1804 | * enum nl80211_cqm_rssi_threshold_event - RSSI threshold event |
| 1652 | * @NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW - The RSSI level is lower than the | 1805 | * @NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW: The RSSI level is lower than the |
| 1653 | * configured threshold | 1806 | * configured threshold |
| 1654 | * @NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH - The RSSI is higher than the | 1807 | * @NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH: The RSSI is higher than the |
| 1655 | * configured threshold | 1808 | * configured threshold |
| 1656 | */ | 1809 | */ |
| 1657 | enum nl80211_cqm_rssi_threshold_event { | 1810 | enum nl80211_cqm_rssi_threshold_event { |
| @@ -1659,4 +1812,17 @@ enum nl80211_cqm_rssi_threshold_event { | |||
| 1659 | NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH, | 1812 | NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH, |
| 1660 | }; | 1813 | }; |
| 1661 | 1814 | ||
| 1815 | |||
| 1816 | /** | ||
| 1817 | * enum nl80211_tx_power_setting - TX power adjustment | ||
| 1818 | * @NL80211_TX_POWER_AUTOMATIC: automatically determine transmit power | ||
| 1819 | * @NL80211_TX_POWER_LIMITED: limit TX power by the mBm parameter | ||
| 1820 | * @NL80211_TX_POWER_FIXED: fix TX power to the mBm parameter | ||
| 1821 | */ | ||
| 1822 | enum nl80211_tx_power_setting { | ||
| 1823 | NL80211_TX_POWER_AUTOMATIC, | ||
| 1824 | NL80211_TX_POWER_LIMITED, | ||
| 1825 | NL80211_TX_POWER_FIXED, | ||
| 1826 | }; | ||
| 1827 | |||
| 1662 | #endif /* __LINUX_NL80211_H */ | 1828 | #endif /* __LINUX_NL80211_H */ |
diff --git a/include/linux/nmi.h b/include/linux/nmi.h index b752e807adde..06aab5eee134 100644 --- a/include/linux/nmi.h +++ b/include/linux/nmi.h | |||
| @@ -20,10 +20,14 @@ extern void touch_nmi_watchdog(void); | |||
| 20 | extern void acpi_nmi_disable(void); | 20 | extern void acpi_nmi_disable(void); |
| 21 | extern void acpi_nmi_enable(void); | 21 | extern void acpi_nmi_enable(void); |
| 22 | #else | 22 | #else |
| 23 | #ifndef CONFIG_HARDLOCKUP_DETECTOR | ||
| 23 | static inline void touch_nmi_watchdog(void) | 24 | static inline void touch_nmi_watchdog(void) |
| 24 | { | 25 | { |
| 25 | touch_softlockup_watchdog(); | 26 | touch_softlockup_watchdog(); |
| 26 | } | 27 | } |
| 28 | #else | ||
| 29 | extern void touch_nmi_watchdog(void); | ||
| 30 | #endif | ||
| 27 | static inline void acpi_nmi_disable(void) { } | 31 | static inline void acpi_nmi_disable(void) { } |
| 28 | static inline void acpi_nmi_enable(void) { } | 32 | static inline void acpi_nmi_enable(void) { } |
| 29 | #endif | 33 | #endif |
| @@ -47,4 +51,13 @@ static inline bool trigger_all_cpu_backtrace(void) | |||
| 47 | } | 51 | } |
| 48 | #endif | 52 | #endif |
| 49 | 53 | ||
| 54 | #ifdef CONFIG_LOCKUP_DETECTOR | ||
| 55 | int hw_nmi_is_cpu_stuck(struct pt_regs *); | ||
| 56 | u64 hw_nmi_get_sample_period(void); | ||
| 57 | extern int watchdog_enabled; | ||
| 58 | struct ctl_table; | ||
| 59 | extern int proc_dowatchdog_enabled(struct ctl_table *, int , | ||
| 60 | void __user *, size_t *, loff_t *); | ||
| 61 | #endif | ||
| 62 | |||
| 50 | #endif | 63 | #endif |
diff --git a/include/linux/notifier.h b/include/linux/notifier.h index 540703b555cb..2026f9e1ceb8 100644 --- a/include/linux/notifier.h +++ b/include/linux/notifier.h | |||
| @@ -49,28 +49,28 @@ | |||
| 49 | 49 | ||
| 50 | struct notifier_block { | 50 | struct notifier_block { |
| 51 | int (*notifier_call)(struct notifier_block *, unsigned long, void *); | 51 | int (*notifier_call)(struct notifier_block *, unsigned long, void *); |
| 52 | struct notifier_block *next; | 52 | struct notifier_block __rcu *next; |
| 53 | int priority; | 53 | int priority; |
| 54 | }; | 54 | }; |
| 55 | 55 | ||
| 56 | struct atomic_notifier_head { | 56 | struct atomic_notifier_head { |
| 57 | spinlock_t lock; | 57 | spinlock_t lock; |
| 58 | struct notifier_block *head; | 58 | struct notifier_block __rcu *head; |
| 59 | }; | 59 | }; |
| 60 | 60 | ||
| 61 | struct blocking_notifier_head { | 61 | struct blocking_notifier_head { |
| 62 | struct rw_semaphore rwsem; | 62 | struct rw_semaphore rwsem; |
| 63 | struct notifier_block *head; | 63 | struct notifier_block __rcu *head; |
| 64 | }; | 64 | }; |
| 65 | 65 | ||
| 66 | struct raw_notifier_head { | 66 | struct raw_notifier_head { |
| 67 | struct notifier_block *head; | 67 | struct notifier_block __rcu *head; |
| 68 | }; | 68 | }; |
| 69 | 69 | ||
| 70 | struct srcu_notifier_head { | 70 | struct srcu_notifier_head { |
| 71 | struct mutex mutex; | 71 | struct mutex mutex; |
| 72 | struct srcu_struct srcu; | 72 | struct srcu_struct srcu; |
| 73 | struct notifier_block *head; | 73 | struct notifier_block __rcu *head; |
| 74 | }; | 74 | }; |
| 75 | 75 | ||
| 76 | #define ATOMIC_INIT_NOTIFIER_HEAD(name) do { \ | 76 | #define ATOMIC_INIT_NOTIFIER_HEAD(name) do { \ |
| @@ -210,6 +210,7 @@ static inline int notifier_to_errno(int ret) | |||
| 210 | #define NETDEV_POST_INIT 0x0010 | 210 | #define NETDEV_POST_INIT 0x0010 |
| 211 | #define NETDEV_UNREGISTER_BATCH 0x0011 | 211 | #define NETDEV_UNREGISTER_BATCH 0x0011 |
| 212 | #define NETDEV_BONDING_DESLAVE 0x0012 | 212 | #define NETDEV_BONDING_DESLAVE 0x0012 |
| 213 | #define NETDEV_NOTIFY_PEERS 0x0013 | ||
| 213 | 214 | ||
| 214 | #define SYS_DOWN 0x0001 /* Notify of system down */ | 215 | #define SYS_DOWN 0x0001 /* Notify of system down */ |
| 215 | #define SYS_RESTART SYS_DOWN | 216 | #define SYS_RESTART SYS_DOWN |
diff --git a/include/linux/of.h b/include/linux/of.h index a367e19bb3af..cad7cf0ab278 100644 --- a/include/linux/of.h +++ b/include/linux/of.h | |||
| @@ -70,6 +70,11 @@ extern struct device_node *allnodes; | |||
| 70 | extern struct device_node *of_chosen; | 70 | extern struct device_node *of_chosen; |
| 71 | extern rwlock_t devtree_lock; | 71 | extern rwlock_t devtree_lock; |
| 72 | 72 | ||
| 73 | static inline bool of_node_is_root(const struct device_node *node) | ||
| 74 | { | ||
| 75 | return node && (node->parent == NULL); | ||
| 76 | } | ||
| 77 | |||
| 73 | static inline int of_node_check_flag(struct device_node *n, unsigned long flag) | 78 | static inline int of_node_check_flag(struct device_node *n, unsigned long flag) |
| 74 | { | 79 | { |
| 75 | return test_bit(flag, &n->_flags); | 80 | return test_bit(flag, &n->_flags); |
| @@ -141,6 +146,11 @@ static inline unsigned long of_read_ulong(const __be32 *cell, int size) | |||
| 141 | 146 | ||
| 142 | #define OF_BAD_ADDR ((u64)-1) | 147 | #define OF_BAD_ADDR ((u64)-1) |
| 143 | 148 | ||
| 149 | #ifndef of_node_to_nid | ||
| 150 | static inline int of_node_to_nid(struct device_node *np) { return -1; } | ||
| 151 | #define of_node_to_nid of_node_to_nid | ||
| 152 | #endif | ||
| 153 | |||
| 144 | extern struct device_node *of_find_node_by_name(struct device_node *from, | 154 | extern struct device_node *of_find_node_by_name(struct device_node *from, |
| 145 | const char *name); | 155 | const char *name); |
| 146 | #define for_each_node_by_name(dn, name) \ | 156 | #define for_each_node_by_name(dn, name) \ |
diff --git a/include/linux/of_address.h b/include/linux/of_address.h new file mode 100644 index 000000000000..8aea06f0564c --- /dev/null +++ b/include/linux/of_address.h | |||
| @@ -0,0 +1,44 @@ | |||
| 1 | #ifndef __OF_ADDRESS_H | ||
| 2 | #define __OF_ADDRESS_H | ||
| 3 | #include <linux/ioport.h> | ||
| 4 | #include <linux/of.h> | ||
| 5 | |||
| 6 | extern u64 of_translate_address(struct device_node *np, const u32 *addr); | ||
| 7 | extern int of_address_to_resource(struct device_node *dev, int index, | ||
| 8 | struct resource *r); | ||
| 9 | extern void __iomem *of_iomap(struct device_node *device, int index); | ||
| 10 | |||
| 11 | /* Extract an address from a device, returns the region size and | ||
| 12 | * the address space flags too. The PCI version uses a BAR number | ||
| 13 | * instead of an absolute index | ||
| 14 | */ | ||
| 15 | extern const u32 *of_get_address(struct device_node *dev, int index, | ||
| 16 | u64 *size, unsigned int *flags); | ||
| 17 | |||
| 18 | #ifndef pci_address_to_pio | ||
| 19 | static inline unsigned long pci_address_to_pio(phys_addr_t addr) { return -1; } | ||
| 20 | #define pci_address_to_pio pci_address_to_pio | ||
| 21 | #endif | ||
| 22 | |||
| 23 | #ifdef CONFIG_PCI | ||
| 24 | extern const u32 *of_get_pci_address(struct device_node *dev, int bar_no, | ||
| 25 | u64 *size, unsigned int *flags); | ||
| 26 | extern int of_pci_address_to_resource(struct device_node *dev, int bar, | ||
| 27 | struct resource *r); | ||
| 28 | #else /* CONFIG_PCI */ | ||
| 29 | static inline int of_pci_address_to_resource(struct device_node *dev, int bar, | ||
| 30 | struct resource *r) | ||
| 31 | { | ||
| 32 | return -ENOSYS; | ||
| 33 | } | ||
| 34 | |||
| 35 | static inline const u32 *of_get_pci_address(struct device_node *dev, | ||
| 36 | int bar_no, u64 *size, unsigned int *flags) | ||
| 37 | { | ||
| 38 | return NULL; | ||
| 39 | } | ||
| 40 | #endif /* CONFIG_PCI */ | ||
| 41 | |||
| 42 | |||
| 43 | #endif /* __OF_ADDRESS_H */ | ||
| 44 | |||
diff --git a/include/linux/of_device.h b/include/linux/of_device.h index 11651facc5f1..975d347079d9 100644 --- a/include/linux/of_device.h +++ b/include/linux/of_device.h | |||
| @@ -1,32 +1,62 @@ | |||
| 1 | #ifndef _LINUX_OF_DEVICE_H | 1 | #ifndef _LINUX_OF_DEVICE_H |
| 2 | #define _LINUX_OF_DEVICE_H | 2 | #define _LINUX_OF_DEVICE_H |
| 3 | 3 | ||
| 4 | #include <linux/platform_device.h> | ||
| 5 | #include <linux/of_platform.h> /* temporary until merge */ | ||
| 6 | |||
| 4 | #ifdef CONFIG_OF_DEVICE | 7 | #ifdef CONFIG_OF_DEVICE |
| 5 | #include <linux/device.h> | 8 | #include <linux/device.h> |
| 6 | #include <linux/of.h> | 9 | #include <linux/of.h> |
| 7 | #include <linux/mod_devicetable.h> | 10 | #include <linux/mod_devicetable.h> |
| 8 | 11 | ||
| 9 | #include <asm/of_device.h> | ||
| 10 | |||
| 11 | #define to_of_device(d) container_of(d, struct of_device, dev) | ||
| 12 | |||
| 13 | extern const struct of_device_id *of_match_device( | 12 | extern const struct of_device_id *of_match_device( |
| 14 | const struct of_device_id *matches, const struct device *dev); | 13 | const struct of_device_id *matches, const struct device *dev); |
| 14 | extern void of_device_make_bus_id(struct device *dev); | ||
| 15 | |||
| 16 | /** | ||
| 17 | * of_driver_match_device - Tell if a driver's of_match_table matches a device. | ||
| 18 | * @drv: the device_driver structure to test | ||
| 19 | * @dev: the device structure to match against | ||
| 20 | */ | ||
| 21 | static inline int of_driver_match_device(const struct device *dev, | ||
| 22 | const struct device_driver *drv) | ||
| 23 | { | ||
| 24 | return of_match_device(drv->of_match_table, dev) != NULL; | ||
| 25 | } | ||
| 15 | 26 | ||
| 16 | extern struct of_device *of_dev_get(struct of_device *dev); | 27 | extern struct platform_device *of_dev_get(struct platform_device *dev); |
| 17 | extern void of_dev_put(struct of_device *dev); | 28 | extern void of_dev_put(struct platform_device *dev); |
| 18 | 29 | ||
| 19 | extern int of_device_register(struct of_device *ofdev); | 30 | extern int of_device_add(struct platform_device *pdev); |
| 20 | extern void of_device_unregister(struct of_device *ofdev); | 31 | extern int of_device_register(struct platform_device *ofdev); |
| 21 | extern void of_release_dev(struct device *dev); | 32 | extern void of_device_unregister(struct platform_device *ofdev); |
| 22 | 33 | ||
| 23 | static inline void of_device_free(struct of_device *dev) | 34 | extern ssize_t of_device_get_modalias(struct device *dev, |
| 35 | char *str, ssize_t len); | ||
| 36 | |||
| 37 | extern int of_device_uevent(struct device *dev, struct kobj_uevent_env *env); | ||
| 38 | |||
| 39 | static inline void of_device_node_put(struct device *dev) | ||
| 24 | { | 40 | { |
| 25 | of_release_dev(&dev->dev); | 41 | of_node_put(dev->of_node); |
| 26 | } | 42 | } |
| 27 | 43 | ||
| 28 | extern ssize_t of_device_get_modalias(struct of_device *ofdev, | 44 | #else /* CONFIG_OF_DEVICE */ |
| 29 | char *str, ssize_t len); | 45 | |
| 46 | static inline int of_driver_match_device(struct device *dev, | ||
| 47 | struct device_driver *drv) | ||
| 48 | { | ||
| 49 | return 0; | ||
| 50 | } | ||
| 51 | |||
| 52 | static inline int of_device_uevent(struct device *dev, | ||
| 53 | struct kobj_uevent_env *env) | ||
| 54 | { | ||
| 55 | return -ENODEV; | ||
| 56 | } | ||
| 57 | |||
| 58 | static inline void of_device_node_put(struct device *dev) { } | ||
| 59 | |||
| 30 | #endif /* CONFIG_OF_DEVICE */ | 60 | #endif /* CONFIG_OF_DEVICE */ |
| 31 | 61 | ||
| 32 | #endif /* _LINUX_OF_DEVICE_H */ | 62 | #endif /* _LINUX_OF_DEVICE_H */ |
diff --git a/include/linux/of_fdt.h b/include/linux/of_fdt.h index 71e1a916d3fa..7bbf5b328438 100644 --- a/include/linux/of_fdt.h +++ b/include/linux/of_fdt.h | |||
| @@ -72,7 +72,7 @@ extern void *of_get_flat_dt_prop(unsigned long node, const char *name, | |||
| 72 | unsigned long *size); | 72 | unsigned long *size); |
| 73 | extern int of_flat_dt_is_compatible(unsigned long node, const char *name); | 73 | extern int of_flat_dt_is_compatible(unsigned long node, const char *name); |
| 74 | extern unsigned long of_get_flat_dt_root(void); | 74 | extern unsigned long of_get_flat_dt_root(void); |
| 75 | extern void early_init_dt_scan_chosen_arch(unsigned long node); | 75 | |
| 76 | extern int early_init_dt_scan_chosen(unsigned long node, const char *uname, | 76 | extern int early_init_dt_scan_chosen(unsigned long node, const char *uname, |
| 77 | int depth, void *data); | 77 | int depth, void *data); |
| 78 | extern void early_init_dt_check_for_initrd(unsigned long node); | 78 | extern void early_init_dt_check_for_initrd(unsigned long node); |
diff --git a/include/linux/of_gpio.h b/include/linux/of_gpio.h index fc2472c3c254..6598c04dab01 100644 --- a/include/linux/of_gpio.h +++ b/include/linux/of_gpio.h | |||
| @@ -33,34 +33,17 @@ enum of_gpio_flags { | |||
| 33 | #ifdef CONFIG_OF_GPIO | 33 | #ifdef CONFIG_OF_GPIO |
| 34 | 34 | ||
| 35 | /* | 35 | /* |
| 36 | * Generic OF GPIO chip | ||
| 37 | */ | ||
| 38 | struct of_gpio_chip { | ||
| 39 | struct gpio_chip gc; | ||
| 40 | int gpio_cells; | ||
| 41 | int (*xlate)(struct of_gpio_chip *of_gc, struct device_node *np, | ||
| 42 | const void *gpio_spec, enum of_gpio_flags *flags); | ||
| 43 | }; | ||
| 44 | |||
| 45 | static inline struct of_gpio_chip *to_of_gpio_chip(struct gpio_chip *gc) | ||
| 46 | { | ||
| 47 | return container_of(gc, struct of_gpio_chip, gc); | ||
| 48 | } | ||
| 49 | |||
| 50 | /* | ||
| 51 | * OF GPIO chip for memory mapped banks | 36 | * OF GPIO chip for memory mapped banks |
| 52 | */ | 37 | */ |
| 53 | struct of_mm_gpio_chip { | 38 | struct of_mm_gpio_chip { |
| 54 | struct of_gpio_chip of_gc; | 39 | struct gpio_chip gc; |
| 55 | void (*save_regs)(struct of_mm_gpio_chip *mm_gc); | 40 | void (*save_regs)(struct of_mm_gpio_chip *mm_gc); |
| 56 | void __iomem *regs; | 41 | void __iomem *regs; |
| 57 | }; | 42 | }; |
| 58 | 43 | ||
| 59 | static inline struct of_mm_gpio_chip *to_of_mm_gpio_chip(struct gpio_chip *gc) | 44 | static inline struct of_mm_gpio_chip *to_of_mm_gpio_chip(struct gpio_chip *gc) |
| 60 | { | 45 | { |
| 61 | struct of_gpio_chip *of_gc = to_of_gpio_chip(gc); | 46 | return container_of(gc, struct of_mm_gpio_chip, gc); |
| 62 | |||
| 63 | return container_of(of_gc, struct of_mm_gpio_chip, of_gc); | ||
| 64 | } | 47 | } |
| 65 | 48 | ||
| 66 | extern int of_get_gpio_flags(struct device_node *np, int index, | 49 | extern int of_get_gpio_flags(struct device_node *np, int index, |
| @@ -69,11 +52,12 @@ extern unsigned int of_gpio_count(struct device_node *np); | |||
| 69 | 52 | ||
| 70 | extern int of_mm_gpiochip_add(struct device_node *np, | 53 | extern int of_mm_gpiochip_add(struct device_node *np, |
| 71 | struct of_mm_gpio_chip *mm_gc); | 54 | struct of_mm_gpio_chip *mm_gc); |
| 72 | extern int of_gpio_simple_xlate(struct of_gpio_chip *of_gc, | 55 | |
| 73 | struct device_node *np, | 56 | extern void of_gpiochip_add(struct gpio_chip *gc); |
| 74 | const void *gpio_spec, | 57 | extern void of_gpiochip_remove(struct gpio_chip *gc); |
| 75 | enum of_gpio_flags *flags); | 58 | extern struct gpio_chip *of_node_to_gpiochip(struct device_node *np); |
| 76 | #else | 59 | |
| 60 | #else /* CONFIG_OF_GPIO */ | ||
| 77 | 61 | ||
| 78 | /* Drivers may not strictly depend on the GPIO support, so let them link. */ | 62 | /* Drivers may not strictly depend on the GPIO support, so let them link. */ |
| 79 | static inline int of_get_gpio_flags(struct device_node *np, int index, | 63 | static inline int of_get_gpio_flags(struct device_node *np, int index, |
| @@ -87,6 +71,9 @@ static inline unsigned int of_gpio_count(struct device_node *np) | |||
| 87 | return 0; | 71 | return 0; |
| 88 | } | 72 | } |
| 89 | 73 | ||
| 74 | static inline void of_gpiochip_add(struct gpio_chip *gc) { } | ||
| 75 | static inline void of_gpiochip_remove(struct gpio_chip *gc) { } | ||
| 76 | |||
| 90 | #endif /* CONFIG_OF_GPIO */ | 77 | #endif /* CONFIG_OF_GPIO */ |
| 91 | 78 | ||
| 92 | /** | 79 | /** |
diff --git a/include/linux/of_i2c.h b/include/linux/of_i2c.h index 34974b5a76f7..0efe8d465f55 100644 --- a/include/linux/of_i2c.h +++ b/include/linux/of_i2c.h | |||
| @@ -12,12 +12,19 @@ | |||
| 12 | #ifndef __LINUX_OF_I2C_H | 12 | #ifndef __LINUX_OF_I2C_H |
| 13 | #define __LINUX_OF_I2C_H | 13 | #define __LINUX_OF_I2C_H |
| 14 | 14 | ||
| 15 | #if defined(CONFIG_OF_I2C) || defined(CONFIG_OF_I2C_MODULE) | ||
| 15 | #include <linux/i2c.h> | 16 | #include <linux/i2c.h> |
| 16 | 17 | ||
| 17 | void of_register_i2c_devices(struct i2c_adapter *adap, | 18 | extern void of_i2c_register_devices(struct i2c_adapter *adap); |
| 18 | struct device_node *adap_node); | ||
| 19 | 19 | ||
| 20 | /* must call put_device() when done with returned i2c_client device */ | 20 | /* must call put_device() when done with returned i2c_client device */ |
| 21 | struct i2c_client *of_find_i2c_device_by_node(struct device_node *node); | 21 | extern struct i2c_client *of_find_i2c_device_by_node(struct device_node *node); |
| 22 | |||
| 23 | #else | ||
| 24 | static inline void of_i2c_register_devices(struct i2c_adapter *adap) | ||
| 25 | { | ||
| 26 | return; | ||
| 27 | } | ||
| 28 | #endif /* CONFIG_OF_I2C */ | ||
| 22 | 29 | ||
| 23 | #endif /* __LINUX_OF_I2C_H */ | 30 | #endif /* __LINUX_OF_I2C_H */ |
diff --git a/include/linux/of_irq.h b/include/linux/of_irq.h new file mode 100644 index 000000000000..109e013b1772 --- /dev/null +++ b/include/linux/of_irq.h | |||
| @@ -0,0 +1,74 @@ | |||
| 1 | #ifndef __OF_IRQ_H | ||
| 2 | #define __OF_IRQ_H | ||
| 3 | |||
| 4 | #if defined(CONFIG_OF) | ||
| 5 | struct of_irq; | ||
| 6 | #include <linux/types.h> | ||
| 7 | #include <linux/errno.h> | ||
| 8 | #include <linux/irq.h> | ||
| 9 | #include <linux/ioport.h> | ||
| 10 | #include <linux/of.h> | ||
| 11 | |||
| 12 | /* | ||
| 13 | * irq_of_parse_and_map() is used ba all OF enabled platforms; but SPARC | ||
| 14 | * implements it differently. However, the prototype is the same for all, | ||
| 15 | * so declare it here regardless of the CONFIG_OF_IRQ setting. | ||
| 16 | */ | ||
| 17 | extern unsigned int irq_of_parse_and_map(struct device_node *node, int index); | ||
| 18 | |||
| 19 | #if defined(CONFIG_OF_IRQ) | ||
| 20 | /** | ||
| 21 | * of_irq - container for device_node/irq_specifier pair for an irq controller | ||
| 22 | * @controller: pointer to interrupt controller device tree node | ||
| 23 | * @size: size of interrupt specifier | ||
| 24 | * @specifier: array of cells @size long specifing the specific interrupt | ||
| 25 | * | ||
| 26 | * This structure is returned when an interrupt is mapped. The controller | ||
| 27 | * field needs to be put() after use | ||
| 28 | */ | ||
| 29 | #define OF_MAX_IRQ_SPEC 4 /* We handle specifiers of at most 4 cells */ | ||
| 30 | struct of_irq { | ||
| 31 | struct device_node *controller; /* Interrupt controller node */ | ||
| 32 | u32 size; /* Specifier size */ | ||
| 33 | u32 specifier[OF_MAX_IRQ_SPEC]; /* Specifier copy */ | ||
| 34 | }; | ||
| 35 | |||
| 36 | /* | ||
| 37 | * Workarounds only applied to 32bit powermac machines | ||
| 38 | */ | ||
| 39 | #define OF_IMAP_OLDWORLD_MAC 0x00000001 | ||
| 40 | #define OF_IMAP_NO_PHANDLE 0x00000002 | ||
| 41 | |||
| 42 | #if defined(CONFIG_PPC32) && defined(CONFIG_PPC_PMAC) | ||
| 43 | extern unsigned int of_irq_workarounds; | ||
| 44 | extern struct device_node *of_irq_dflt_pic; | ||
| 45 | extern int of_irq_map_oldworld(struct device_node *device, int index, | ||
| 46 | struct of_irq *out_irq); | ||
| 47 | #else /* CONFIG_PPC32 && CONFIG_PPC_PMAC */ | ||
| 48 | #define of_irq_workarounds (0) | ||
| 49 | #define of_irq_dflt_pic (NULL) | ||
| 50 | static inline int of_irq_map_oldworld(struct device_node *device, int index, | ||
| 51 | struct of_irq *out_irq) | ||
| 52 | { | ||
| 53 | return -EINVAL; | ||
| 54 | } | ||
| 55 | #endif /* CONFIG_PPC32 && CONFIG_PPC_PMAC */ | ||
| 56 | |||
| 57 | |||
| 58 | extern int of_irq_map_raw(struct device_node *parent, const u32 *intspec, | ||
| 59 | u32 ointsize, const u32 *addr, | ||
| 60 | struct of_irq *out_irq); | ||
| 61 | extern int of_irq_map_one(struct device_node *device, int index, | ||
| 62 | struct of_irq *out_irq); | ||
| 63 | extern unsigned int irq_create_of_mapping(struct device_node *controller, | ||
| 64 | const u32 *intspec, | ||
| 65 | unsigned int intsize); | ||
| 66 | extern int of_irq_to_resource(struct device_node *dev, int index, | ||
| 67 | struct resource *r); | ||
| 68 | extern int of_irq_count(struct device_node *dev); | ||
| 69 | extern int of_irq_to_resource_table(struct device_node *dev, | ||
| 70 | struct resource *res, int nr_irqs); | ||
| 71 | |||
| 72 | #endif /* CONFIG_OF_IRQ */ | ||
| 73 | #endif /* CONFIG_OF */ | ||
| 74 | #endif /* __OF_IRQ_H */ | ||
diff --git a/include/linux/of_pdt.h b/include/linux/of_pdt.h new file mode 100644 index 000000000000..c65a18a0cfdf --- /dev/null +++ b/include/linux/of_pdt.h | |||
| @@ -0,0 +1,45 @@ | |||
| 1 | /* | ||
| 2 | * Definitions for building a device tree by calling into the | ||
| 3 | * Open Firmware PROM. | ||
| 4 | * | ||
| 5 | * Copyright (C) 2010 Andres Salomon <dilinger@queued.net> | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or | ||
| 8 | * modify it under the terms of the GNU General Public License | ||
| 9 | * as published by the Free Software Foundation; either version | ||
| 10 | * 2 of the License, or (at your option) any later version. | ||
| 11 | */ | ||
| 12 | |||
| 13 | #ifndef _LINUX_OF_PDT_H | ||
| 14 | #define _LINUX_OF_PDT_H | ||
| 15 | |||
| 16 | /* overridable operations for calling into the PROM */ | ||
| 17 | struct of_pdt_ops { | ||
| 18 | /* | ||
| 19 | * buf should be 32 bytes; return 0 on success. | ||
| 20 | * If prev is NULL, the first property will be returned. | ||
| 21 | */ | ||
| 22 | int (*nextprop)(phandle node, char *prev, char *buf); | ||
| 23 | |||
| 24 | /* for both functions, return proplen on success; -1 on error */ | ||
| 25 | int (*getproplen)(phandle node, const char *prop); | ||
| 26 | int (*getproperty)(phandle node, const char *prop, char *buf, | ||
| 27 | int bufsize); | ||
| 28 | |||
| 29 | /* phandles are 0 if no child or sibling exists */ | ||
| 30 | phandle (*getchild)(phandle parent); | ||
| 31 | phandle (*getsibling)(phandle node); | ||
| 32 | |||
| 33 | /* return 0 on success; fill in 'len' with number of bytes in path */ | ||
| 34 | int (*pkg2path)(phandle node, char *buf, const int buflen, int *len); | ||
| 35 | }; | ||
| 36 | |||
| 37 | extern void *prom_early_alloc(unsigned long size); | ||
| 38 | |||
| 39 | /* for building the device tree */ | ||
| 40 | extern void of_pdt_build_devicetree(phandle root_node, struct of_pdt_ops *ops); | ||
| 41 | |||
| 42 | extern void (*of_pdt_build_more)(struct device_node *dp, | ||
| 43 | struct device_node ***nextp); | ||
| 44 | |||
| 45 | #endif /* _LINUX_OF_PDT_H */ | ||
diff --git a/include/linux/of_platform.h b/include/linux/of_platform.h index 1643d3761eb4..a68716ad38ce 100644 --- a/include/linux/of_platform.h +++ b/include/linux/of_platform.h | |||
| @@ -17,29 +17,32 @@ | |||
| 17 | #include <linux/mod_devicetable.h> | 17 | #include <linux/mod_devicetable.h> |
| 18 | #include <linux/pm.h> | 18 | #include <linux/pm.h> |
| 19 | #include <linux/of_device.h> | 19 | #include <linux/of_device.h> |
| 20 | #include <linux/platform_device.h> | ||
| 20 | 21 | ||
| 21 | /* | 22 | /** |
| 22 | * The of_platform_bus_type is a bus type used by drivers that do not | 23 | * of_platform_driver - Legacy of-aware driver for platform devices. |
| 23 | * attach to a macio or similar bus but still use OF probing | 24 | * |
| 24 | * mechanism | 25 | * An of_platform_driver driver is attached to a basic platform_device on |
| 25 | */ | 26 | * ether the "platform bus" (platform_bus_type), or the ibm ebus |
| 26 | extern struct bus_type of_platform_bus_type; | 27 | * (ibmebus_bus_type). |
| 27 | 28 | * | |
| 28 | /* | 29 | * of_platform_driver is being phased out when used with the platform_bus_type, |
| 29 | * An of_platform_driver driver is attached to a basic of_device on | 30 | * and regular platform_drivers should be used instead. When the transition |
| 30 | * the "platform bus" (of_platform_bus_type). | 31 | * is complete, only ibmebus will be using this structure, and the |
| 32 | * platform_driver member of this structure will be removed. | ||
| 31 | */ | 33 | */ |
| 32 | struct of_platform_driver | 34 | struct of_platform_driver |
| 33 | { | 35 | { |
| 34 | int (*probe)(struct of_device* dev, | 36 | int (*probe)(struct platform_device* dev, |
| 35 | const struct of_device_id *match); | 37 | const struct of_device_id *match); |
| 36 | int (*remove)(struct of_device* dev); | 38 | int (*remove)(struct platform_device* dev); |
| 37 | 39 | ||
| 38 | int (*suspend)(struct of_device* dev, pm_message_t state); | 40 | int (*suspend)(struct platform_device* dev, pm_message_t state); |
| 39 | int (*resume)(struct of_device* dev); | 41 | int (*resume)(struct platform_device* dev); |
| 40 | int (*shutdown)(struct of_device* dev); | 42 | int (*shutdown)(struct platform_device* dev); |
| 41 | 43 | ||
| 42 | struct device_driver driver; | 44 | struct device_driver driver; |
| 45 | struct platform_driver platform_driver; | ||
| 43 | }; | 46 | }; |
| 44 | #define to_of_platform_driver(drv) \ | 47 | #define to_of_platform_driver(drv) \ |
| 45 | container_of(drv,struct of_platform_driver, driver) | 48 | container_of(drv,struct of_platform_driver, driver) |
| @@ -49,20 +52,30 @@ extern int of_register_driver(struct of_platform_driver *drv, | |||
| 49 | extern void of_unregister_driver(struct of_platform_driver *drv); | 52 | extern void of_unregister_driver(struct of_platform_driver *drv); |
| 50 | 53 | ||
| 51 | /* Platform drivers register/unregister */ | 54 | /* Platform drivers register/unregister */ |
| 52 | static inline int of_register_platform_driver(struct of_platform_driver *drv) | 55 | extern int of_register_platform_driver(struct of_platform_driver *drv); |
| 53 | { | 56 | extern void of_unregister_platform_driver(struct of_platform_driver *drv); |
| 54 | return of_register_driver(drv, &of_platform_bus_type); | ||
| 55 | } | ||
| 56 | static inline void of_unregister_platform_driver(struct of_platform_driver *drv) | ||
| 57 | { | ||
| 58 | of_unregister_driver(drv); | ||
| 59 | } | ||
| 60 | |||
| 61 | #include <asm/of_platform.h> | ||
| 62 | 57 | ||
| 63 | extern struct of_device *of_find_device_by_node(struct device_node *np); | 58 | extern struct platform_device *of_device_alloc(struct device_node *np, |
| 59 | const char *bus_id, | ||
| 60 | struct device *parent); | ||
| 61 | extern struct platform_device *of_find_device_by_node(struct device_node *np); | ||
| 64 | 62 | ||
| 65 | extern int of_bus_type_init(struct bus_type *bus, const char *name); | 63 | extern int of_bus_type_init(struct bus_type *bus, const char *name); |
| 64 | |||
| 65 | #if !defined(CONFIG_SPARC) /* SPARC has its own device registration method */ | ||
| 66 | /* Platform devices and busses creation */ | ||
| 67 | extern struct platform_device *of_platform_device_create(struct device_node *np, | ||
| 68 | const char *bus_id, | ||
| 69 | struct device *parent); | ||
| 70 | |||
| 71 | /* pseudo "matches" value to not do deep probe */ | ||
| 72 | #define OF_NO_DEEP_PROBE ((struct of_device_id *)-1) | ||
| 73 | |||
| 74 | extern int of_platform_bus_probe(struct device_node *root, | ||
| 75 | const struct of_device_id *matches, | ||
| 76 | struct device *parent); | ||
| 77 | #endif /* !CONFIG_SPARC */ | ||
| 78 | |||
| 66 | #endif /* CONFIG_OF_DEVICE */ | 79 | #endif /* CONFIG_OF_DEVICE */ |
| 67 | 80 | ||
| 68 | #endif /* _LINUX_OF_PLATFORM_H */ | 81 | #endif /* _LINUX_OF_PLATFORM_H */ |
diff --git a/include/linux/of_spi.h b/include/linux/of_spi.h index 5f71ee8c0868..9e3e70f78ae6 100644 --- a/include/linux/of_spi.h +++ b/include/linux/of_spi.h | |||
| @@ -9,10 +9,15 @@ | |||
| 9 | #ifndef __LINUX_OF_SPI_H | 9 | #ifndef __LINUX_OF_SPI_H |
| 10 | #define __LINUX_OF_SPI_H | 10 | #define __LINUX_OF_SPI_H |
| 11 | 11 | ||
| 12 | #include <linux/of.h> | ||
| 13 | #include <linux/spi/spi.h> | 12 | #include <linux/spi/spi.h> |
| 14 | 13 | ||
| 15 | extern void of_register_spi_devices(struct spi_master *master, | 14 | #if defined(CONFIG_OF_SPI) || defined(CONFIG_OF_SPI_MODULE) |
| 16 | struct device_node *np); | 15 | extern void of_register_spi_devices(struct spi_master *master); |
| 16 | #else | ||
| 17 | static inline void of_register_spi_devices(struct spi_master *master) | ||
| 18 | { | ||
| 19 | return; | ||
| 20 | } | ||
| 21 | #endif /* CONFIG_OF_SPI */ | ||
| 17 | 22 | ||
| 18 | #endif /* __LINUX_OF_SPI */ | 23 | #endif /* __LINUX_OF_SPI */ |
diff --git a/include/linux/omapfb.h b/include/linux/omapfb.h index 9bdd91486b49..c0b018790f07 100644 --- a/include/linux/omapfb.h +++ b/include/linux/omapfb.h | |||
| @@ -85,6 +85,9 @@ | |||
| 85 | #define OMAPFB_MEMTYPE_SRAM 1 | 85 | #define OMAPFB_MEMTYPE_SRAM 1 |
| 86 | #define OMAPFB_MEMTYPE_MAX 1 | 86 | #define OMAPFB_MEMTYPE_MAX 1 |
| 87 | 87 | ||
| 88 | #define OMAPFB_MEM_IDX_ENABLED 0x80 | ||
| 89 | #define OMAPFB_MEM_IDX_MASK 0x7f | ||
| 90 | |||
| 88 | enum omapfb_color_format { | 91 | enum omapfb_color_format { |
| 89 | OMAPFB_COLOR_RGB565 = 0, | 92 | OMAPFB_COLOR_RGB565 = 0, |
| 90 | OMAPFB_COLOR_YUV422, | 93 | OMAPFB_COLOR_YUV422, |
| @@ -136,7 +139,7 @@ struct omapfb_plane_info { | |||
| 136 | __u8 enabled; | 139 | __u8 enabled; |
| 137 | __u8 channel_out; | 140 | __u8 channel_out; |
| 138 | __u8 mirror; | 141 | __u8 mirror; |
| 139 | __u8 reserved1; | 142 | __u8 mem_idx; |
| 140 | __u32 out_width; | 143 | __u32 out_width; |
| 141 | __u32 out_height; | 144 | __u32 out_height; |
| 142 | __u32 reserved2[12]; | 145 | __u32 reserved2[12]; |
| @@ -253,7 +256,7 @@ struct omapfb_platform_data { | |||
| 253 | /* in arch/arm/plat-omap/fb.c */ | 256 | /* in arch/arm/plat-omap/fb.c */ |
| 254 | extern void omapfb_set_platform_data(struct omapfb_platform_data *data); | 257 | extern void omapfb_set_platform_data(struct omapfb_platform_data *data); |
| 255 | extern void omapfb_set_ctrl_platform_data(void *pdata); | 258 | extern void omapfb_set_ctrl_platform_data(void *pdata); |
| 256 | extern void omapfb_reserve_sdram(void); | 259 | extern void omapfb_reserve_sdram_memblock(void); |
| 257 | 260 | ||
| 258 | #endif | 261 | #endif |
| 259 | 262 | ||
diff --git a/include/linux/oom.h b/include/linux/oom.h index 537662315627..5e3aa8311c5e 100644 --- a/include/linux/oom.h +++ b/include/linux/oom.h | |||
| @@ -1,19 +1,34 @@ | |||
| 1 | #ifndef __INCLUDE_LINUX_OOM_H | 1 | #ifndef __INCLUDE_LINUX_OOM_H |
| 2 | #define __INCLUDE_LINUX_OOM_H | 2 | #define __INCLUDE_LINUX_OOM_H |
| 3 | 3 | ||
| 4 | /* /proc/<pid>/oom_adj set to -17 protects from the oom-killer */ | 4 | /* |
| 5 | * /proc/<pid>/oom_adj is deprecated, see | ||
| 6 | * Documentation/feature-removal-schedule.txt. | ||
| 7 | * | ||
| 8 | * /proc/<pid>/oom_adj set to -17 protects from the oom-killer | ||
| 9 | */ | ||
| 5 | #define OOM_DISABLE (-17) | 10 | #define OOM_DISABLE (-17) |
| 6 | /* inclusive */ | 11 | /* inclusive */ |
| 7 | #define OOM_ADJUST_MIN (-16) | 12 | #define OOM_ADJUST_MIN (-16) |
| 8 | #define OOM_ADJUST_MAX 15 | 13 | #define OOM_ADJUST_MAX 15 |
| 9 | 14 | ||
| 15 | /* | ||
| 16 | * /proc/<pid>/oom_score_adj set to OOM_SCORE_ADJ_MIN disables oom killing for | ||
| 17 | * pid. | ||
| 18 | */ | ||
| 19 | #define OOM_SCORE_ADJ_MIN (-1000) | ||
| 20 | #define OOM_SCORE_ADJ_MAX 1000 | ||
| 21 | |||
| 10 | #ifdef __KERNEL__ | 22 | #ifdef __KERNEL__ |
| 11 | 23 | ||
| 24 | #include <linux/sched.h> | ||
| 12 | #include <linux/types.h> | 25 | #include <linux/types.h> |
| 13 | #include <linux/nodemask.h> | 26 | #include <linux/nodemask.h> |
| 14 | 27 | ||
| 15 | struct zonelist; | 28 | struct zonelist; |
| 16 | struct notifier_block; | 29 | struct notifier_block; |
| 30 | struct mem_cgroup; | ||
| 31 | struct task_struct; | ||
| 17 | 32 | ||
| 18 | /* | 33 | /* |
| 19 | * Types of limitations to the nodes from which allocations may occur | 34 | * Types of limitations to the nodes from which allocations may occur |
| @@ -22,9 +37,12 @@ enum oom_constraint { | |||
| 22 | CONSTRAINT_NONE, | 37 | CONSTRAINT_NONE, |
| 23 | CONSTRAINT_CPUSET, | 38 | CONSTRAINT_CPUSET, |
| 24 | CONSTRAINT_MEMORY_POLICY, | 39 | CONSTRAINT_MEMORY_POLICY, |
| 40 | CONSTRAINT_MEMCG, | ||
| 25 | }; | 41 | }; |
| 26 | 42 | ||
| 27 | extern int try_set_zone_oom(struct zonelist *zonelist, gfp_t gfp_flags); | 43 | extern unsigned int oom_badness(struct task_struct *p, struct mem_cgroup *mem, |
| 44 | const nodemask_t *nodemask, unsigned long totalpages); | ||
| 45 | extern int try_set_zonelist_oom(struct zonelist *zonelist, gfp_t gfp_flags); | ||
| 28 | extern void clear_zonelist_oom(struct zonelist *zonelist, gfp_t gfp_flags); | 46 | extern void clear_zonelist_oom(struct zonelist *zonelist, gfp_t gfp_flags); |
| 29 | 47 | ||
| 30 | extern void out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask, | 48 | extern void out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask, |
| @@ -43,5 +61,16 @@ static inline void oom_killer_enable(void) | |||
| 43 | { | 61 | { |
| 44 | oom_killer_disabled = false; | 62 | oom_killer_disabled = false; |
| 45 | } | 63 | } |
| 64 | |||
| 65 | /* The badness from the OOM killer */ | ||
| 66 | extern unsigned long badness(struct task_struct *p, struct mem_cgroup *mem, | ||
| 67 | const nodemask_t *nodemask, unsigned long uptime); | ||
| 68 | |||
| 69 | extern struct task_struct *find_lock_task_mm(struct task_struct *p); | ||
| 70 | |||
| 71 | /* sysctls */ | ||
| 72 | extern int sysctl_oom_dump_tasks; | ||
| 73 | extern int sysctl_oom_kill_allocating_task; | ||
| 74 | extern int sysctl_panic_on_oom; | ||
| 46 | #endif /* __KERNEL__*/ | 75 | #endif /* __KERNEL__*/ |
| 47 | #endif /* _INCLUDE_LINUX_OOM_H */ | 76 | #endif /* _INCLUDE_LINUX_OOM_H */ |
diff --git a/include/linux/opp.h b/include/linux/opp.h new file mode 100644 index 000000000000..5449945d589f --- /dev/null +++ b/include/linux/opp.h | |||
| @@ -0,0 +1,105 @@ | |||
| 1 | /* | ||
| 2 | * Generic OPP Interface | ||
| 3 | * | ||
| 4 | * Copyright (C) 2009-2010 Texas Instruments Incorporated. | ||
| 5 | * Nishanth Menon | ||
| 6 | * Romit Dasgupta | ||
| 7 | * Kevin Hilman | ||
| 8 | * | ||
| 9 | * This program is free software; you can redistribute it and/or modify | ||
| 10 | * it under the terms of the GNU General Public License version 2 as | ||
| 11 | * published by the Free Software Foundation. | ||
| 12 | */ | ||
| 13 | |||
| 14 | #ifndef __LINUX_OPP_H__ | ||
| 15 | #define __LINUX_OPP_H__ | ||
| 16 | |||
| 17 | #include <linux/err.h> | ||
| 18 | #include <linux/cpufreq.h> | ||
| 19 | |||
| 20 | struct opp; | ||
| 21 | |||
| 22 | #if defined(CONFIG_PM_OPP) | ||
| 23 | |||
| 24 | unsigned long opp_get_voltage(struct opp *opp); | ||
| 25 | |||
| 26 | unsigned long opp_get_freq(struct opp *opp); | ||
| 27 | |||
| 28 | int opp_get_opp_count(struct device *dev); | ||
| 29 | |||
| 30 | struct opp *opp_find_freq_exact(struct device *dev, unsigned long freq, | ||
| 31 | bool available); | ||
| 32 | |||
| 33 | struct opp *opp_find_freq_floor(struct device *dev, unsigned long *freq); | ||
| 34 | |||
| 35 | struct opp *opp_find_freq_ceil(struct device *dev, unsigned long *freq); | ||
| 36 | |||
| 37 | int opp_add(struct device *dev, unsigned long freq, unsigned long u_volt); | ||
| 38 | |||
| 39 | int opp_enable(struct device *dev, unsigned long freq); | ||
| 40 | |||
| 41 | int opp_disable(struct device *dev, unsigned long freq); | ||
| 42 | |||
| 43 | #else | ||
| 44 | static inline unsigned long opp_get_voltage(struct opp *opp) | ||
| 45 | { | ||
| 46 | return 0; | ||
| 47 | } | ||
| 48 | |||
| 49 | static inline unsigned long opp_get_freq(struct opp *opp) | ||
| 50 | { | ||
| 51 | return 0; | ||
| 52 | } | ||
| 53 | |||
| 54 | static inline int opp_get_opp_count(struct device *dev) | ||
| 55 | { | ||
| 56 | return 0; | ||
| 57 | } | ||
| 58 | |||
| 59 | static inline struct opp *opp_find_freq_exact(struct device *dev, | ||
| 60 | unsigned long freq, bool available) | ||
| 61 | { | ||
| 62 | return ERR_PTR(-EINVAL); | ||
| 63 | } | ||
| 64 | |||
| 65 | static inline struct opp *opp_find_freq_floor(struct device *dev, | ||
| 66 | unsigned long *freq) | ||
| 67 | { | ||
| 68 | return ERR_PTR(-EINVAL); | ||
| 69 | } | ||
| 70 | |||
| 71 | static inline struct opp *opp_find_freq_ceil(struct device *dev, | ||
| 72 | unsigned long *freq) | ||
| 73 | { | ||
| 74 | return ERR_PTR(-EINVAL); | ||
| 75 | } | ||
| 76 | |||
| 77 | static inline int opp_add(struct device *dev, unsigned long freq, | ||
| 78 | unsigned long u_volt) | ||
| 79 | { | ||
| 80 | return -EINVAL; | ||
| 81 | } | ||
| 82 | |||
| 83 | static inline int opp_enable(struct device *dev, unsigned long freq) | ||
| 84 | { | ||
| 85 | return 0; | ||
| 86 | } | ||
| 87 | |||
| 88 | static inline int opp_disable(struct device *dev, unsigned long freq) | ||
| 89 | { | ||
| 90 | return 0; | ||
| 91 | } | ||
| 92 | #endif /* CONFIG_PM */ | ||
| 93 | |||
| 94 | #if defined(CONFIG_CPU_FREQ) && defined(CONFIG_PM_OPP) | ||
| 95 | int opp_init_cpufreq_table(struct device *dev, | ||
| 96 | struct cpufreq_frequency_table **table); | ||
| 97 | #else | ||
| 98 | static inline int opp_init_cpufreq_table(struct device *dev, | ||
| 99 | struct cpufreq_frequency_table **table) | ||
| 100 | { | ||
| 101 | return -EINVAL; | ||
| 102 | } | ||
| 103 | #endif /* CONFIG_CPU_FREQ */ | ||
| 104 | |||
| 105 | #endif /* __LINUX_OPP_H__ */ | ||
diff --git a/include/linux/oprofile.h b/include/linux/oprofile.h index 5171639ecf0f..32fb81212fd1 100644 --- a/include/linux/oprofile.h +++ b/include/linux/oprofile.h | |||
| @@ -15,6 +15,7 @@ | |||
| 15 | 15 | ||
| 16 | #include <linux/types.h> | 16 | #include <linux/types.h> |
| 17 | #include <linux/spinlock.h> | 17 | #include <linux/spinlock.h> |
| 18 | #include <linux/init.h> | ||
| 18 | #include <asm/atomic.h> | 19 | #include <asm/atomic.h> |
| 19 | 20 | ||
| 20 | /* Each escaped entry is prefixed by ESCAPE_CODE | 21 | /* Each escaped entry is prefixed by ESCAPE_CODE |
| @@ -185,4 +186,10 @@ int oprofile_add_data(struct op_entry *entry, unsigned long val); | |||
| 185 | int oprofile_add_data64(struct op_entry *entry, u64 val); | 186 | int oprofile_add_data64(struct op_entry *entry, u64 val); |
| 186 | int oprofile_write_commit(struct op_entry *entry); | 187 | int oprofile_write_commit(struct op_entry *entry); |
| 187 | 188 | ||
| 189 | #ifdef CONFIG_PERF_EVENTS | ||
| 190 | int __init oprofile_perf_init(struct oprofile_operations *ops); | ||
| 191 | void oprofile_perf_exit(void); | ||
| 192 | char *op_name_from_perf_id(void); | ||
| 193 | #endif /* CONFIG_PERF_EVENTS */ | ||
| 194 | |||
| 188 | #endif /* OPROFILE_H */ | 195 | #endif /* OPROFILE_H */ |
diff --git a/include/linux/padata.h b/include/linux/padata.h index 8d8406246eef..4633b2f726b6 100644 --- a/include/linux/padata.h +++ b/include/linux/padata.h | |||
| @@ -25,6 +25,11 @@ | |||
| 25 | #include <linux/spinlock.h> | 25 | #include <linux/spinlock.h> |
| 26 | #include <linux/list.h> | 26 | #include <linux/list.h> |
| 27 | #include <linux/timer.h> | 27 | #include <linux/timer.h> |
| 28 | #include <linux/notifier.h> | ||
| 29 | #include <linux/kobject.h> | ||
| 30 | |||
| 31 | #define PADATA_CPU_SERIAL 0x01 | ||
| 32 | #define PADATA_CPU_PARALLEL 0x02 | ||
| 28 | 33 | ||
| 29 | /** | 34 | /** |
| 30 | * struct padata_priv - Embedded to the users data structure. | 35 | * struct padata_priv - Embedded to the users data structure. |
| @@ -59,7 +64,20 @@ struct padata_list { | |||
| 59 | }; | 64 | }; |
| 60 | 65 | ||
| 61 | /** | 66 | /** |
| 62 | * struct padata_queue - The percpu padata queues. | 67 | * struct padata_serial_queue - The percpu padata serial queue |
| 68 | * | ||
| 69 | * @serial: List to wait for serialization after reordering. | ||
| 70 | * @work: work struct for serialization. | ||
| 71 | * @pd: Backpointer to the internal control structure. | ||
| 72 | */ | ||
| 73 | struct padata_serial_queue { | ||
| 74 | struct padata_list serial; | ||
| 75 | struct work_struct work; | ||
| 76 | struct parallel_data *pd; | ||
| 77 | }; | ||
| 78 | |||
| 79 | /** | ||
| 80 | * struct padata_parallel_queue - The percpu padata parallel queue | ||
| 63 | * | 81 | * |
| 64 | * @parallel: List to wait for parallelization. | 82 | * @parallel: List to wait for parallelization. |
| 65 | * @reorder: List to wait for reordering after parallel processing. | 83 | * @reorder: List to wait for reordering after parallel processing. |
| @@ -67,18 +85,28 @@ struct padata_list { | |||
| 67 | * @pwork: work struct for parallelization. | 85 | * @pwork: work struct for parallelization. |
| 68 | * @swork: work struct for serialization. | 86 | * @swork: work struct for serialization. |
| 69 | * @pd: Backpointer to the internal control structure. | 87 | * @pd: Backpointer to the internal control structure. |
| 88 | * @work: work struct for parallelization. | ||
| 70 | * @num_obj: Number of objects that are processed by this cpu. | 89 | * @num_obj: Number of objects that are processed by this cpu. |
| 71 | * @cpu_index: Index of the cpu. | 90 | * @cpu_index: Index of the cpu. |
| 72 | */ | 91 | */ |
| 73 | struct padata_queue { | 92 | struct padata_parallel_queue { |
| 74 | struct padata_list parallel; | 93 | struct padata_list parallel; |
| 75 | struct padata_list reorder; | 94 | struct padata_list reorder; |
| 76 | struct padata_list serial; | 95 | struct parallel_data *pd; |
| 77 | struct work_struct pwork; | 96 | struct work_struct work; |
| 78 | struct work_struct swork; | 97 | atomic_t num_obj; |
| 79 | struct parallel_data *pd; | 98 | int cpu_index; |
| 80 | atomic_t num_obj; | 99 | }; |
| 81 | int cpu_index; | 100 | |
| 101 | /** | ||
| 102 | * struct padata_cpumask - The cpumasks for the parallel/serial workers | ||
| 103 | * | ||
| 104 | * @pcpu: cpumask for the parallel workers. | ||
| 105 | * @cbcpu: cpumask for the serial (callback) workers. | ||
| 106 | */ | ||
| 107 | struct padata_cpumask { | ||
| 108 | cpumask_var_t pcpu; | ||
| 109 | cpumask_var_t cbcpu; | ||
| 82 | }; | 110 | }; |
| 83 | 111 | ||
| 84 | /** | 112 | /** |
| @@ -86,25 +114,29 @@ struct padata_queue { | |||
| 86 | * that depends on the cpumask in use. | 114 | * that depends on the cpumask in use. |
| 87 | * | 115 | * |
| 88 | * @pinst: padata instance. | 116 | * @pinst: padata instance. |
| 89 | * @queue: percpu padata queues. | 117 | * @pqueue: percpu padata queues used for parallelization. |
| 118 | * @squeue: percpu padata queues used for serialuzation. | ||
| 90 | * @seq_nr: The sequence number that will be attached to the next object. | 119 | * @seq_nr: The sequence number that will be attached to the next object. |
| 91 | * @reorder_objects: Number of objects waiting in the reorder queues. | 120 | * @reorder_objects: Number of objects waiting in the reorder queues. |
| 92 | * @refcnt: Number of objects holding a reference on this parallel_data. | 121 | * @refcnt: Number of objects holding a reference on this parallel_data. |
| 93 | * @max_seq_nr: Maximal used sequence number. | 122 | * @max_seq_nr: Maximal used sequence number. |
| 94 | * @cpumask: cpumask in use. | 123 | * @cpumask: The cpumasks in use for parallel and serial workers. |
| 95 | * @lock: Reorder lock. | 124 | * @lock: Reorder lock. |
| 125 | * @processed: Number of already processed objects. | ||
| 96 | * @timer: Reorder timer. | 126 | * @timer: Reorder timer. |
| 97 | */ | 127 | */ |
| 98 | struct parallel_data { | 128 | struct parallel_data { |
| 99 | struct padata_instance *pinst; | 129 | struct padata_instance *pinst; |
| 100 | struct padata_queue *queue; | 130 | struct padata_parallel_queue __percpu *pqueue; |
| 101 | atomic_t seq_nr; | 131 | struct padata_serial_queue __percpu *squeue; |
| 102 | atomic_t reorder_objects; | 132 | atomic_t seq_nr; |
| 103 | atomic_t refcnt; | 133 | atomic_t reorder_objects; |
| 104 | unsigned int max_seq_nr; | 134 | atomic_t refcnt; |
| 105 | cpumask_var_t cpumask; | 135 | unsigned int max_seq_nr; |
| 106 | spinlock_t lock; | 136 | struct padata_cpumask cpumask; |
| 107 | struct timer_list timer; | 137 | spinlock_t lock ____cacheline_aligned; |
| 138 | unsigned int processed; | ||
| 139 | struct timer_list timer; | ||
| 108 | }; | 140 | }; |
| 109 | 141 | ||
| 110 | /** | 142 | /** |
| @@ -113,31 +145,48 @@ struct parallel_data { | |||
| 113 | * @cpu_notifier: cpu hotplug notifier. | 145 | * @cpu_notifier: cpu hotplug notifier. |
| 114 | * @wq: The workqueue in use. | 146 | * @wq: The workqueue in use. |
| 115 | * @pd: The internal control structure. | 147 | * @pd: The internal control structure. |
| 116 | * @cpumask: User supplied cpumask. | 148 | * @cpumask: User supplied cpumasks for parallel and serial works. |
| 149 | * @cpumask_change_notifier: Notifiers chain for user-defined notify | ||
| 150 | * callbacks that will be called when either @pcpu or @cbcpu | ||
| 151 | * or both cpumasks change. | ||
| 152 | * @kobj: padata instance kernel object. | ||
| 117 | * @lock: padata instance lock. | 153 | * @lock: padata instance lock. |
| 118 | * @flags: padata flags. | 154 | * @flags: padata flags. |
| 119 | */ | 155 | */ |
| 120 | struct padata_instance { | 156 | struct padata_instance { |
| 121 | struct notifier_block cpu_notifier; | 157 | struct notifier_block cpu_notifier; |
| 122 | struct workqueue_struct *wq; | 158 | struct workqueue_struct *wq; |
| 123 | struct parallel_data *pd; | 159 | struct parallel_data *pd; |
| 124 | cpumask_var_t cpumask; | 160 | struct padata_cpumask cpumask; |
| 125 | struct mutex lock; | 161 | struct blocking_notifier_head cpumask_change_notifier; |
| 126 | u8 flags; | 162 | struct kobject kobj; |
| 127 | #define PADATA_INIT 1 | 163 | struct mutex lock; |
| 128 | #define PADATA_RESET 2 | 164 | u8 flags; |
| 165 | #define PADATA_INIT 1 | ||
| 166 | #define PADATA_RESET 2 | ||
| 167 | #define PADATA_INVALID 4 | ||
| 129 | }; | 168 | }; |
| 130 | 169 | ||
| 131 | extern struct padata_instance *padata_alloc(const struct cpumask *cpumask, | 170 | extern struct padata_instance *padata_alloc_possible( |
| 132 | struct workqueue_struct *wq); | 171 | struct workqueue_struct *wq); |
| 172 | extern struct padata_instance *padata_alloc(struct workqueue_struct *wq, | ||
| 173 | const struct cpumask *pcpumask, | ||
| 174 | const struct cpumask *cbcpumask); | ||
| 133 | extern void padata_free(struct padata_instance *pinst); | 175 | extern void padata_free(struct padata_instance *pinst); |
| 134 | extern int padata_do_parallel(struct padata_instance *pinst, | 176 | extern int padata_do_parallel(struct padata_instance *pinst, |
| 135 | struct padata_priv *padata, int cb_cpu); | 177 | struct padata_priv *padata, int cb_cpu); |
| 136 | extern void padata_do_serial(struct padata_priv *padata); | 178 | extern void padata_do_serial(struct padata_priv *padata); |
| 137 | extern int padata_set_cpumask(struct padata_instance *pinst, | 179 | extern int padata_set_cpumask(struct padata_instance *pinst, int cpumask_type, |
| 138 | cpumask_var_t cpumask); | 180 | cpumask_var_t cpumask); |
| 139 | extern int padata_add_cpu(struct padata_instance *pinst, int cpu); | 181 | extern int padata_set_cpumasks(struct padata_instance *pinst, |
| 140 | extern int padata_remove_cpu(struct padata_instance *pinst, int cpu); | 182 | cpumask_var_t pcpumask, |
| 141 | extern void padata_start(struct padata_instance *pinst); | 183 | cpumask_var_t cbcpumask); |
| 184 | extern int padata_add_cpu(struct padata_instance *pinst, int cpu, int mask); | ||
| 185 | extern int padata_remove_cpu(struct padata_instance *pinst, int cpu, int mask); | ||
| 186 | extern int padata_start(struct padata_instance *pinst); | ||
| 142 | extern void padata_stop(struct padata_instance *pinst); | 187 | extern void padata_stop(struct padata_instance *pinst); |
| 188 | extern int padata_register_cpumask_notifier(struct padata_instance *pinst, | ||
| 189 | struct notifier_block *nblock); | ||
| 190 | extern int padata_unregister_cpumask_notifier(struct padata_instance *pinst, | ||
| 191 | struct notifier_block *nblock); | ||
| 143 | #endif | 192 | #endif |
diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h index 5b59f35dcb8f..5f38c460367e 100644 --- a/include/linux/page-flags.h +++ b/include/linux/page-flags.h | |||
| @@ -128,7 +128,6 @@ enum pageflags { | |||
| 128 | 128 | ||
| 129 | /* SLUB */ | 129 | /* SLUB */ |
| 130 | PG_slub_frozen = PG_active, | 130 | PG_slub_frozen = PG_active, |
| 131 | PG_slub_debug = PG_error, | ||
| 132 | }; | 131 | }; |
| 133 | 132 | ||
| 134 | #ifndef __GENERATING_BOUNDS_H | 133 | #ifndef __GENERATING_BOUNDS_H |
| @@ -215,7 +214,6 @@ PAGEFLAG(SwapBacked, swapbacked) __CLEARPAGEFLAG(SwapBacked, swapbacked) | |||
| 215 | __PAGEFLAG(SlobFree, slob_free) | 214 | __PAGEFLAG(SlobFree, slob_free) |
| 216 | 215 | ||
| 217 | __PAGEFLAG(SlubFrozen, slub_frozen) | 216 | __PAGEFLAG(SlubFrozen, slub_frozen) |
| 218 | __PAGEFLAG(SlubDebug, slub_debug) | ||
| 219 | 217 | ||
| 220 | /* | 218 | /* |
| 221 | * Private page markings that may be used by the filesystem that owns the page | 219 | * Private page markings that may be used by the filesystem that owns the page |
| @@ -312,7 +310,7 @@ static inline void SetPageUptodate(struct page *page) | |||
| 312 | { | 310 | { |
| 313 | #ifdef CONFIG_S390 | 311 | #ifdef CONFIG_S390 |
| 314 | if (!test_and_set_bit(PG_uptodate, &page->flags)) | 312 | if (!test_and_set_bit(PG_uptodate, &page->flags)) |
| 315 | page_clear_dirty(page); | 313 | page_clear_dirty(page, 0); |
| 316 | #else | 314 | #else |
| 317 | /* | 315 | /* |
| 318 | * Memory barrier must be issued before setting the PG_uptodate bit, | 316 | * Memory barrier must be issued before setting the PG_uptodate bit, |
diff --git a/include/linux/pageblock-flags.h b/include/linux/pageblock-flags.h index e8c06122be36..19ef95d293ae 100644 --- a/include/linux/pageblock-flags.h +++ b/include/linux/pageblock-flags.h | |||
| @@ -67,7 +67,8 @@ void set_pageblock_flags_group(struct page *page, unsigned long flags, | |||
| 67 | 67 | ||
| 68 | #define get_pageblock_flags(page) \ | 68 | #define get_pageblock_flags(page) \ |
| 69 | get_pageblock_flags_group(page, 0, NR_PAGEBLOCK_BITS-1) | 69 | get_pageblock_flags_group(page, 0, NR_PAGEBLOCK_BITS-1) |
| 70 | #define set_pageblock_flags(page) \ | 70 | #define set_pageblock_flags(page, flags) \ |
| 71 | set_pageblock_flags_group(page, 0, NR_PAGEBLOCK_BITS-1) | 71 | set_pageblock_flags_group(page, flags, \ |
| 72 | 0, NR_PAGEBLOCK_BITS-1) | ||
| 72 | 73 | ||
| 73 | #endif /* PAGEBLOCK_FLAGS_H */ | 74 | #endif /* PAGEBLOCK_FLAGS_H */ |
diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h index 3c62ed408492..2d1ffe3cf1ee 100644 --- a/include/linux/pagemap.h +++ b/include/linux/pagemap.h | |||
| @@ -13,6 +13,7 @@ | |||
| 13 | #include <linux/gfp.h> | 13 | #include <linux/gfp.h> |
| 14 | #include <linux/bitops.h> | 14 | #include <linux/bitops.h> |
| 15 | #include <linux/hardirq.h> /* for in_interrupt() */ | 15 | #include <linux/hardirq.h> /* for in_interrupt() */ |
| 16 | #include <linux/hugetlb_inline.h> | ||
| 16 | 17 | ||
| 17 | /* | 18 | /* |
| 18 | * Bits in mapping->flags. The lower __GFP_BITS_SHIFT bits are the page | 19 | * Bits in mapping->flags. The lower __GFP_BITS_SHIFT bits are the page |
| @@ -281,10 +282,16 @@ static inline loff_t page_offset(struct page *page) | |||
| 281 | return ((loff_t)page->index) << PAGE_CACHE_SHIFT; | 282 | return ((loff_t)page->index) << PAGE_CACHE_SHIFT; |
| 282 | } | 283 | } |
| 283 | 284 | ||
| 285 | extern pgoff_t linear_hugepage_index(struct vm_area_struct *vma, | ||
| 286 | unsigned long address); | ||
| 287 | |||
| 284 | static inline pgoff_t linear_page_index(struct vm_area_struct *vma, | 288 | static inline pgoff_t linear_page_index(struct vm_area_struct *vma, |
| 285 | unsigned long address) | 289 | unsigned long address) |
| 286 | { | 290 | { |
| 287 | pgoff_t pgoff = (address - vma->vm_start) >> PAGE_SHIFT; | 291 | pgoff_t pgoff; |
| 292 | if (unlikely(is_vm_hugetlb_page(vma))) | ||
| 293 | return linear_hugepage_index(vma, address); | ||
| 294 | pgoff = (address - vma->vm_start) >> PAGE_SHIFT; | ||
| 288 | pgoff += vma->vm_pgoff; | 295 | pgoff += vma->vm_pgoff; |
| 289 | return pgoff >> (PAGE_CACHE_SHIFT - PAGE_SHIFT); | 296 | return pgoff >> (PAGE_CACHE_SHIFT - PAGE_SHIFT); |
| 290 | } | 297 | } |
| @@ -292,6 +299,8 @@ static inline pgoff_t linear_page_index(struct vm_area_struct *vma, | |||
| 292 | extern void __lock_page(struct page *page); | 299 | extern void __lock_page(struct page *page); |
| 293 | extern int __lock_page_killable(struct page *page); | 300 | extern int __lock_page_killable(struct page *page); |
| 294 | extern void __lock_page_nosync(struct page *page); | 301 | extern void __lock_page_nosync(struct page *page); |
| 302 | extern int __lock_page_or_retry(struct page *page, struct mm_struct *mm, | ||
| 303 | unsigned int flags); | ||
| 295 | extern void unlock_page(struct page *page); | 304 | extern void unlock_page(struct page *page); |
| 296 | 305 | ||
| 297 | static inline void __set_page_locked(struct page *page) | 306 | static inline void __set_page_locked(struct page *page) |
| @@ -344,6 +353,17 @@ static inline void lock_page_nosync(struct page *page) | |||
| 344 | } | 353 | } |
| 345 | 354 | ||
| 346 | /* | 355 | /* |
| 356 | * lock_page_or_retry - Lock the page, unless this would block and the | ||
| 357 | * caller indicated that it can handle a retry. | ||
| 358 | */ | ||
| 359 | static inline int lock_page_or_retry(struct page *page, struct mm_struct *mm, | ||
| 360 | unsigned int flags) | ||
| 361 | { | ||
| 362 | might_sleep(); | ||
| 363 | return trylock_page(page) || __lock_page_or_retry(page, mm, flags); | ||
| 364 | } | ||
| 365 | |||
| 366 | /* | ||
| 347 | * This is exported only for wait_on_page_locked/wait_on_page_writeback. | 367 | * This is exported only for wait_on_page_locked/wait_on_page_writeback. |
| 348 | * Never use this directly! | 368 | * Never use this directly! |
| 349 | */ | 369 | */ |
| @@ -423,8 +443,10 @@ static inline int fault_in_pages_readable(const char __user *uaddr, int size) | |||
| 423 | const char __user *end = uaddr + size - 1; | 443 | const char __user *end = uaddr + size - 1; |
| 424 | 444 | ||
| 425 | if (((unsigned long)uaddr & PAGE_MASK) != | 445 | if (((unsigned long)uaddr & PAGE_MASK) != |
| 426 | ((unsigned long)end & PAGE_MASK)) | 446 | ((unsigned long)end & PAGE_MASK)) { |
| 427 | ret = __get_user(c, end); | 447 | ret = __get_user(c, end); |
| 448 | (void)c; | ||
| 449 | } | ||
| 428 | } | 450 | } |
| 429 | return ret; | 451 | return ret; |
| 430 | } | 452 | } |
diff --git a/include/linux/path.h b/include/linux/path.h index 915e0c382a51..edc98dec6266 100644 --- a/include/linux/path.h +++ b/include/linux/path.h | |||
| @@ -12,4 +12,9 @@ struct path { | |||
| 12 | extern void path_get(struct path *); | 12 | extern void path_get(struct path *); |
| 13 | extern void path_put(struct path *); | 13 | extern void path_put(struct path *); |
| 14 | 14 | ||
| 15 | static inline int path_equal(const struct path *path1, const struct path *path2) | ||
| 16 | { | ||
| 17 | return path1->mnt == path2->mnt && path1->dentry == path2->dentry; | ||
| 18 | } | ||
| 19 | |||
| 15 | #endif /* _LINUX_PATH_H */ | 20 | #endif /* _LINUX_PATH_H */ |
diff --git a/include/linux/pch_dma.h b/include/linux/pch_dma.h new file mode 100644 index 000000000000..fdafe529ef8a --- /dev/null +++ b/include/linux/pch_dma.h | |||
| @@ -0,0 +1,37 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (c) 2010 Intel Corporation | ||
| 3 | * | ||
| 4 | * This program is free software; you can redistribute it and/or modify | ||
| 5 | * it under the terms of the GNU General Public License version 2 as | ||
| 6 | * published by the Free Software Foundation. | ||
| 7 | * | ||
| 8 | * This program is distributed in the hope that it will be useful, | ||
| 9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 11 | * GNU General Public License for more details. | ||
| 12 | * | ||
| 13 | * You should have received a copy of the GNU General Public License | ||
| 14 | * along with this program; if not, write to the Free Software | ||
| 15 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
| 16 | */ | ||
| 17 | |||
| 18 | #ifndef PCH_DMA_H | ||
| 19 | #define PCH_DMA_H | ||
| 20 | |||
| 21 | #include <linux/dmaengine.h> | ||
| 22 | |||
| 23 | enum pch_dma_width { | ||
| 24 | PCH_DMA_WIDTH_1_BYTE, | ||
| 25 | PCH_DMA_WIDTH_2_BYTES, | ||
| 26 | PCH_DMA_WIDTH_4_BYTES, | ||
| 27 | }; | ||
| 28 | |||
| 29 | struct pch_dma_slave { | ||
| 30 | struct device *dma_dev; | ||
| 31 | unsigned int chan_id; | ||
| 32 | dma_addr_t tx_reg; | ||
| 33 | dma_addr_t rx_reg; | ||
| 34 | enum pch_dma_width width; | ||
| 35 | }; | ||
| 36 | |||
| 37 | #endif | ||
diff --git a/include/linux/pci.h b/include/linux/pci.h index f26fda76b87f..7454408c41b6 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h | |||
| @@ -270,6 +270,8 @@ struct pci_dev { | |||
| 270 | unsigned int d1_support:1; /* Low power state D1 is supported */ | 270 | unsigned int d1_support:1; /* Low power state D1 is supported */ |
| 271 | unsigned int d2_support:1; /* Low power state D2 is supported */ | 271 | unsigned int d2_support:1; /* Low power state D2 is supported */ |
| 272 | unsigned int no_d1d2:1; /* Only allow D0 and D3 */ | 272 | unsigned int no_d1d2:1; /* Only allow D0 and D3 */ |
| 273 | unsigned int mmio_always_on:1; /* disallow turning off io/mem | ||
| 274 | decoding during bar sizing */ | ||
| 273 | unsigned int wakeup_prepared:1; | 275 | unsigned int wakeup_prepared:1; |
| 274 | unsigned int d3_delay; /* D3->D0 transition time in ms */ | 276 | unsigned int d3_delay; /* D3->D0 transition time in ms */ |
| 275 | 277 | ||
| @@ -539,7 +541,7 @@ struct pci_error_handlers { | |||
| 539 | struct module; | 541 | struct module; |
| 540 | struct pci_driver { | 542 | struct pci_driver { |
| 541 | struct list_head node; | 543 | struct list_head node; |
| 542 | char *name; | 544 | const char *name; |
| 543 | const struct pci_device_id *id_table; /* must be non-NULL for probe to be called */ | 545 | const struct pci_device_id *id_table; /* must be non-NULL for probe to be called */ |
| 544 | int (*probe) (struct pci_dev *dev, const struct pci_device_id *id); /* New device inserted */ | 546 | int (*probe) (struct pci_dev *dev, const struct pci_device_id *id); /* New device inserted */ |
| 545 | void (*remove) (struct pci_dev *dev); /* Device removed (NULL if not a hot-plug capable driver) */ | 547 | void (*remove) (struct pci_dev *dev); /* Device removed (NULL if not a hot-plug capable driver) */ |
| @@ -817,6 +819,9 @@ pci_power_t pci_target_state(struct pci_dev *dev); | |||
| 817 | int pci_prepare_to_sleep(struct pci_dev *dev); | 819 | int pci_prepare_to_sleep(struct pci_dev *dev); |
| 818 | int pci_back_from_sleep(struct pci_dev *dev); | 820 | int pci_back_from_sleep(struct pci_dev *dev); |
| 819 | bool pci_dev_run_wake(struct pci_dev *dev); | 821 | bool pci_dev_run_wake(struct pci_dev *dev); |
| 822 | bool pci_check_pme_status(struct pci_dev *dev); | ||
| 823 | void pci_wakeup_event(struct pci_dev *dev); | ||
| 824 | void pci_pme_wakeup_bus(struct pci_bus *bus); | ||
| 820 | 825 | ||
| 821 | static inline int pci_enable_wake(struct pci_dev *dev, pci_power_t state, | 826 | static inline int pci_enable_wake(struct pci_dev *dev, pci_power_t state, |
| 822 | bool enable) | 827 | bool enable) |
| @@ -1212,6 +1217,9 @@ static inline struct pci_dev *pci_get_bus_and_slot(unsigned int bus, | |||
| 1212 | unsigned int devfn) | 1217 | unsigned int devfn) |
| 1213 | { return NULL; } | 1218 | { return NULL; } |
| 1214 | 1219 | ||
| 1220 | static inline int pci_domain_nr(struct pci_bus *bus) | ||
| 1221 | { return 0; } | ||
| 1222 | |||
| 1215 | #define dev_is_pci(d) (false) | 1223 | #define dev_is_pci(d) (false) |
| 1216 | #define dev_is_pf(d) (false) | 1224 | #define dev_is_pf(d) (false) |
| 1217 | #define dev_num_vf(d) (0) | 1225 | #define dev_num_vf(d) (0) |
diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h index 3bedcc149c84..87e2c2e7aed3 100644 --- a/include/linux/pci_ids.h +++ b/include/linux/pci_ids.h | |||
| @@ -393,6 +393,9 @@ | |||
| 393 | #define PCI_DEVICE_ID_VLSI_82C147 0x0105 | 393 | #define PCI_DEVICE_ID_VLSI_82C147 0x0105 |
| 394 | #define PCI_DEVICE_ID_VLSI_VAS96011 0x0702 | 394 | #define PCI_DEVICE_ID_VLSI_VAS96011 0x0702 |
| 395 | 395 | ||
| 396 | /* AMD RD890 Chipset */ | ||
| 397 | #define PCI_DEVICE_ID_RD890_IOMMU 0x5a23 | ||
| 398 | |||
| 396 | #define PCI_VENDOR_ID_ADL 0x1005 | 399 | #define PCI_VENDOR_ID_ADL 0x1005 |
| 397 | #define PCI_DEVICE_ID_ADL_2301 0x2301 | 400 | #define PCI_DEVICE_ID_ADL_2301 0x2301 |
| 398 | 401 | ||
| @@ -514,6 +517,7 @@ | |||
| 514 | #define PCI_DEVICE_ID_AMD_11H_NB_DRAM 0x1302 | 517 | #define PCI_DEVICE_ID_AMD_11H_NB_DRAM 0x1302 |
| 515 | #define PCI_DEVICE_ID_AMD_11H_NB_MISC 0x1303 | 518 | #define PCI_DEVICE_ID_AMD_11H_NB_MISC 0x1303 |
| 516 | #define PCI_DEVICE_ID_AMD_11H_NB_LINK 0x1304 | 519 | #define PCI_DEVICE_ID_AMD_11H_NB_LINK 0x1304 |
| 520 | #define PCI_DEVICE_ID_AMD_15H_NB_MISC 0x1603 | ||
| 517 | #define PCI_DEVICE_ID_AMD_LANCE 0x2000 | 521 | #define PCI_DEVICE_ID_AMD_LANCE 0x2000 |
| 518 | #define PCI_DEVICE_ID_AMD_LANCE_HOME 0x2001 | 522 | #define PCI_DEVICE_ID_AMD_LANCE_HOME 0x2001 |
| 519 | #define PCI_DEVICE_ID_AMD_SCSI 0x2020 | 523 | #define PCI_DEVICE_ID_AMD_SCSI 0x2020 |
| @@ -739,6 +743,7 @@ | |||
| 739 | #define PCI_DEVICE_ID_HP_CISSC 0x3230 | 743 | #define PCI_DEVICE_ID_HP_CISSC 0x3230 |
| 740 | #define PCI_DEVICE_ID_HP_CISSD 0x3238 | 744 | #define PCI_DEVICE_ID_HP_CISSD 0x3238 |
| 741 | #define PCI_DEVICE_ID_HP_CISSE 0x323a | 745 | #define PCI_DEVICE_ID_HP_CISSE 0x323a |
| 746 | #define PCI_DEVICE_ID_HP_CISSF 0x323b | ||
| 742 | #define PCI_DEVICE_ID_HP_ZX2_IOC 0x4031 | 747 | #define PCI_DEVICE_ID_HP_ZX2_IOC 0x4031 |
| 743 | 748 | ||
| 744 | #define PCI_VENDOR_ID_PCTECH 0x1042 | 749 | #define PCI_VENDOR_ID_PCTECH 0x1042 |
| @@ -762,6 +767,8 @@ | |||
| 762 | #define PCI_DEVICE_ID_ELSA_MICROLINK 0x1000 | 767 | #define PCI_DEVICE_ID_ELSA_MICROLINK 0x1000 |
| 763 | #define PCI_DEVICE_ID_ELSA_QS3000 0x3000 | 768 | #define PCI_DEVICE_ID_ELSA_QS3000 0x3000 |
| 764 | 769 | ||
| 770 | #define PCI_VENDOR_ID_STMICRO 0x104A | ||
| 771 | |||
| 765 | #define PCI_VENDOR_ID_BUSLOGIC 0x104B | 772 | #define PCI_VENDOR_ID_BUSLOGIC 0x104B |
| 766 | #define PCI_DEVICE_ID_BUSLOGIC_MULTIMASTER_NC 0x0140 | 773 | #define PCI_DEVICE_ID_BUSLOGIC_MULTIMASTER_NC 0x0140 |
| 767 | #define PCI_DEVICE_ID_BUSLOGIC_MULTIMASTER 0x1040 | 774 | #define PCI_DEVICE_ID_BUSLOGIC_MULTIMASTER 0x1040 |
| @@ -815,7 +822,7 @@ | |||
| 815 | 822 | ||
| 816 | #define PCI_VENDOR_ID_ANIGMA 0x1051 | 823 | #define PCI_VENDOR_ID_ANIGMA 0x1051 |
| 817 | #define PCI_DEVICE_ID_ANIGMA_MC145575 0x0100 | 824 | #define PCI_DEVICE_ID_ANIGMA_MC145575 0x0100 |
| 818 | 825 | ||
| 819 | #define PCI_VENDOR_ID_EFAR 0x1055 | 826 | #define PCI_VENDOR_ID_EFAR 0x1055 |
| 820 | #define PCI_DEVICE_ID_EFAR_SLC90E66_1 0x9130 | 827 | #define PCI_DEVICE_ID_EFAR_SLC90E66_1 0x9130 |
| 821 | #define PCI_DEVICE_ID_EFAR_SLC90E66_3 0x9463 | 828 | #define PCI_DEVICE_ID_EFAR_SLC90E66_3 0x9463 |
| @@ -1246,6 +1253,8 @@ | |||
| 1246 | #define PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_GO5700_2 0x0348 | 1253 | #define PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_GO5700_2 0x0348 |
| 1247 | #define PCI_DEVICE_ID_NVIDIA_QUADRO_FX_GO1000 0x034C | 1254 | #define PCI_DEVICE_ID_NVIDIA_QUADRO_FX_GO1000 0x034C |
| 1248 | #define PCI_DEVICE_ID_NVIDIA_QUADRO_FX_1100 0x034E | 1255 | #define PCI_DEVICE_ID_NVIDIA_QUADRO_FX_1100 0x034E |
| 1256 | #define PCI_DEVICE_ID_NVIDIA_MCP55_BRIDGE_V0 0x0360 | ||
| 1257 | #define PCI_DEVICE_ID_NVIDIA_MCP55_BRIDGE_V4 0x0364 | ||
| 1249 | #define PCI_DEVICE_ID_NVIDIA_NVENET_15 0x0373 | 1258 | #define PCI_DEVICE_ID_NVIDIA_NVENET_15 0x0373 |
| 1250 | #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_SATA 0x03E7 | 1259 | #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_SATA 0x03E7 |
| 1251 | #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_SMBUS 0x03EB | 1260 | #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_SMBUS 0x03EB |
| @@ -1446,7 +1455,7 @@ | |||
| 1446 | 1455 | ||
| 1447 | #define PCI_VENDOR_ID_ZIATECH 0x1138 | 1456 | #define PCI_VENDOR_ID_ZIATECH 0x1138 |
| 1448 | #define PCI_DEVICE_ID_ZIATECH_5550_HC 0x5550 | 1457 | #define PCI_DEVICE_ID_ZIATECH_5550_HC 0x5550 |
| 1449 | 1458 | ||
| 1450 | 1459 | ||
| 1451 | #define PCI_VENDOR_ID_SYSKONNECT 0x1148 | 1460 | #define PCI_VENDOR_ID_SYSKONNECT 0x1148 |
| 1452 | #define PCI_DEVICE_ID_SYSKONNECT_TR 0x4200 | 1461 | #define PCI_DEVICE_ID_SYSKONNECT_TR 0x4200 |
| @@ -1494,6 +1503,9 @@ | |||
| 1494 | #define PCI_DEVICE_ID_SBE_WANXL100 0x0301 | 1503 | #define PCI_DEVICE_ID_SBE_WANXL100 0x0301 |
| 1495 | #define PCI_DEVICE_ID_SBE_WANXL200 0x0302 | 1504 | #define PCI_DEVICE_ID_SBE_WANXL200 0x0302 |
| 1496 | #define PCI_DEVICE_ID_SBE_WANXL400 0x0104 | 1505 | #define PCI_DEVICE_ID_SBE_WANXL400 0x0104 |
| 1506 | #define PCI_SUBDEVICE_ID_SBE_T3E3 0x0009 | ||
| 1507 | #define PCI_SUBDEVICE_ID_SBE_2T3E3_P0 0x0901 | ||
| 1508 | #define PCI_SUBDEVICE_ID_SBE_2T3E3_P1 0x0902 | ||
| 1497 | 1509 | ||
| 1498 | #define PCI_VENDOR_ID_TOSHIBA 0x1179 | 1510 | #define PCI_VENDOR_ID_TOSHIBA 0x1179 |
| 1499 | #define PCI_DEVICE_ID_TOSHIBA_PICCOLO_1 0x0101 | 1511 | #define PCI_DEVICE_ID_TOSHIBA_PICCOLO_1 0x0101 |
| @@ -1597,8 +1609,8 @@ | |||
| 1597 | #define PCI_DEVICE_ID_RP8OCTA 0x0005 | 1609 | #define PCI_DEVICE_ID_RP8OCTA 0x0005 |
| 1598 | #define PCI_DEVICE_ID_RP8J 0x0006 | 1610 | #define PCI_DEVICE_ID_RP8J 0x0006 |
| 1599 | #define PCI_DEVICE_ID_RP4J 0x0007 | 1611 | #define PCI_DEVICE_ID_RP4J 0x0007 |
| 1600 | #define PCI_DEVICE_ID_RP8SNI 0x0008 | 1612 | #define PCI_DEVICE_ID_RP8SNI 0x0008 |
| 1601 | #define PCI_DEVICE_ID_RP16SNI 0x0009 | 1613 | #define PCI_DEVICE_ID_RP16SNI 0x0009 |
| 1602 | #define PCI_DEVICE_ID_RPP4 0x000A | 1614 | #define PCI_DEVICE_ID_RPP4 0x000A |
| 1603 | #define PCI_DEVICE_ID_RPP8 0x000B | 1615 | #define PCI_DEVICE_ID_RPP8 0x000B |
| 1604 | #define PCI_DEVICE_ID_RP4M 0x000D | 1616 | #define PCI_DEVICE_ID_RP4M 0x000D |
| @@ -1608,9 +1620,9 @@ | |||
| 1608 | #define PCI_DEVICE_ID_URP8INTF 0x0802 | 1620 | #define PCI_DEVICE_ID_URP8INTF 0x0802 |
| 1609 | #define PCI_DEVICE_ID_URP16INTF 0x0803 | 1621 | #define PCI_DEVICE_ID_URP16INTF 0x0803 |
| 1610 | #define PCI_DEVICE_ID_URP8OCTA 0x0805 | 1622 | #define PCI_DEVICE_ID_URP8OCTA 0x0805 |
| 1611 | #define PCI_DEVICE_ID_UPCI_RM3_8PORT 0x080C | 1623 | #define PCI_DEVICE_ID_UPCI_RM3_8PORT 0x080C |
| 1612 | #define PCI_DEVICE_ID_UPCI_RM3_4PORT 0x080D | 1624 | #define PCI_DEVICE_ID_UPCI_RM3_4PORT 0x080D |
| 1613 | #define PCI_DEVICE_ID_CRP16INTF 0x0903 | 1625 | #define PCI_DEVICE_ID_CRP16INTF 0x0903 |
| 1614 | 1626 | ||
| 1615 | #define PCI_VENDOR_ID_CYCLADES 0x120e | 1627 | #define PCI_VENDOR_ID_CYCLADES 0x120e |
| 1616 | #define PCI_DEVICE_ID_CYCLOM_Y_Lo 0x0100 | 1628 | #define PCI_DEVICE_ID_CYCLOM_Y_Lo 0x0100 |
| @@ -2054,7 +2066,6 @@ | |||
| 2054 | #define PCI_DEVICE_ID_NX2_57711E 0x1650 | 2066 | #define PCI_DEVICE_ID_NX2_57711E 0x1650 |
| 2055 | #define PCI_DEVICE_ID_TIGON3_5705 0x1653 | 2067 | #define PCI_DEVICE_ID_TIGON3_5705 0x1653 |
| 2056 | #define PCI_DEVICE_ID_TIGON3_5705_2 0x1654 | 2068 | #define PCI_DEVICE_ID_TIGON3_5705_2 0x1654 |
| 2057 | #define PCI_DEVICE_ID_TIGON3_5720 0x1658 | ||
| 2058 | #define PCI_DEVICE_ID_TIGON3_5721 0x1659 | 2069 | #define PCI_DEVICE_ID_TIGON3_5721 0x1659 |
| 2059 | #define PCI_DEVICE_ID_TIGON3_5722 0x165a | 2070 | #define PCI_DEVICE_ID_TIGON3_5722 0x165a |
| 2060 | #define PCI_DEVICE_ID_TIGON3_5723 0x165b | 2071 | #define PCI_DEVICE_ID_TIGON3_5723 0x165b |
| @@ -2068,13 +2079,11 @@ | |||
| 2068 | #define PCI_DEVICE_ID_TIGON3_5754M 0x1672 | 2079 | #define PCI_DEVICE_ID_TIGON3_5754M 0x1672 |
| 2069 | #define PCI_DEVICE_ID_TIGON3_5755M 0x1673 | 2080 | #define PCI_DEVICE_ID_TIGON3_5755M 0x1673 |
| 2070 | #define PCI_DEVICE_ID_TIGON3_5756 0x1674 | 2081 | #define PCI_DEVICE_ID_TIGON3_5756 0x1674 |
| 2071 | #define PCI_DEVICE_ID_TIGON3_5750 0x1676 | ||
| 2072 | #define PCI_DEVICE_ID_TIGON3_5751 0x1677 | 2082 | #define PCI_DEVICE_ID_TIGON3_5751 0x1677 |
| 2073 | #define PCI_DEVICE_ID_TIGON3_5715 0x1678 | 2083 | #define PCI_DEVICE_ID_TIGON3_5715 0x1678 |
| 2074 | #define PCI_DEVICE_ID_TIGON3_5715S 0x1679 | 2084 | #define PCI_DEVICE_ID_TIGON3_5715S 0x1679 |
| 2075 | #define PCI_DEVICE_ID_TIGON3_5754 0x167a | 2085 | #define PCI_DEVICE_ID_TIGON3_5754 0x167a |
| 2076 | #define PCI_DEVICE_ID_TIGON3_5755 0x167b | 2086 | #define PCI_DEVICE_ID_TIGON3_5755 0x167b |
| 2077 | #define PCI_DEVICE_ID_TIGON3_5750M 0x167c | ||
| 2078 | #define PCI_DEVICE_ID_TIGON3_5751M 0x167d | 2087 | #define PCI_DEVICE_ID_TIGON3_5751M 0x167d |
| 2079 | #define PCI_DEVICE_ID_TIGON3_5751F 0x167e | 2088 | #define PCI_DEVICE_ID_TIGON3_5751F 0x167e |
| 2080 | #define PCI_DEVICE_ID_TIGON3_5787F 0x167f | 2089 | #define PCI_DEVICE_ID_TIGON3_5787F 0x167f |
| @@ -2139,7 +2148,7 @@ | |||
| 2139 | #define PCI_DEVICE_ID_RASTEL_2PORT 0x2000 | 2148 | #define PCI_DEVICE_ID_RASTEL_2PORT 0x2000 |
| 2140 | 2149 | ||
| 2141 | #define PCI_VENDOR_ID_ZOLTRIX 0x15b0 | 2150 | #define PCI_VENDOR_ID_ZOLTRIX 0x15b0 |
| 2142 | #define PCI_DEVICE_ID_ZOLTRIX_2BD0 0x2bd0 | 2151 | #define PCI_DEVICE_ID_ZOLTRIX_2BD0 0x2bd0 |
| 2143 | 2152 | ||
| 2144 | #define PCI_VENDOR_ID_MELLANOX 0x15b3 | 2153 | #define PCI_VENDOR_ID_MELLANOX 0x15b3 |
| 2145 | #define PCI_DEVICE_ID_MELLANOX_TAVOR 0x5a44 | 2154 | #define PCI_DEVICE_ID_MELLANOX_TAVOR 0x5a44 |
| @@ -2189,6 +2198,9 @@ | |||
| 2189 | #define PCI_VENDOR_ID_ARIMA 0x161f | 2198 | #define PCI_VENDOR_ID_ARIMA 0x161f |
| 2190 | 2199 | ||
| 2191 | #define PCI_VENDOR_ID_BROCADE 0x1657 | 2200 | #define PCI_VENDOR_ID_BROCADE 0x1657 |
| 2201 | #define PCI_DEVICE_ID_BROCADE_CT 0x0014 | ||
| 2202 | #define PCI_DEVICE_ID_BROCADE_FC_8G1P 0x0017 | ||
| 2203 | #define PCI_DEVICE_ID_BROCADE_CT_FC 0x0021 | ||
| 2192 | 2204 | ||
| 2193 | #define PCI_VENDOR_ID_SIBYTE 0x166d | 2205 | #define PCI_VENDOR_ID_SIBYTE 0x166d |
| 2194 | #define PCI_DEVICE_ID_BCM1250_PCI 0x0001 | 2206 | #define PCI_DEVICE_ID_BCM1250_PCI 0x0001 |
| @@ -2260,10 +2272,18 @@ | |||
| 2260 | 2272 | ||
| 2261 | #define PCI_VENDOR_ID_SILAN 0x1904 | 2273 | #define PCI_VENDOR_ID_SILAN 0x1904 |
| 2262 | 2274 | ||
| 2275 | #define PCI_VENDOR_ID_RENESAS 0x1912 | ||
| 2276 | #define PCI_DEVICE_ID_RENESAS_SH7781 0x0001 | ||
| 2277 | #define PCI_DEVICE_ID_RENESAS_SH7780 0x0002 | ||
| 2278 | #define PCI_DEVICE_ID_RENESAS_SH7763 0x0004 | ||
| 2279 | #define PCI_DEVICE_ID_RENESAS_SH7785 0x0007 | ||
| 2280 | #define PCI_DEVICE_ID_RENESAS_SH7786 0x0010 | ||
| 2281 | |||
| 2263 | #define PCI_VENDOR_ID_TDI 0x192E | 2282 | #define PCI_VENDOR_ID_TDI 0x192E |
| 2264 | #define PCI_DEVICE_ID_TDI_EHCI 0x0101 | 2283 | #define PCI_DEVICE_ID_TDI_EHCI 0x0101 |
| 2265 | 2284 | ||
| 2266 | #define PCI_VENDOR_ID_FREESCALE 0x1957 | 2285 | #define PCI_VENDOR_ID_FREESCALE 0x1957 |
| 2286 | #define PCI_DEVICE_ID_MPC8308 0xc006 | ||
| 2267 | #define PCI_DEVICE_ID_MPC8315E 0x00b4 | 2287 | #define PCI_DEVICE_ID_MPC8315E 0x00b4 |
| 2268 | #define PCI_DEVICE_ID_MPC8315 0x00b5 | 2288 | #define PCI_DEVICE_ID_MPC8315 0x00b5 |
| 2269 | #define PCI_DEVICE_ID_MPC8314E 0x00b6 | 2289 | #define PCI_DEVICE_ID_MPC8314E 0x00b6 |
| @@ -2299,6 +2319,8 @@ | |||
| 2299 | #define PCI_DEVICE_ID_P2010 0x0079 | 2319 | #define PCI_DEVICE_ID_P2010 0x0079 |
| 2300 | #define PCI_DEVICE_ID_P1020E 0x0100 | 2320 | #define PCI_DEVICE_ID_P1020E 0x0100 |
| 2301 | #define PCI_DEVICE_ID_P1020 0x0101 | 2321 | #define PCI_DEVICE_ID_P1020 0x0101 |
| 2322 | #define PCI_DEVICE_ID_P1021E 0x0102 | ||
| 2323 | #define PCI_DEVICE_ID_P1021 0x0103 | ||
| 2302 | #define PCI_DEVICE_ID_P1011E 0x0108 | 2324 | #define PCI_DEVICE_ID_P1011E 0x0108 |
| 2303 | #define PCI_DEVICE_ID_P1011 0x0109 | 2325 | #define PCI_DEVICE_ID_P1011 0x0109 |
| 2304 | #define PCI_DEVICE_ID_P1022E 0x0110 | 2326 | #define PCI_DEVICE_ID_P1022E 0x0110 |
| @@ -2309,6 +2331,14 @@ | |||
| 2309 | #define PCI_DEVICE_ID_P4080 0x0401 | 2331 | #define PCI_DEVICE_ID_P4080 0x0401 |
| 2310 | #define PCI_DEVICE_ID_P4040E 0x0408 | 2332 | #define PCI_DEVICE_ID_P4040E 0x0408 |
| 2311 | #define PCI_DEVICE_ID_P4040 0x0409 | 2333 | #define PCI_DEVICE_ID_P4040 0x0409 |
| 2334 | #define PCI_DEVICE_ID_P2040E 0x0410 | ||
| 2335 | #define PCI_DEVICE_ID_P2040 0x0411 | ||
| 2336 | #define PCI_DEVICE_ID_P3041E 0x041E | ||
| 2337 | #define PCI_DEVICE_ID_P3041 0x041F | ||
| 2338 | #define PCI_DEVICE_ID_P5020E 0x0420 | ||
| 2339 | #define PCI_DEVICE_ID_P5020 0x0421 | ||
| 2340 | #define PCI_DEVICE_ID_P5010E 0x0428 | ||
| 2341 | #define PCI_DEVICE_ID_P5010 0x0429 | ||
| 2312 | #define PCI_DEVICE_ID_MPC8641 0x7010 | 2342 | #define PCI_DEVICE_ID_MPC8641 0x7010 |
| 2313 | #define PCI_DEVICE_ID_MPC8641D 0x7011 | 2343 | #define PCI_DEVICE_ID_MPC8641D 0x7011 |
| 2314 | #define PCI_DEVICE_ID_MPC8610 0x7018 | 2344 | #define PCI_DEVICE_ID_MPC8610 0x7018 |
| @@ -2324,9 +2354,11 @@ | |||
| 2324 | #define PCI_DEVICE_ID_JMICRON_JMB361 0x2361 | 2354 | #define PCI_DEVICE_ID_JMICRON_JMB361 0x2361 |
| 2325 | #define PCI_DEVICE_ID_JMICRON_JMB362 0x2362 | 2355 | #define PCI_DEVICE_ID_JMICRON_JMB362 0x2362 |
| 2326 | #define PCI_DEVICE_ID_JMICRON_JMB363 0x2363 | 2356 | #define PCI_DEVICE_ID_JMICRON_JMB363 0x2363 |
| 2357 | #define PCI_DEVICE_ID_JMICRON_JMB364 0x2364 | ||
| 2327 | #define PCI_DEVICE_ID_JMICRON_JMB365 0x2365 | 2358 | #define PCI_DEVICE_ID_JMICRON_JMB365 0x2365 |
| 2328 | #define PCI_DEVICE_ID_JMICRON_JMB366 0x2366 | 2359 | #define PCI_DEVICE_ID_JMICRON_JMB366 0x2366 |
| 2329 | #define PCI_DEVICE_ID_JMICRON_JMB368 0x2368 | 2360 | #define PCI_DEVICE_ID_JMICRON_JMB368 0x2368 |
| 2361 | #define PCI_DEVICE_ID_JMICRON_JMB369 0x2369 | ||
| 2330 | #define PCI_DEVICE_ID_JMICRON_JMB38X_SD 0x2381 | 2362 | #define PCI_DEVICE_ID_JMICRON_JMB38X_SD 0x2381 |
| 2331 | #define PCI_DEVICE_ID_JMICRON_JMB38X_MMC 0x2382 | 2363 | #define PCI_DEVICE_ID_JMICRON_JMB38X_MMC 0x2382 |
| 2332 | #define PCI_DEVICE_ID_JMICRON_JMB38X_MS 0x2383 | 2364 | #define PCI_DEVICE_ID_JMICRON_JMB38X_MS 0x2383 |
| @@ -2369,6 +2401,9 @@ | |||
| 2369 | #define PCI_VENDOR_ID_AKS 0x416c | 2401 | #define PCI_VENDOR_ID_AKS 0x416c |
| 2370 | #define PCI_DEVICE_ID_AKS_ALADDINCARD 0x0100 | 2402 | #define PCI_DEVICE_ID_AKS_ALADDINCARD 0x0100 |
| 2371 | 2403 | ||
| 2404 | #define PCI_VENDOR_ID_ACCESSIO 0x494f | ||
| 2405 | #define PCI_DEVICE_ID_ACCESSIO_WDG_CSM 0x22c0 | ||
| 2406 | |||
| 2372 | #define PCI_VENDOR_ID_S3 0x5333 | 2407 | #define PCI_VENDOR_ID_S3 0x5333 |
| 2373 | #define PCI_DEVICE_ID_S3_TRIO 0x8811 | 2408 | #define PCI_DEVICE_ID_S3_TRIO 0x8811 |
| 2374 | #define PCI_DEVICE_ID_S3_868 0x8880 | 2409 | #define PCI_DEVICE_ID_S3_868 0x8880 |
| @@ -2399,6 +2434,13 @@ | |||
| 2399 | #define PCI_DEVICE_ID_INTEL_82375 0x0482 | 2434 | #define PCI_DEVICE_ID_INTEL_82375 0x0482 |
| 2400 | #define PCI_DEVICE_ID_INTEL_82424 0x0483 | 2435 | #define PCI_DEVICE_ID_INTEL_82424 0x0483 |
| 2401 | #define PCI_DEVICE_ID_INTEL_82378 0x0484 | 2436 | #define PCI_DEVICE_ID_INTEL_82378 0x0484 |
| 2437 | #define PCI_DEVICE_ID_INTEL_MRST_SD0 0x0807 | ||
| 2438 | #define PCI_DEVICE_ID_INTEL_MRST_SD1 0x0808 | ||
| 2439 | #define PCI_DEVICE_ID_INTEL_MFD_SD 0x0820 | ||
| 2440 | #define PCI_DEVICE_ID_INTEL_MFD_SDIO1 0x0821 | ||
| 2441 | #define PCI_DEVICE_ID_INTEL_MFD_SDIO2 0x0822 | ||
| 2442 | #define PCI_DEVICE_ID_INTEL_MFD_EMMC0 0x0823 | ||
| 2443 | #define PCI_DEVICE_ID_INTEL_MFD_EMMC1 0x0824 | ||
| 2402 | #define PCI_DEVICE_ID_INTEL_I960 0x0960 | 2444 | #define PCI_DEVICE_ID_INTEL_I960 0x0960 |
| 2403 | #define PCI_DEVICE_ID_INTEL_I960RM 0x0962 | 2445 | #define PCI_DEVICE_ID_INTEL_I960RM 0x0962 |
| 2404 | #define PCI_DEVICE_ID_INTEL_8257X_SOL 0x1062 | 2446 | #define PCI_DEVICE_ID_INTEL_8257X_SOL 0x1062 |
| @@ -2407,7 +2449,7 @@ | |||
| 2407 | #define PCI_DEVICE_ID_INTEL_82815_MC 0x1130 | 2449 | #define PCI_DEVICE_ID_INTEL_82815_MC 0x1130 |
| 2408 | #define PCI_DEVICE_ID_INTEL_82815_CGC 0x1132 | 2450 | #define PCI_DEVICE_ID_INTEL_82815_CGC 0x1132 |
| 2409 | #define PCI_DEVICE_ID_INTEL_82092AA_0 0x1221 | 2451 | #define PCI_DEVICE_ID_INTEL_82092AA_0 0x1221 |
| 2410 | #define PCI_DEVICE_ID_INTEL_7505_0 0x2550 | 2452 | #define PCI_DEVICE_ID_INTEL_7505_0 0x2550 |
| 2411 | #define PCI_DEVICE_ID_INTEL_7205_0 0x255d | 2453 | #define PCI_DEVICE_ID_INTEL_7205_0 0x255d |
| 2412 | #define PCI_DEVICE_ID_INTEL_82437 0x122d | 2454 | #define PCI_DEVICE_ID_INTEL_82437 0x122d |
| 2413 | #define PCI_DEVICE_ID_INTEL_82371FB_0 0x122e | 2455 | #define PCI_DEVICE_ID_INTEL_82371FB_0 0x122e |
| @@ -2420,9 +2462,10 @@ | |||
| 2420 | #define PCI_DEVICE_ID_INTEL_82840_HB 0x1a21 | 2462 | #define PCI_DEVICE_ID_INTEL_82840_HB 0x1a21 |
| 2421 | #define PCI_DEVICE_ID_INTEL_82845_HB 0x1a30 | 2463 | #define PCI_DEVICE_ID_INTEL_82845_HB 0x1a30 |
| 2422 | #define PCI_DEVICE_ID_INTEL_IOAT 0x1a38 | 2464 | #define PCI_DEVICE_ID_INTEL_IOAT 0x1a38 |
| 2423 | #define PCI_DEVICE_ID_INTEL_CPT_SMBUS 0x1c22 | 2465 | #define PCI_DEVICE_ID_INTEL_COUGARPOINT_SMBUS 0x1c22 |
| 2424 | #define PCI_DEVICE_ID_INTEL_CPT_LPC_MIN 0x1c41 | 2466 | #define PCI_DEVICE_ID_INTEL_COUGARPOINT_LPC_MIN 0x1c41 |
| 2425 | #define PCI_DEVICE_ID_INTEL_CPT_LPC_MAX 0x1c5f | 2467 | #define PCI_DEVICE_ID_INTEL_COUGARPOINT_LPC_MAX 0x1c5f |
| 2468 | #define PCI_DEVICE_ID_INTEL_PATSBURG_LPC 0x1d40 | ||
| 2426 | #define PCI_DEVICE_ID_INTEL_82801AA_0 0x2410 | 2469 | #define PCI_DEVICE_ID_INTEL_82801AA_0 0x2410 |
| 2427 | #define PCI_DEVICE_ID_INTEL_82801AA_1 0x2411 | 2470 | #define PCI_DEVICE_ID_INTEL_82801AA_1 0x2411 |
| 2428 | #define PCI_DEVICE_ID_INTEL_82801AA_3 0x2413 | 2471 | #define PCI_DEVICE_ID_INTEL_82801AA_3 0x2413 |
| @@ -2610,6 +2653,9 @@ | |||
| 2610 | #define PCI_DEVICE_ID_INTEL_MCH_PC 0x3599 | 2653 | #define PCI_DEVICE_ID_INTEL_MCH_PC 0x3599 |
| 2611 | #define PCI_DEVICE_ID_INTEL_MCH_PC1 0x359a | 2654 | #define PCI_DEVICE_ID_INTEL_MCH_PC1 0x359a |
| 2612 | #define PCI_DEVICE_ID_INTEL_E7525_MCH 0x359e | 2655 | #define PCI_DEVICE_ID_INTEL_E7525_MCH 0x359e |
| 2656 | #define PCI_DEVICE_ID_INTEL_I7300_MCH_ERR 0x360c | ||
| 2657 | #define PCI_DEVICE_ID_INTEL_I7300_MCH_FB0 0x360f | ||
| 2658 | #define PCI_DEVICE_ID_INTEL_I7300_MCH_FB1 0x3610 | ||
| 2613 | #define PCI_DEVICE_ID_INTEL_IOAT_CNB 0x360b | 2659 | #define PCI_DEVICE_ID_INTEL_IOAT_CNB 0x360b |
| 2614 | #define PCI_DEVICE_ID_INTEL_FBD_CNB 0x360c | 2660 | #define PCI_DEVICE_ID_INTEL_FBD_CNB 0x360c |
| 2615 | #define PCI_DEVICE_ID_INTEL_IOAT_JSF0 0x3710 | 2661 | #define PCI_DEVICE_ID_INTEL_IOAT_JSF0 0x3710 |
| @@ -2628,9 +2674,9 @@ | |||
| 2628 | #define PCI_DEVICE_ID_INTEL_ICH10_3 0x3a1a | 2674 | #define PCI_DEVICE_ID_INTEL_ICH10_3 0x3a1a |
| 2629 | #define PCI_DEVICE_ID_INTEL_ICH10_4 0x3a30 | 2675 | #define PCI_DEVICE_ID_INTEL_ICH10_4 0x3a30 |
| 2630 | #define PCI_DEVICE_ID_INTEL_ICH10_5 0x3a60 | 2676 | #define PCI_DEVICE_ID_INTEL_ICH10_5 0x3a60 |
| 2631 | #define PCI_DEVICE_ID_INTEL_PCH_LPC_MIN 0x3b00 | 2677 | #define PCI_DEVICE_ID_INTEL_5_3400_SERIES_LPC_MIN 0x3b00 |
| 2632 | #define PCI_DEVICE_ID_INTEL_PCH_LPC_MAX 0x3b1f | 2678 | #define PCI_DEVICE_ID_INTEL_5_3400_SERIES_LPC_MAX 0x3b1f |
| 2633 | #define PCI_DEVICE_ID_INTEL_PCH_SMBUS 0x3b30 | 2679 | #define PCI_DEVICE_ID_INTEL_5_3400_SERIES_SMBUS 0x3b30 |
| 2634 | #define PCI_DEVICE_ID_INTEL_IOAT_SNB 0x402f | 2680 | #define PCI_DEVICE_ID_INTEL_IOAT_SNB 0x402f |
| 2635 | #define PCI_DEVICE_ID_INTEL_5100_16 0x65f0 | 2681 | #define PCI_DEVICE_ID_INTEL_5100_16 0x65f0 |
| 2636 | #define PCI_DEVICE_ID_INTEL_5100_21 0x65f5 | 2682 | #define PCI_DEVICE_ID_INTEL_5100_21 0x65f5 |
| @@ -2639,8 +2685,8 @@ | |||
| 2639 | #define PCI_DEVICE_ID_INTEL_5400_FBD0 0x4035 | 2685 | #define PCI_DEVICE_ID_INTEL_5400_FBD0 0x4035 |
| 2640 | #define PCI_DEVICE_ID_INTEL_5400_FBD1 0x4036 | 2686 | #define PCI_DEVICE_ID_INTEL_5400_FBD1 0x4036 |
| 2641 | #define PCI_DEVICE_ID_INTEL_IOAT_SCNB 0x65ff | 2687 | #define PCI_DEVICE_ID_INTEL_IOAT_SCNB 0x65ff |
| 2642 | #define PCI_DEVICE_ID_INTEL_TOLAPAI_0 0x5031 | 2688 | #define PCI_DEVICE_ID_INTEL_EP80579_0 0x5031 |
| 2643 | #define PCI_DEVICE_ID_INTEL_TOLAPAI_1 0x5032 | 2689 | #define PCI_DEVICE_ID_INTEL_EP80579_1 0x5032 |
| 2644 | #define PCI_DEVICE_ID_INTEL_82371SB_0 0x7000 | 2690 | #define PCI_DEVICE_ID_INTEL_82371SB_0 0x7000 |
| 2645 | #define PCI_DEVICE_ID_INTEL_82371SB_1 0x7010 | 2691 | #define PCI_DEVICE_ID_INTEL_82371SB_1 0x7010 |
| 2646 | #define PCI_DEVICE_ID_INTEL_82371SB_2 0x7020 | 2692 | #define PCI_DEVICE_ID_INTEL_82371SB_2 0x7020 |
| @@ -2772,3 +2818,6 @@ | |||
| 2772 | #define PCI_DEVICE_ID_RME_DIGI32 0x9896 | 2818 | #define PCI_DEVICE_ID_RME_DIGI32 0x9896 |
| 2773 | #define PCI_DEVICE_ID_RME_DIGI32_PRO 0x9897 | 2819 | #define PCI_DEVICE_ID_RME_DIGI32_PRO 0x9897 |
| 2774 | #define PCI_DEVICE_ID_RME_DIGI32_8 0x9898 | 2820 | #define PCI_DEVICE_ID_RME_DIGI32_8 0x9898 |
| 2821 | |||
| 2822 | #define PCI_VENDOR_ID_XEN 0x5853 | ||
| 2823 | #define PCI_DEVICE_ID_XEN_PLATFORM 0x0001 | ||
diff --git a/include/linux/pci_regs.h b/include/linux/pci_regs.h index 455b9ccdfca7..af83076c31a6 100644 --- a/include/linux/pci_regs.h +++ b/include/linux/pci_regs.h | |||
| @@ -300,12 +300,14 @@ | |||
| 300 | #define PCI_MSI_DATA_64 12 /* 16 bits of data for 64-bit devices */ | 300 | #define PCI_MSI_DATA_64 12 /* 16 bits of data for 64-bit devices */ |
| 301 | #define PCI_MSI_MASK_64 16 /* Mask bits register for 64-bit devices */ | 301 | #define PCI_MSI_MASK_64 16 /* Mask bits register for 64-bit devices */ |
| 302 | 302 | ||
| 303 | /* MSI-X registers (these are at offset PCI_MSIX_FLAGS) */ | 303 | /* MSI-X registers */ |
| 304 | #define PCI_MSIX_FLAGS 2 | 304 | #define PCI_MSIX_FLAGS 2 |
| 305 | #define PCI_MSIX_FLAGS_QSIZE 0x7FF | 305 | #define PCI_MSIX_FLAGS_QSIZE 0x7FF |
| 306 | #define PCI_MSIX_FLAGS_ENABLE (1 << 15) | 306 | #define PCI_MSIX_FLAGS_ENABLE (1 << 15) |
| 307 | #define PCI_MSIX_FLAGS_MASKALL (1 << 14) | 307 | #define PCI_MSIX_FLAGS_MASKALL (1 << 14) |
| 308 | #define PCI_MSIX_FLAGS_BIRMASK (7 << 0) | 308 | #define PCI_MSIX_TABLE 4 |
| 309 | #define PCI_MSIX_PBA 8 | ||
| 310 | #define PCI_MSIX_FLAGS_BIRMASK (7 << 0) | ||
| 309 | 311 | ||
| 310 | /* CompactPCI Hotswap Register */ | 312 | /* CompactPCI Hotswap Register */ |
| 311 | 313 | ||
diff --git a/include/linux/percpu-defs.h b/include/linux/percpu-defs.h index ce2dc655cd1d..27ef6b190ea6 100644 --- a/include/linux/percpu-defs.h +++ b/include/linux/percpu-defs.h | |||
| @@ -139,6 +139,15 @@ | |||
| 139 | __aligned(PAGE_SIZE) | 139 | __aligned(PAGE_SIZE) |
| 140 | 140 | ||
| 141 | /* | 141 | /* |
| 142 | * Declaration/definition used for per-CPU variables that must be read mostly. | ||
| 143 | */ | ||
| 144 | #define DECLARE_PER_CPU_READ_MOSTLY(type, name) \ | ||
| 145 | DECLARE_PER_CPU_SECTION(type, name, "..readmostly") | ||
| 146 | |||
| 147 | #define DEFINE_PER_CPU_READ_MOSTLY(type, name) \ | ||
| 148 | DEFINE_PER_CPU_SECTION(type, name, "..readmostly") | ||
| 149 | |||
| 150 | /* | ||
| 142 | * Intermodule exports for per-CPU variables. sparse forgets about | 151 | * Intermodule exports for per-CPU variables. sparse forgets about |
| 143 | * address space across EXPORT_SYMBOL(), change EXPORT_SYMBOL() to | 152 | * address space across EXPORT_SYMBOL(), change EXPORT_SYMBOL() to |
| 144 | * noop if __CHECKER__. | 153 | * noop if __CHECKER__. |
diff --git a/include/linux/percpu.h b/include/linux/percpu.h index d3a38d687104..5095b834a6fb 100644 --- a/include/linux/percpu.h +++ b/include/linux/percpu.h | |||
| @@ -39,10 +39,27 @@ | |||
| 39 | preempt_enable(); \ | 39 | preempt_enable(); \ |
| 40 | } while (0) | 40 | } while (0) |
| 41 | 41 | ||
| 42 | #ifdef CONFIG_SMP | 42 | #define get_cpu_ptr(var) ({ \ |
| 43 | preempt_disable(); \ | ||
| 44 | this_cpu_ptr(var); }) | ||
| 45 | |||
| 46 | #define put_cpu_ptr(var) do { \ | ||
| 47 | (void)(var); \ | ||
| 48 | preempt_enable(); \ | ||
| 49 | } while (0) | ||
| 43 | 50 | ||
| 44 | /* minimum unit size, also is the maximum supported allocation size */ | 51 | /* minimum unit size, also is the maximum supported allocation size */ |
| 45 | #define PCPU_MIN_UNIT_SIZE PFN_ALIGN(64 << 10) | 52 | #define PCPU_MIN_UNIT_SIZE PFN_ALIGN(32 << 10) |
| 53 | |||
| 54 | /* | ||
| 55 | * Percpu allocator can serve percpu allocations before slab is | ||
| 56 | * initialized which allows slab to depend on the percpu allocator. | ||
| 57 | * The following two parameters decide how much resource to | ||
| 58 | * preallocate for this. Keep PERCPU_DYNAMIC_RESERVE equal to or | ||
| 59 | * larger than PERCPU_DYNAMIC_EARLY_SIZE. | ||
| 60 | */ | ||
| 61 | #define PERCPU_DYNAMIC_EARLY_SLOTS 128 | ||
| 62 | #define PERCPU_DYNAMIC_EARLY_SIZE (12 << 10) | ||
| 46 | 63 | ||
| 47 | /* | 64 | /* |
| 48 | * PERCPU_DYNAMIC_RESERVE indicates the amount of free area to piggy | 65 | * PERCPU_DYNAMIC_RESERVE indicates the amount of free area to piggy |
| @@ -104,16 +121,11 @@ extern struct pcpu_alloc_info * __init pcpu_alloc_alloc_info(int nr_groups, | |||
| 104 | int nr_units); | 121 | int nr_units); |
| 105 | extern void __init pcpu_free_alloc_info(struct pcpu_alloc_info *ai); | 122 | extern void __init pcpu_free_alloc_info(struct pcpu_alloc_info *ai); |
| 106 | 123 | ||
| 107 | extern struct pcpu_alloc_info * __init pcpu_build_alloc_info( | ||
| 108 | size_t reserved_size, ssize_t dyn_size, | ||
| 109 | size_t atom_size, | ||
| 110 | pcpu_fc_cpu_distance_fn_t cpu_distance_fn); | ||
| 111 | |||
| 112 | extern int __init pcpu_setup_first_chunk(const struct pcpu_alloc_info *ai, | 124 | extern int __init pcpu_setup_first_chunk(const struct pcpu_alloc_info *ai, |
| 113 | void *base_addr); | 125 | void *base_addr); |
| 114 | 126 | ||
| 115 | #ifdef CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK | 127 | #ifdef CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK |
| 116 | extern int __init pcpu_embed_first_chunk(size_t reserved_size, ssize_t dyn_size, | 128 | extern int __init pcpu_embed_first_chunk(size_t reserved_size, size_t dyn_size, |
| 117 | size_t atom_size, | 129 | size_t atom_size, |
| 118 | pcpu_fc_cpu_distance_fn_t cpu_distance_fn, | 130 | pcpu_fc_cpu_distance_fn_t cpu_distance_fn, |
| 119 | pcpu_fc_alloc_fn_t alloc_fn, | 131 | pcpu_fc_alloc_fn_t alloc_fn, |
| @@ -132,33 +144,19 @@ extern int __init pcpu_page_first_chunk(size_t reserved_size, | |||
| 132 | * dynamically allocated. Non-atomic access to the current CPU's | 144 | * dynamically allocated. Non-atomic access to the current CPU's |
| 133 | * version should probably be combined with get_cpu()/put_cpu(). | 145 | * version should probably be combined with get_cpu()/put_cpu(). |
| 134 | */ | 146 | */ |
| 147 | #ifdef CONFIG_SMP | ||
| 135 | #define per_cpu_ptr(ptr, cpu) SHIFT_PERCPU_PTR((ptr), per_cpu_offset((cpu))) | 148 | #define per_cpu_ptr(ptr, cpu) SHIFT_PERCPU_PTR((ptr), per_cpu_offset((cpu))) |
| 149 | #else | ||
| 150 | #define per_cpu_ptr(ptr, cpu) ({ (void)(cpu); VERIFY_PERCPU_PTR((ptr)); }) | ||
| 151 | #endif | ||
| 136 | 152 | ||
| 137 | extern void __percpu *__alloc_reserved_percpu(size_t size, size_t align); | 153 | extern void __percpu *__alloc_reserved_percpu(size_t size, size_t align); |
| 138 | extern bool is_kernel_percpu_address(unsigned long addr); | 154 | extern bool is_kernel_percpu_address(unsigned long addr); |
| 139 | 155 | ||
| 140 | #ifndef CONFIG_HAVE_SETUP_PER_CPU_AREA | 156 | #if !defined(CONFIG_SMP) || !defined(CONFIG_HAVE_SETUP_PER_CPU_AREA) |
| 141 | extern void __init setup_per_cpu_areas(void); | 157 | extern void __init setup_per_cpu_areas(void); |
| 142 | #endif | 158 | #endif |
| 143 | 159 | extern void __init percpu_init_late(void); | |
| 144 | #else /* CONFIG_SMP */ | ||
| 145 | |||
| 146 | #define per_cpu_ptr(ptr, cpu) ({ (void)(cpu); (ptr); }) | ||
| 147 | |||
| 148 | /* can't distinguish from other static vars, always false */ | ||
| 149 | static inline bool is_kernel_percpu_address(unsigned long addr) | ||
| 150 | { | ||
| 151 | return false; | ||
| 152 | } | ||
| 153 | |||
| 154 | static inline void __init setup_per_cpu_areas(void) { } | ||
| 155 | |||
| 156 | static inline void *pcpu_lpage_remapped(void *kaddr) | ||
| 157 | { | ||
| 158 | return NULL; | ||
| 159 | } | ||
| 160 | |||
| 161 | #endif /* CONFIG_SMP */ | ||
| 162 | 160 | ||
| 163 | extern void __percpu *__alloc_percpu(size_t size, size_t align); | 161 | extern void __percpu *__alloc_percpu(size_t size, size_t align); |
| 164 | extern void free_percpu(void __percpu *__pdata); | 162 | extern void free_percpu(void __percpu *__pdata); |
diff --git a/include/linux/percpu_counter.h b/include/linux/percpu_counter.h index c88d67b59394..46f6ba56fa91 100644 --- a/include/linux/percpu_counter.h +++ b/include/linux/percpu_counter.h | |||
| @@ -40,6 +40,7 @@ void percpu_counter_destroy(struct percpu_counter *fbc); | |||
| 40 | void percpu_counter_set(struct percpu_counter *fbc, s64 amount); | 40 | void percpu_counter_set(struct percpu_counter *fbc, s64 amount); |
| 41 | void __percpu_counter_add(struct percpu_counter *fbc, s64 amount, s32 batch); | 41 | void __percpu_counter_add(struct percpu_counter *fbc, s64 amount, s32 batch); |
| 42 | s64 __percpu_counter_sum(struct percpu_counter *fbc); | 42 | s64 __percpu_counter_sum(struct percpu_counter *fbc); |
| 43 | int percpu_counter_compare(struct percpu_counter *fbc, s64 rhs); | ||
| 43 | 44 | ||
| 44 | static inline void percpu_counter_add(struct percpu_counter *fbc, s64 amount) | 45 | static inline void percpu_counter_add(struct percpu_counter *fbc, s64 amount) |
| 45 | { | 46 | { |
| @@ -77,6 +78,11 @@ static inline s64 percpu_counter_read_positive(struct percpu_counter *fbc) | |||
| 77 | return 1; | 78 | return 1; |
| 78 | } | 79 | } |
| 79 | 80 | ||
| 81 | static inline int percpu_counter_initialized(struct percpu_counter *fbc) | ||
| 82 | { | ||
| 83 | return (fbc->counters != NULL); | ||
| 84 | } | ||
| 85 | |||
| 80 | #else | 86 | #else |
| 81 | 87 | ||
| 82 | struct percpu_counter { | 88 | struct percpu_counter { |
| @@ -98,6 +104,16 @@ static inline void percpu_counter_set(struct percpu_counter *fbc, s64 amount) | |||
| 98 | fbc->count = amount; | 104 | fbc->count = amount; |
| 99 | } | 105 | } |
| 100 | 106 | ||
| 107 | static inline int percpu_counter_compare(struct percpu_counter *fbc, s64 rhs) | ||
| 108 | { | ||
| 109 | if (fbc->count > rhs) | ||
| 110 | return 1; | ||
| 111 | else if (fbc->count < rhs) | ||
| 112 | return -1; | ||
| 113 | else | ||
| 114 | return 0; | ||
| 115 | } | ||
| 116 | |||
| 101 | static inline void | 117 | static inline void |
| 102 | percpu_counter_add(struct percpu_counter *fbc, s64 amount) | 118 | percpu_counter_add(struct percpu_counter *fbc, s64 amount) |
| 103 | { | 119 | { |
| @@ -132,6 +148,11 @@ static inline s64 percpu_counter_sum(struct percpu_counter *fbc) | |||
| 132 | return percpu_counter_read(fbc); | 148 | return percpu_counter_read(fbc); |
| 133 | } | 149 | } |
| 134 | 150 | ||
| 151 | static inline int percpu_counter_initialized(struct percpu_counter *fbc) | ||
| 152 | { | ||
| 153 | return 1; | ||
| 154 | } | ||
| 155 | |||
| 135 | #endif /* CONFIG_SMP */ | 156 | #endif /* CONFIG_SMP */ |
| 136 | 157 | ||
| 137 | static inline void percpu_counter_inc(struct percpu_counter *fbc) | 158 | static inline void percpu_counter_inc(struct percpu_counter *fbc) |
diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h index 5d0266d94985..057bf22a8323 100644 --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h | |||
| @@ -214,8 +214,9 @@ struct perf_event_attr { | |||
| 214 | * See also PERF_RECORD_MISC_EXACT_IP | 214 | * See also PERF_RECORD_MISC_EXACT_IP |
| 215 | */ | 215 | */ |
| 216 | precise_ip : 2, /* skid constraint */ | 216 | precise_ip : 2, /* skid constraint */ |
| 217 | mmap_data : 1, /* non-exec mmap data */ | ||
| 217 | 218 | ||
| 218 | __reserved_1 : 47; | 219 | __reserved_1 : 46; |
| 219 | 220 | ||
| 220 | union { | 221 | union { |
| 221 | __u32 wakeup_events; /* wakeup every n events */ | 222 | __u32 wakeup_events; /* wakeup every n events */ |
| @@ -461,6 +462,7 @@ enum perf_callchain_context { | |||
| 461 | 462 | ||
| 462 | #ifdef CONFIG_PERF_EVENTS | 463 | #ifdef CONFIG_PERF_EVENTS |
| 463 | # include <asm/perf_event.h> | 464 | # include <asm/perf_event.h> |
| 465 | # include <asm/local64.h> | ||
| 464 | #endif | 466 | #endif |
| 465 | 467 | ||
| 466 | struct perf_guest_info_callbacks { | 468 | struct perf_guest_info_callbacks { |
| @@ -484,6 +486,8 @@ struct perf_guest_info_callbacks { | |||
| 484 | #include <linux/workqueue.h> | 486 | #include <linux/workqueue.h> |
| 485 | #include <linux/ftrace.h> | 487 | #include <linux/ftrace.h> |
| 486 | #include <linux/cpu.h> | 488 | #include <linux/cpu.h> |
| 489 | #include <linux/irq_work.h> | ||
| 490 | #include <linux/jump_label_ref.h> | ||
| 487 | #include <asm/atomic.h> | 491 | #include <asm/atomic.h> |
| 488 | #include <asm/local.h> | 492 | #include <asm/local.h> |
| 489 | 493 | ||
| @@ -527,18 +531,26 @@ struct hw_perf_event { | |||
| 527 | int last_cpu; | 531 | int last_cpu; |
| 528 | }; | 532 | }; |
| 529 | struct { /* software */ | 533 | struct { /* software */ |
| 530 | s64 remaining; | ||
| 531 | struct hrtimer hrtimer; | 534 | struct hrtimer hrtimer; |
| 532 | }; | 535 | }; |
| 533 | #ifdef CONFIG_HAVE_HW_BREAKPOINT | 536 | #ifdef CONFIG_HAVE_HW_BREAKPOINT |
| 534 | /* breakpoint */ | 537 | struct { /* breakpoint */ |
| 535 | struct arch_hw_breakpoint info; | 538 | struct arch_hw_breakpoint info; |
| 539 | struct list_head bp_list; | ||
| 540 | /* | ||
| 541 | * Crufty hack to avoid the chicken and egg | ||
| 542 | * problem hw_breakpoint has with context | ||
| 543 | * creation and event initalization. | ||
| 544 | */ | ||
| 545 | struct task_struct *bp_target; | ||
| 546 | }; | ||
| 536 | #endif | 547 | #endif |
| 537 | }; | 548 | }; |
| 538 | atomic64_t prev_count; | 549 | int state; |
| 550 | local64_t prev_count; | ||
| 539 | u64 sample_period; | 551 | u64 sample_period; |
| 540 | u64 last_period; | 552 | u64 last_period; |
| 541 | atomic64_t period_left; | 553 | local64_t period_left; |
| 542 | u64 interrupts; | 554 | u64 interrupts; |
| 543 | 555 | ||
| 544 | u64 freq_time_stamp; | 556 | u64 freq_time_stamp; |
| @@ -546,30 +558,88 @@ struct hw_perf_event { | |||
| 546 | #endif | 558 | #endif |
| 547 | }; | 559 | }; |
| 548 | 560 | ||
| 561 | /* | ||
| 562 | * hw_perf_event::state flags | ||
| 563 | */ | ||
| 564 | #define PERF_HES_STOPPED 0x01 /* the counter is stopped */ | ||
| 565 | #define PERF_HES_UPTODATE 0x02 /* event->count up-to-date */ | ||
| 566 | #define PERF_HES_ARCH 0x04 | ||
| 567 | |||
| 549 | struct perf_event; | 568 | struct perf_event; |
| 550 | 569 | ||
| 551 | #define PERF_EVENT_TXN_STARTED 1 | 570 | /* |
| 571 | * Common implementation detail of pmu::{start,commit,cancel}_txn | ||
| 572 | */ | ||
| 573 | #define PERF_EVENT_TXN 0x1 | ||
| 552 | 574 | ||
| 553 | /** | 575 | /** |
| 554 | * struct pmu - generic performance monitoring unit | 576 | * struct pmu - generic performance monitoring unit |
| 555 | */ | 577 | */ |
| 556 | struct pmu { | 578 | struct pmu { |
| 557 | int (*enable) (struct perf_event *event); | 579 | struct list_head entry; |
| 558 | void (*disable) (struct perf_event *event); | 580 | |
| 559 | int (*start) (struct perf_event *event); | 581 | int * __percpu pmu_disable_count; |
| 560 | void (*stop) (struct perf_event *event); | 582 | struct perf_cpu_context * __percpu pmu_cpu_context; |
| 561 | void (*read) (struct perf_event *event); | 583 | int task_ctx_nr; |
| 562 | void (*unthrottle) (struct perf_event *event); | 584 | |
| 585 | /* | ||
| 586 | * Fully disable/enable this PMU, can be used to protect from the PMI | ||
| 587 | * as well as for lazy/batch writing of the MSRs. | ||
| 588 | */ | ||
| 589 | void (*pmu_enable) (struct pmu *pmu); /* optional */ | ||
| 590 | void (*pmu_disable) (struct pmu *pmu); /* optional */ | ||
| 591 | |||
| 592 | /* | ||
| 593 | * Try and initialize the event for this PMU. | ||
| 594 | * Should return -ENOENT when the @event doesn't match this PMU. | ||
| 595 | */ | ||
| 596 | int (*event_init) (struct perf_event *event); | ||
| 597 | |||
| 598 | #define PERF_EF_START 0x01 /* start the counter when adding */ | ||
| 599 | #define PERF_EF_RELOAD 0x02 /* reload the counter when starting */ | ||
| 600 | #define PERF_EF_UPDATE 0x04 /* update the counter when stopping */ | ||
| 601 | |||
| 602 | /* | ||
| 603 | * Adds/Removes a counter to/from the PMU, can be done inside | ||
| 604 | * a transaction, see the ->*_txn() methods. | ||
| 605 | */ | ||
| 606 | int (*add) (struct perf_event *event, int flags); | ||
| 607 | void (*del) (struct perf_event *event, int flags); | ||
| 563 | 608 | ||
| 564 | /* | 609 | /* |
| 565 | * group events scheduling is treated as a transaction, | 610 | * Starts/Stops a counter present on the PMU. The PMI handler |
| 566 | * add group events as a whole and perform one schedulability test. | 611 | * should stop the counter when perf_event_overflow() returns |
| 567 | * If test fails, roll back the whole group | 612 | * !0. ->start() will be used to continue. |
| 568 | */ | 613 | */ |
| 614 | void (*start) (struct perf_event *event, int flags); | ||
| 615 | void (*stop) (struct perf_event *event, int flags); | ||
| 569 | 616 | ||
| 570 | void (*start_txn) (const struct pmu *pmu); | 617 | /* |
| 571 | void (*cancel_txn) (const struct pmu *pmu); | 618 | * Updates the counter value of the event. |
| 572 | int (*commit_txn) (const struct pmu *pmu); | 619 | */ |
| 620 | void (*read) (struct perf_event *event); | ||
| 621 | |||
| 622 | /* | ||
| 623 | * Group events scheduling is treated as a transaction, add | ||
| 624 | * group events as a whole and perform one schedulability test. | ||
| 625 | * If the test fails, roll back the whole group | ||
| 626 | * | ||
| 627 | * Start the transaction, after this ->add() doesn't need to | ||
| 628 | * do schedulability tests. | ||
| 629 | */ | ||
| 630 | void (*start_txn) (struct pmu *pmu); /* optional */ | ||
| 631 | /* | ||
| 632 | * If ->start_txn() disabled the ->add() schedulability test | ||
| 633 | * then ->commit_txn() is required to perform one. On success | ||
| 634 | * the transaction is closed. On error the transaction is kept | ||
| 635 | * open until ->cancel_txn() is called. | ||
| 636 | */ | ||
| 637 | int (*commit_txn) (struct pmu *pmu); /* optional */ | ||
| 638 | /* | ||
| 639 | * Will cancel the transaction, assumes ->del() is called | ||
| 640 | * for each successfull ->add() during the transaction. | ||
| 641 | */ | ||
| 642 | void (*cancel_txn) (struct pmu *pmu); /* optional */ | ||
| 573 | }; | 643 | }; |
| 574 | 644 | ||
| 575 | /** | 645 | /** |
| @@ -584,7 +654,9 @@ enum perf_event_active_state { | |||
| 584 | 654 | ||
| 585 | struct file; | 655 | struct file; |
| 586 | 656 | ||
| 587 | struct perf_mmap_data { | 657 | #define PERF_BUFFER_WRITABLE 0x01 |
| 658 | |||
| 659 | struct perf_buffer { | ||
| 588 | atomic_t refcount; | 660 | atomic_t refcount; |
| 589 | struct rcu_head rcu_head; | 661 | struct rcu_head rcu_head; |
| 590 | #ifdef CONFIG_PERF_USE_VMALLOC | 662 | #ifdef CONFIG_PERF_USE_VMALLOC |
| @@ -608,11 +680,6 @@ struct perf_mmap_data { | |||
| 608 | void *data_pages[0]; | 680 | void *data_pages[0]; |
| 609 | }; | 681 | }; |
| 610 | 682 | ||
| 611 | struct perf_pending_entry { | ||
| 612 | struct perf_pending_entry *next; | ||
| 613 | void (*func)(struct perf_pending_entry *); | ||
| 614 | }; | ||
| 615 | |||
| 616 | struct perf_sample_data; | 683 | struct perf_sample_data; |
| 617 | 684 | ||
| 618 | typedef void (*perf_overflow_handler_t)(struct perf_event *, int, | 685 | typedef void (*perf_overflow_handler_t)(struct perf_event *, int, |
| @@ -633,6 +700,7 @@ struct swevent_hlist { | |||
| 633 | 700 | ||
| 634 | #define PERF_ATTACH_CONTEXT 0x01 | 701 | #define PERF_ATTACH_CONTEXT 0x01 |
| 635 | #define PERF_ATTACH_GROUP 0x02 | 702 | #define PERF_ATTACH_GROUP 0x02 |
| 703 | #define PERF_ATTACH_TASK 0x04 | ||
| 636 | 704 | ||
| 637 | /** | 705 | /** |
| 638 | * struct perf_event - performance event kernel representation: | 706 | * struct perf_event - performance event kernel representation: |
| @@ -646,11 +714,12 @@ struct perf_event { | |||
| 646 | int nr_siblings; | 714 | int nr_siblings; |
| 647 | int group_flags; | 715 | int group_flags; |
| 648 | struct perf_event *group_leader; | 716 | struct perf_event *group_leader; |
| 649 | const struct pmu *pmu; | 717 | struct pmu *pmu; |
| 650 | 718 | ||
| 651 | enum perf_event_active_state state; | 719 | enum perf_event_active_state state; |
| 652 | unsigned int attach_state; | 720 | unsigned int attach_state; |
| 653 | atomic64_t count; | 721 | local64_t count; |
| 722 | atomic64_t child_count; | ||
| 654 | 723 | ||
| 655 | /* | 724 | /* |
| 656 | * These are the total time in nanoseconds that the event | 725 | * These are the total time in nanoseconds that the event |
| @@ -709,7 +778,7 @@ struct perf_event { | |||
| 709 | atomic_t mmap_count; | 778 | atomic_t mmap_count; |
| 710 | int mmap_locked; | 779 | int mmap_locked; |
| 711 | struct user_struct *mmap_user; | 780 | struct user_struct *mmap_user; |
| 712 | struct perf_mmap_data *data; | 781 | struct perf_buffer *buffer; |
| 713 | 782 | ||
| 714 | /* poll related */ | 783 | /* poll related */ |
| 715 | wait_queue_head_t waitq; | 784 | wait_queue_head_t waitq; |
| @@ -719,7 +788,7 @@ struct perf_event { | |||
| 719 | int pending_wakeup; | 788 | int pending_wakeup; |
| 720 | int pending_kill; | 789 | int pending_kill; |
| 721 | int pending_disable; | 790 | int pending_disable; |
| 722 | struct perf_pending_entry pending; | 791 | struct irq_work pending; |
| 723 | 792 | ||
| 724 | atomic_t event_limit; | 793 | atomic_t event_limit; |
| 725 | 794 | ||
| @@ -739,12 +808,19 @@ struct perf_event { | |||
| 739 | #endif /* CONFIG_PERF_EVENTS */ | 808 | #endif /* CONFIG_PERF_EVENTS */ |
| 740 | }; | 809 | }; |
| 741 | 810 | ||
| 811 | enum perf_event_context_type { | ||
| 812 | task_context, | ||
| 813 | cpu_context, | ||
| 814 | }; | ||
| 815 | |||
| 742 | /** | 816 | /** |
| 743 | * struct perf_event_context - event context structure | 817 | * struct perf_event_context - event context structure |
| 744 | * | 818 | * |
| 745 | * Used as a container for task events and CPU events as well: | 819 | * Used as a container for task events and CPU events as well: |
| 746 | */ | 820 | */ |
| 747 | struct perf_event_context { | 821 | struct perf_event_context { |
| 822 | enum perf_event_context_type type; | ||
| 823 | struct pmu *pmu; | ||
| 748 | /* | 824 | /* |
| 749 | * Protect the states of the events in the list, | 825 | * Protect the states of the events in the list, |
| 750 | * nr_active, and the list: | 826 | * nr_active, and the list: |
| @@ -784,6 +860,12 @@ struct perf_event_context { | |||
| 784 | struct rcu_head rcu_head; | 860 | struct rcu_head rcu_head; |
| 785 | }; | 861 | }; |
| 786 | 862 | ||
| 863 | /* | ||
| 864 | * Number of contexts where an event can trigger: | ||
| 865 | * task, softirq, hardirq, nmi. | ||
| 866 | */ | ||
| 867 | #define PERF_NR_CONTEXTS 4 | ||
| 868 | |||
| 787 | /** | 869 | /** |
| 788 | * struct perf_event_cpu_context - per cpu event context structure | 870 | * struct perf_event_cpu_context - per cpu event context structure |
| 789 | */ | 871 | */ |
| @@ -791,23 +873,14 @@ struct perf_cpu_context { | |||
| 791 | struct perf_event_context ctx; | 873 | struct perf_event_context ctx; |
| 792 | struct perf_event_context *task_ctx; | 874 | struct perf_event_context *task_ctx; |
| 793 | int active_oncpu; | 875 | int active_oncpu; |
| 794 | int max_pertask; | ||
| 795 | int exclusive; | 876 | int exclusive; |
| 796 | struct swevent_hlist *swevent_hlist; | 877 | struct list_head rotation_list; |
| 797 | struct mutex hlist_mutex; | 878 | int jiffies_interval; |
| 798 | int hlist_refcount; | ||
| 799 | |||
| 800 | /* | ||
| 801 | * Recursion avoidance: | ||
| 802 | * | ||
| 803 | * task, softirq, irq, nmi context | ||
| 804 | */ | ||
| 805 | int recursion[4]; | ||
| 806 | }; | 879 | }; |
| 807 | 880 | ||
| 808 | struct perf_output_handle { | 881 | struct perf_output_handle { |
| 809 | struct perf_event *event; | 882 | struct perf_event *event; |
| 810 | struct perf_mmap_data *data; | 883 | struct perf_buffer *buffer; |
| 811 | unsigned long wakeup; | 884 | unsigned long wakeup; |
| 812 | unsigned long size; | 885 | unsigned long size; |
| 813 | void *addr; | 886 | void *addr; |
| @@ -818,26 +891,34 @@ struct perf_output_handle { | |||
| 818 | 891 | ||
| 819 | #ifdef CONFIG_PERF_EVENTS | 892 | #ifdef CONFIG_PERF_EVENTS |
| 820 | 893 | ||
| 821 | /* | 894 | extern int perf_pmu_register(struct pmu *pmu); |
| 822 | * Set by architecture code: | 895 | extern void perf_pmu_unregister(struct pmu *pmu); |
| 823 | */ | 896 | |
| 824 | extern int perf_max_events; | 897 | extern int perf_num_counters(void); |
| 898 | extern const char *perf_pmu_name(void); | ||
| 899 | extern void __perf_event_task_sched_in(struct task_struct *task); | ||
| 900 | extern void __perf_event_task_sched_out(struct task_struct *task, struct task_struct *next); | ||
| 825 | 901 | ||
| 826 | extern const struct pmu *hw_perf_event_init(struct perf_event *event); | 902 | extern atomic_t perf_task_events; |
| 903 | |||
| 904 | static inline void perf_event_task_sched_in(struct task_struct *task) | ||
| 905 | { | ||
| 906 | COND_STMT(&perf_task_events, __perf_event_task_sched_in(task)); | ||
| 907 | } | ||
| 908 | |||
| 909 | static inline | ||
| 910 | void perf_event_task_sched_out(struct task_struct *task, struct task_struct *next) | ||
| 911 | { | ||
| 912 | COND_STMT(&perf_task_events, __perf_event_task_sched_out(task, next)); | ||
| 913 | } | ||
| 827 | 914 | ||
| 828 | extern void perf_event_task_sched_in(struct task_struct *task); | ||
| 829 | extern void perf_event_task_sched_out(struct task_struct *task, struct task_struct *next); | ||
| 830 | extern void perf_event_task_tick(struct task_struct *task); | ||
| 831 | extern int perf_event_init_task(struct task_struct *child); | 915 | extern int perf_event_init_task(struct task_struct *child); |
| 832 | extern void perf_event_exit_task(struct task_struct *child); | 916 | extern void perf_event_exit_task(struct task_struct *child); |
| 833 | extern void perf_event_free_task(struct task_struct *task); | 917 | extern void perf_event_free_task(struct task_struct *task); |
| 834 | extern void set_perf_event_pending(void); | 918 | extern void perf_event_delayed_put(struct task_struct *task); |
| 835 | extern void perf_event_do_pending(void); | ||
| 836 | extern void perf_event_print_debug(void); | 919 | extern void perf_event_print_debug(void); |
| 837 | extern void __perf_disable(void); | 920 | extern void perf_pmu_disable(struct pmu *pmu); |
| 838 | extern bool __perf_enable(void); | 921 | extern void perf_pmu_enable(struct pmu *pmu); |
| 839 | extern void perf_disable(void); | ||
| 840 | extern void perf_enable(void); | ||
| 841 | extern int perf_event_task_disable(void); | 922 | extern int perf_event_task_disable(void); |
| 842 | extern int perf_event_task_enable(void); | 923 | extern int perf_event_task_enable(void); |
| 843 | extern void perf_event_update_userpage(struct perf_event *event); | 924 | extern void perf_event_update_userpage(struct perf_event *event); |
| @@ -845,7 +926,7 @@ extern int perf_event_release_kernel(struct perf_event *event); | |||
| 845 | extern struct perf_event * | 926 | extern struct perf_event * |
| 846 | perf_event_create_kernel_counter(struct perf_event_attr *attr, | 927 | perf_event_create_kernel_counter(struct perf_event_attr *attr, |
| 847 | int cpu, | 928 | int cpu, |
| 848 | pid_t pid, | 929 | struct task_struct *task, |
| 849 | perf_overflow_handler_t callback); | 930 | perf_overflow_handler_t callback); |
| 850 | extern u64 perf_event_read_value(struct perf_event *event, | 931 | extern u64 perf_event_read_value(struct perf_event *event, |
| 851 | u64 *enabled, u64 *running); | 932 | u64 *enabled, u64 *running); |
| @@ -896,22 +977,17 @@ extern int perf_event_overflow(struct perf_event *event, int nmi, | |||
| 896 | */ | 977 | */ |
| 897 | static inline int is_software_event(struct perf_event *event) | 978 | static inline int is_software_event(struct perf_event *event) |
| 898 | { | 979 | { |
| 899 | switch (event->attr.type) { | 980 | return event->pmu->task_ctx_nr == perf_sw_context; |
| 900 | case PERF_TYPE_SOFTWARE: | ||
| 901 | case PERF_TYPE_TRACEPOINT: | ||
| 902 | /* for now the breakpoint stuff also works as software event */ | ||
| 903 | case PERF_TYPE_BREAKPOINT: | ||
| 904 | return 1; | ||
| 905 | } | ||
| 906 | return 0; | ||
| 907 | } | 981 | } |
| 908 | 982 | ||
| 909 | extern atomic_t perf_swevent_enabled[PERF_COUNT_SW_MAX]; | 983 | extern atomic_t perf_swevent_enabled[PERF_COUNT_SW_MAX]; |
| 910 | 984 | ||
| 911 | extern void __perf_sw_event(u32, u64, int, struct pt_regs *, u64); | 985 | extern void __perf_sw_event(u32, u64, int, struct pt_regs *, u64); |
| 912 | 986 | ||
| 913 | extern void | 987 | #ifndef perf_arch_fetch_caller_regs |
| 914 | perf_arch_fetch_caller_regs(struct pt_regs *regs, unsigned long ip, int skip); | 988 | static inline void |
| 989 | perf_arch_fetch_caller_regs(struct pt_regs *regs, unsigned long ip) { } | ||
| 990 | #endif | ||
| 915 | 991 | ||
| 916 | /* | 992 | /* |
| 917 | * Take a snapshot of the regs. Skip ip and frame pointer to | 993 | * Take a snapshot of the regs. Skip ip and frame pointer to |
| @@ -921,55 +997,30 @@ perf_arch_fetch_caller_regs(struct pt_regs *regs, unsigned long ip, int skip); | |||
| 921 | * - bp for callchains | 997 | * - bp for callchains |
| 922 | * - eflags, for future purposes, just in case | 998 | * - eflags, for future purposes, just in case |
| 923 | */ | 999 | */ |
| 924 | static inline void perf_fetch_caller_regs(struct pt_regs *regs, int skip) | 1000 | static inline void perf_fetch_caller_regs(struct pt_regs *regs) |
| 925 | { | 1001 | { |
| 926 | unsigned long ip; | ||
| 927 | |||
| 928 | memset(regs, 0, sizeof(*regs)); | 1002 | memset(regs, 0, sizeof(*regs)); |
| 929 | 1003 | ||
| 930 | switch (skip) { | 1004 | perf_arch_fetch_caller_regs(regs, CALLER_ADDR0); |
| 931 | case 1 : | ||
| 932 | ip = CALLER_ADDR0; | ||
| 933 | break; | ||
| 934 | case 2 : | ||
| 935 | ip = CALLER_ADDR1; | ||
| 936 | break; | ||
| 937 | case 3 : | ||
| 938 | ip = CALLER_ADDR2; | ||
| 939 | break; | ||
| 940 | case 4: | ||
| 941 | ip = CALLER_ADDR3; | ||
| 942 | break; | ||
| 943 | /* No need to support further for now */ | ||
| 944 | default: | ||
| 945 | ip = 0; | ||
| 946 | } | ||
| 947 | |||
| 948 | return perf_arch_fetch_caller_regs(regs, ip, skip); | ||
| 949 | } | 1005 | } |
| 950 | 1006 | ||
| 951 | static inline void | 1007 | static __always_inline void |
| 952 | perf_sw_event(u32 event_id, u64 nr, int nmi, struct pt_regs *regs, u64 addr) | 1008 | perf_sw_event(u32 event_id, u64 nr, int nmi, struct pt_regs *regs, u64 addr) |
| 953 | { | 1009 | { |
| 954 | if (atomic_read(&perf_swevent_enabled[event_id])) { | 1010 | struct pt_regs hot_regs; |
| 955 | struct pt_regs hot_regs; | ||
| 956 | |||
| 957 | if (!regs) { | ||
| 958 | perf_fetch_caller_regs(&hot_regs, 1); | ||
| 959 | regs = &hot_regs; | ||
| 960 | } | ||
| 961 | __perf_sw_event(event_id, nr, nmi, regs, addr); | ||
| 962 | } | ||
| 963 | } | ||
| 964 | 1011 | ||
| 965 | extern void __perf_event_mmap(struct vm_area_struct *vma); | 1012 | JUMP_LABEL(&perf_swevent_enabled[event_id], have_event); |
| 1013 | return; | ||
| 966 | 1014 | ||
| 967 | static inline void perf_event_mmap(struct vm_area_struct *vma) | 1015 | have_event: |
| 968 | { | 1016 | if (!regs) { |
| 969 | if (vma->vm_flags & VM_EXEC) | 1017 | perf_fetch_caller_regs(&hot_regs); |
| 970 | __perf_event_mmap(vma); | 1018 | regs = &hot_regs; |
| 1019 | } | ||
| 1020 | __perf_sw_event(event_id, nr, nmi, regs, addr); | ||
| 971 | } | 1021 | } |
| 972 | 1022 | ||
| 1023 | extern void perf_event_mmap(struct vm_area_struct *vma); | ||
| 973 | extern struct perf_guest_info_callbacks *perf_guest_cbs; | 1024 | extern struct perf_guest_info_callbacks *perf_guest_cbs; |
| 974 | extern int perf_register_guest_info_callbacks(struct perf_guest_info_callbacks *callbacks); | 1025 | extern int perf_register_guest_info_callbacks(struct perf_guest_info_callbacks *callbacks); |
| 975 | extern int perf_unregister_guest_info_callbacks(struct perf_guest_info_callbacks *callbacks); | 1026 | extern int perf_unregister_guest_info_callbacks(struct perf_guest_info_callbacks *callbacks); |
| @@ -977,7 +1028,21 @@ extern int perf_unregister_guest_info_callbacks(struct perf_guest_info_callbacks | |||
| 977 | extern void perf_event_comm(struct task_struct *tsk); | 1028 | extern void perf_event_comm(struct task_struct *tsk); |
| 978 | extern void perf_event_fork(struct task_struct *tsk); | 1029 | extern void perf_event_fork(struct task_struct *tsk); |
| 979 | 1030 | ||
| 980 | extern struct perf_callchain_entry *perf_callchain(struct pt_regs *regs); | 1031 | /* Callchains */ |
| 1032 | DECLARE_PER_CPU(struct perf_callchain_entry, perf_callchain_entry); | ||
| 1033 | |||
| 1034 | extern void perf_callchain_user(struct perf_callchain_entry *entry, | ||
| 1035 | struct pt_regs *regs); | ||
| 1036 | extern void perf_callchain_kernel(struct perf_callchain_entry *entry, | ||
| 1037 | struct pt_regs *regs); | ||
| 1038 | |||
| 1039 | |||
| 1040 | static inline void | ||
| 1041 | perf_callchain_store(struct perf_callchain_entry *entry, u64 ip) | ||
| 1042 | { | ||
| 1043 | if (entry->nr < PERF_MAX_STACK_DEPTH) | ||
| 1044 | entry->ip[entry->nr++] = ip; | ||
| 1045 | } | ||
| 981 | 1046 | ||
| 982 | extern int sysctl_perf_event_paranoid; | 1047 | extern int sysctl_perf_event_paranoid; |
| 983 | extern int sysctl_perf_event_mlock; | 1048 | extern int sysctl_perf_event_mlock; |
| @@ -1001,7 +1066,7 @@ static inline bool perf_paranoid_kernel(void) | |||
| 1001 | extern void perf_event_init(void); | 1066 | extern void perf_event_init(void); |
| 1002 | extern void perf_tp_event(u64 addr, u64 count, void *record, | 1067 | extern void perf_tp_event(u64 addr, u64 count, void *record, |
| 1003 | int entry_size, struct pt_regs *regs, | 1068 | int entry_size, struct pt_regs *regs, |
| 1004 | struct hlist_head *head); | 1069 | struct hlist_head *head, int rctx); |
| 1005 | extern void perf_bp_event(struct perf_event *event, void *data); | 1070 | extern void perf_bp_event(struct perf_event *event, void *data); |
| 1006 | 1071 | ||
| 1007 | #ifndef perf_misc_flags | 1072 | #ifndef perf_misc_flags |
| @@ -1020,21 +1085,18 @@ extern int perf_swevent_get_recursion_context(void); | |||
| 1020 | extern void perf_swevent_put_recursion_context(int rctx); | 1085 | extern void perf_swevent_put_recursion_context(int rctx); |
| 1021 | extern void perf_event_enable(struct perf_event *event); | 1086 | extern void perf_event_enable(struct perf_event *event); |
| 1022 | extern void perf_event_disable(struct perf_event *event); | 1087 | extern void perf_event_disable(struct perf_event *event); |
| 1088 | extern void perf_event_task_tick(void); | ||
| 1023 | #else | 1089 | #else |
| 1024 | static inline void | 1090 | static inline void |
| 1025 | perf_event_task_sched_in(struct task_struct *task) { } | 1091 | perf_event_task_sched_in(struct task_struct *task) { } |
| 1026 | static inline void | 1092 | static inline void |
| 1027 | perf_event_task_sched_out(struct task_struct *task, | 1093 | perf_event_task_sched_out(struct task_struct *task, |
| 1028 | struct task_struct *next) { } | 1094 | struct task_struct *next) { } |
| 1029 | static inline void | ||
| 1030 | perf_event_task_tick(struct task_struct *task) { } | ||
| 1031 | static inline int perf_event_init_task(struct task_struct *child) { return 0; } | 1095 | static inline int perf_event_init_task(struct task_struct *child) { return 0; } |
| 1032 | static inline void perf_event_exit_task(struct task_struct *child) { } | 1096 | static inline void perf_event_exit_task(struct task_struct *child) { } |
| 1033 | static inline void perf_event_free_task(struct task_struct *task) { } | 1097 | static inline void perf_event_free_task(struct task_struct *task) { } |
| 1034 | static inline void perf_event_do_pending(void) { } | 1098 | static inline void perf_event_delayed_put(struct task_struct *task) { } |
| 1035 | static inline void perf_event_print_debug(void) { } | 1099 | static inline void perf_event_print_debug(void) { } |
| 1036 | static inline void perf_disable(void) { } | ||
| 1037 | static inline void perf_enable(void) { } | ||
| 1038 | static inline int perf_event_task_disable(void) { return -EINVAL; } | 1100 | static inline int perf_event_task_disable(void) { return -EINVAL; } |
| 1039 | static inline int perf_event_task_enable(void) { return -EINVAL; } | 1101 | static inline int perf_event_task_enable(void) { return -EINVAL; } |
| 1040 | 1102 | ||
| @@ -1057,6 +1119,7 @@ static inline int perf_swevent_get_recursion_context(void) { return -1; } | |||
| 1057 | static inline void perf_swevent_put_recursion_context(int rctx) { } | 1119 | static inline void perf_swevent_put_recursion_context(int rctx) { } |
| 1058 | static inline void perf_event_enable(struct perf_event *event) { } | 1120 | static inline void perf_event_enable(struct perf_event *event) { } |
| 1059 | static inline void perf_event_disable(struct perf_event *event) { } | 1121 | static inline void perf_event_disable(struct perf_event *event) { } |
| 1122 | static inline void perf_event_task_tick(void) { } | ||
| 1060 | #endif | 1123 | #endif |
| 1061 | 1124 | ||
| 1062 | #define perf_output_put(handle, x) \ | 1125 | #define perf_output_put(handle, x) \ |
| @@ -1068,7 +1131,7 @@ static inline void perf_event_disable(struct perf_event *event) { } | |||
| 1068 | #define perf_cpu_notifier(fn) \ | 1131 | #define perf_cpu_notifier(fn) \ |
| 1069 | do { \ | 1132 | do { \ |
| 1070 | static struct notifier_block fn##_nb __cpuinitdata = \ | 1133 | static struct notifier_block fn##_nb __cpuinitdata = \ |
| 1071 | { .notifier_call = fn, .priority = 20 }; \ | 1134 | { .notifier_call = fn, .priority = CPU_PRI_PERF }; \ |
| 1072 | fn(&fn##_nb, (unsigned long)CPU_UP_PREPARE, \ | 1135 | fn(&fn##_nb, (unsigned long)CPU_UP_PREPARE, \ |
| 1073 | (void *)(unsigned long)smp_processor_id()); \ | 1136 | (void *)(unsigned long)smp_processor_id()); \ |
| 1074 | fn(&fn##_nb, (unsigned long)CPU_STARTING, \ | 1137 | fn(&fn##_nb, (unsigned long)CPU_STARTING, \ |
diff --git a/include/linux/phonet.h b/include/linux/phonet.h index e5126cff9b2a..26c8df786918 100644 --- a/include/linux/phonet.h +++ b/include/linux/phonet.h | |||
| @@ -36,6 +36,9 @@ | |||
| 36 | /* Socket options for SOL_PNPIPE level */ | 36 | /* Socket options for SOL_PNPIPE level */ |
| 37 | #define PNPIPE_ENCAP 1 | 37 | #define PNPIPE_ENCAP 1 |
| 38 | #define PNPIPE_IFINDEX 2 | 38 | #define PNPIPE_IFINDEX 2 |
| 39 | #define PNPIPE_PIPE_HANDLE 3 | ||
| 40 | #define PNPIPE_ENABLE 4 | ||
| 41 | /* unused slot */ | ||
| 39 | 42 | ||
| 40 | #define PNADDR_ANY 0 | 43 | #define PNADDR_ANY 0 |
| 41 | #define PNADDR_BROADCAST 0xFC | 44 | #define PNADDR_BROADCAST 0xFC |
| @@ -47,6 +50,8 @@ | |||
| 47 | 50 | ||
| 48 | /* ioctls */ | 51 | /* ioctls */ |
| 49 | #define SIOCPNGETOBJECT (SIOCPROTOPRIVATE + 0) | 52 | #define SIOCPNGETOBJECT (SIOCPROTOPRIVATE + 0) |
| 53 | #define SIOCPNADDRESOURCE (SIOCPROTOPRIVATE + 14) | ||
| 54 | #define SIOCPNDELRESOURCE (SIOCPROTOPRIVATE + 15) | ||
| 50 | 55 | ||
| 51 | /* Phonet protocol header */ | 56 | /* Phonet protocol header */ |
| 52 | struct phonethdr { | 57 | struct phonethdr { |
| @@ -98,7 +103,7 @@ struct sockaddr_pn { | |||
| 98 | __u8 spn_dev; | 103 | __u8 spn_dev; |
| 99 | __u8 spn_resource; | 104 | __u8 spn_resource; |
| 100 | __u8 spn_zero[sizeof(struct sockaddr) - sizeof(sa_family_t) - 3]; | 105 | __u8 spn_zero[sizeof(struct sockaddr) - sizeof(sa_family_t) - 3]; |
| 101 | } __attribute__ ((packed)); | 106 | } __attribute__((packed)); |
| 102 | 107 | ||
| 103 | /* Well known address */ | 108 | /* Well known address */ |
| 104 | #define PN_DEV_PC 0x10 | 109 | #define PN_DEV_PC 0x10 |
diff --git a/include/linux/phy.h b/include/linux/phy.h index 987e111f7b11..7da5fa845959 100644 --- a/include/linux/phy.h +++ b/include/linux/phy.h | |||
| @@ -116,7 +116,7 @@ struct mii_bus { | |||
| 116 | /* list of all PHYs on bus */ | 116 | /* list of all PHYs on bus */ |
| 117 | struct phy_device *phy_map[PHY_MAX_ADDR]; | 117 | struct phy_device *phy_map[PHY_MAX_ADDR]; |
| 118 | 118 | ||
| 119 | /* Phy addresses to be ignored when probing */ | 119 | /* PHY addresses to be ignored when probing */ |
| 120 | u32 phy_mask; | 120 | u32 phy_mask; |
| 121 | 121 | ||
| 122 | /* | 122 | /* |
| @@ -234,6 +234,8 @@ enum phy_state { | |||
| 234 | PHY_RESUMING | 234 | PHY_RESUMING |
| 235 | }; | 235 | }; |
| 236 | 236 | ||
| 237 | struct sk_buff; | ||
| 238 | |||
| 237 | /* phy_device: An instance of a PHY | 239 | /* phy_device: An instance of a PHY |
| 238 | * | 240 | * |
| 239 | * drv: Pointer to the driver for this PHY instance | 241 | * drv: Pointer to the driver for this PHY instance |
| @@ -281,7 +283,7 @@ struct phy_device { | |||
| 281 | 283 | ||
| 282 | phy_interface_t interface; | 284 | phy_interface_t interface; |
| 283 | 285 | ||
| 284 | /* Bus address of the PHY (0-32) */ | 286 | /* Bus address of the PHY (0-31) */ |
| 285 | int addr; | 287 | int addr; |
| 286 | 288 | ||
| 287 | /* | 289 | /* |
| @@ -402,6 +404,26 @@ struct phy_driver { | |||
| 402 | /* Clears up any memory if needed */ | 404 | /* Clears up any memory if needed */ |
| 403 | void (*remove)(struct phy_device *phydev); | 405 | void (*remove)(struct phy_device *phydev); |
| 404 | 406 | ||
| 407 | /* Handles SIOCSHWTSTAMP ioctl for hardware time stamping. */ | ||
| 408 | int (*hwtstamp)(struct phy_device *phydev, struct ifreq *ifr); | ||
| 409 | |||
| 410 | /* | ||
| 411 | * Requests a Rx timestamp for 'skb'. If the skb is accepted, | ||
| 412 | * the phy driver promises to deliver it using netif_rx() as | ||
| 413 | * soon as a timestamp becomes available. One of the | ||
| 414 | * PTP_CLASS_ values is passed in 'type'. The function must | ||
| 415 | * return true if the skb is accepted for delivery. | ||
| 416 | */ | ||
| 417 | bool (*rxtstamp)(struct phy_device *dev, struct sk_buff *skb, int type); | ||
| 418 | |||
| 419 | /* | ||
| 420 | * Requests a Tx timestamp for 'skb'. The phy driver promises | ||
| 421 | * to deliver it to the socket's error queue as soon as a | ||
| 422 | * timestamp becomes available. One of the PTP_CLASS_ values | ||
| 423 | * is passed in 'type'. | ||
| 424 | */ | ||
| 425 | void (*txtstamp)(struct phy_device *dev, struct sk_buff *skb, int type); | ||
| 426 | |||
| 405 | struct device_driver driver; | 427 | struct device_driver driver; |
| 406 | }; | 428 | }; |
| 407 | #define to_phy_driver(d) container_of(d, struct phy_driver, driver) | 429 | #define to_phy_driver(d) container_of(d, struct phy_driver, driver) |
| @@ -450,11 +472,7 @@ static inline int phy_write(struct phy_device *phydev, u32 regnum, u16 val) | |||
| 450 | int get_phy_id(struct mii_bus *bus, int addr, u32 *phy_id); | 472 | int get_phy_id(struct mii_bus *bus, int addr, u32 *phy_id); |
| 451 | struct phy_device* get_phy_device(struct mii_bus *bus, int addr); | 473 | struct phy_device* get_phy_device(struct mii_bus *bus, int addr); |
| 452 | int phy_device_register(struct phy_device *phy); | 474 | int phy_device_register(struct phy_device *phy); |
| 453 | int phy_clear_interrupt(struct phy_device *phydev); | ||
| 454 | int phy_config_interrupt(struct phy_device *phydev, u32 interrupts); | ||
| 455 | int phy_init_hw(struct phy_device *phydev); | 475 | int phy_init_hw(struct phy_device *phydev); |
| 456 | int phy_attach_direct(struct net_device *dev, struct phy_device *phydev, | ||
| 457 | u32 flags, phy_interface_t interface); | ||
| 458 | struct phy_device * phy_attach(struct net_device *dev, | 476 | struct phy_device * phy_attach(struct net_device *dev, |
| 459 | const char *bus_id, u32 flags, phy_interface_t interface); | 477 | const char *bus_id, u32 flags, phy_interface_t interface); |
| 460 | struct phy_device *phy_find_first(struct mii_bus *bus); | 478 | struct phy_device *phy_find_first(struct mii_bus *bus); |
| @@ -470,17 +488,12 @@ void phy_start(struct phy_device *phydev); | |||
| 470 | void phy_stop(struct phy_device *phydev); | 488 | void phy_stop(struct phy_device *phydev); |
| 471 | int phy_start_aneg(struct phy_device *phydev); | 489 | int phy_start_aneg(struct phy_device *phydev); |
| 472 | 490 | ||
| 473 | void phy_sanitize_settings(struct phy_device *phydev); | ||
| 474 | int phy_stop_interrupts(struct phy_device *phydev); | 491 | int phy_stop_interrupts(struct phy_device *phydev); |
| 475 | int phy_enable_interrupts(struct phy_device *phydev); | ||
| 476 | int phy_disable_interrupts(struct phy_device *phydev); | ||
| 477 | 492 | ||
| 478 | static inline int phy_read_status(struct phy_device *phydev) { | 493 | static inline int phy_read_status(struct phy_device *phydev) { |
| 479 | return phydev->drv->read_status(phydev); | 494 | return phydev->drv->read_status(phydev); |
| 480 | } | 495 | } |
| 481 | 496 | ||
| 482 | int genphy_config_advert(struct phy_device *phydev); | ||
| 483 | int genphy_setup_forced(struct phy_device *phydev); | ||
| 484 | int genphy_restart_aneg(struct phy_device *phydev); | 497 | int genphy_restart_aneg(struct phy_device *phydev); |
| 485 | int genphy_config_aneg(struct phy_device *phydev); | 498 | int genphy_config_aneg(struct phy_device *phydev); |
| 486 | int genphy_update_link(struct phy_device *phydev); | 499 | int genphy_update_link(struct phy_device *phydev); |
| @@ -489,8 +502,6 @@ int genphy_suspend(struct phy_device *phydev); | |||
| 489 | int genphy_resume(struct phy_device *phydev); | 502 | int genphy_resume(struct phy_device *phydev); |
| 490 | void phy_driver_unregister(struct phy_driver *drv); | 503 | void phy_driver_unregister(struct phy_driver *drv); |
| 491 | int phy_driver_register(struct phy_driver *new_driver); | 504 | int phy_driver_register(struct phy_driver *new_driver); |
| 492 | void phy_prepare_link(struct phy_device *phydev, | ||
| 493 | void (*adjust_link)(struct net_device *)); | ||
| 494 | void phy_state_machine(struct work_struct *work); | 505 | void phy_state_machine(struct work_struct *work); |
| 495 | void phy_start_machine(struct phy_device *phydev, | 506 | void phy_start_machine(struct phy_device *phydev, |
| 496 | void (*handler)(struct net_device *)); | 507 | void (*handler)(struct net_device *)); |
| @@ -498,10 +509,9 @@ void phy_stop_machine(struct phy_device *phydev); | |||
| 498 | int phy_ethtool_sset(struct phy_device *phydev, struct ethtool_cmd *cmd); | 509 | int phy_ethtool_sset(struct phy_device *phydev, struct ethtool_cmd *cmd); |
| 499 | int phy_ethtool_gset(struct phy_device *phydev, struct ethtool_cmd *cmd); | 510 | int phy_ethtool_gset(struct phy_device *phydev, struct ethtool_cmd *cmd); |
| 500 | int phy_mii_ioctl(struct phy_device *phydev, | 511 | int phy_mii_ioctl(struct phy_device *phydev, |
| 501 | struct mii_ioctl_data *mii_data, int cmd); | 512 | struct ifreq *ifr, int cmd); |
| 502 | int phy_start_interrupts(struct phy_device *phydev); | 513 | int phy_start_interrupts(struct phy_device *phydev); |
| 503 | void phy_print_status(struct phy_device *phydev); | 514 | void phy_print_status(struct phy_device *phydev); |
| 504 | struct phy_device* phy_device_create(struct mii_bus *bus, int addr, int phy_id); | ||
| 505 | void phy_device_free(struct phy_device *phydev); | 515 | void phy_device_free(struct phy_device *phydev); |
| 506 | 516 | ||
| 507 | int phy_register_fixup(const char *bus_id, u32 phy_uid, u32 phy_uid_mask, | 517 | int phy_register_fixup(const char *bus_id, u32 phy_uid, u32 phy_uid_mask, |
diff --git a/include/linux/pkt_cls.h b/include/linux/pkt_cls.h index 7f6ba8658abe..defbde203d07 100644 --- a/include/linux/pkt_cls.h +++ b/include/linux/pkt_cls.h | |||
| @@ -332,6 +332,7 @@ enum { | |||
| 332 | FLOW_KEY_SKUID, | 332 | FLOW_KEY_SKUID, |
| 333 | FLOW_KEY_SKGID, | 333 | FLOW_KEY_SKGID, |
| 334 | FLOW_KEY_VLAN_TAG, | 334 | FLOW_KEY_VLAN_TAG, |
| 335 | FLOW_KEY_RXHASH, | ||
| 335 | __FLOW_KEY_MAX, | 336 | __FLOW_KEY_MAX, |
| 336 | }; | 337 | }; |
| 337 | 338 | ||
diff --git a/include/linux/platform_device.h b/include/linux/platform_device.h index 5417944d3687..2e700ec0601f 100644 --- a/include/linux/platform_device.h +++ b/include/linux/platform_device.h | |||
| @@ -43,10 +43,64 @@ extern struct resource *platform_get_resource_byname(struct platform_device *, u | |||
| 43 | extern int platform_get_irq_byname(struct platform_device *, const char *); | 43 | extern int platform_get_irq_byname(struct platform_device *, const char *); |
| 44 | extern int platform_add_devices(struct platform_device **, int); | 44 | extern int platform_add_devices(struct platform_device **, int); |
| 45 | 45 | ||
| 46 | extern struct platform_device *platform_device_register_simple(const char *, int id, | 46 | extern struct platform_device *platform_device_register_resndata( |
| 47 | const struct resource *, unsigned int); | 47 | struct device *parent, const char *name, int id, |
| 48 | extern struct platform_device *platform_device_register_data(struct device *, | 48 | const struct resource *res, unsigned int num, |
| 49 | const char *, int, const void *, size_t); | 49 | const void *data, size_t size); |
| 50 | |||
| 51 | /** | ||
| 52 | * platform_device_register_simple - add a platform-level device and its resources | ||
| 53 | * @name: base name of the device we're adding | ||
| 54 | * @id: instance id | ||
| 55 | * @res: set of resources that needs to be allocated for the device | ||
| 56 | * @num: number of resources | ||
| 57 | * | ||
| 58 | * This function creates a simple platform device that requires minimal | ||
| 59 | * resource and memory management. Canned release function freeing memory | ||
| 60 | * allocated for the device allows drivers using such devices to be | ||
| 61 | * unloaded without waiting for the last reference to the device to be | ||
| 62 | * dropped. | ||
| 63 | * | ||
| 64 | * This interface is primarily intended for use with legacy drivers which | ||
| 65 | * probe hardware directly. Because such drivers create sysfs device nodes | ||
| 66 | * themselves, rather than letting system infrastructure handle such device | ||
| 67 | * enumeration tasks, they don't fully conform to the Linux driver model. | ||
| 68 | * In particular, when such drivers are built as modules, they can't be | ||
| 69 | * "hotplugged". | ||
| 70 | * | ||
| 71 | * Returns &struct platform_device pointer on success, or ERR_PTR() on error. | ||
| 72 | */ | ||
| 73 | static inline struct platform_device *platform_device_register_simple( | ||
| 74 | const char *name, int id, | ||
| 75 | const struct resource *res, unsigned int num) | ||
| 76 | { | ||
| 77 | return platform_device_register_resndata(NULL, name, id, | ||
| 78 | res, num, NULL, 0); | ||
| 79 | } | ||
| 80 | |||
| 81 | /** | ||
| 82 | * platform_device_register_data - add a platform-level device with platform-specific data | ||
| 83 | * @parent: parent device for the device we're adding | ||
| 84 | * @name: base name of the device we're adding | ||
| 85 | * @id: instance id | ||
| 86 | * @data: platform specific data for this platform device | ||
| 87 | * @size: size of platform specific data | ||
| 88 | * | ||
| 89 | * This function creates a simple platform device that requires minimal | ||
| 90 | * resource and memory management. Canned release function freeing memory | ||
| 91 | * allocated for the device allows drivers using such devices to be | ||
| 92 | * unloaded without waiting for the last reference to the device to be | ||
| 93 | * dropped. | ||
| 94 | * | ||
| 95 | * Returns &struct platform_device pointer on success, or ERR_PTR() on error. | ||
| 96 | */ | ||
| 97 | static inline struct platform_device *platform_device_register_data( | ||
| 98 | struct device *parent, const char *name, int id, | ||
| 99 | const void *data, size_t size) | ||
| 100 | { | ||
| 101 | return platform_device_register_resndata(parent, name, id, | ||
| 102 | NULL, 0, data, size); | ||
| 103 | } | ||
| 50 | 104 | ||
| 51 | extern struct platform_device *platform_device_alloc(const char *name, int id); | 105 | extern struct platform_device *platform_device_alloc(const char *name, int id); |
| 52 | extern int platform_device_add_resources(struct platform_device *pdev, | 106 | extern int platform_device_add_resources(struct platform_device *pdev, |
| @@ -84,6 +138,9 @@ extern struct platform_device *platform_create_bundle(struct platform_driver *dr | |||
| 84 | struct resource *res, unsigned int n_res, | 138 | struct resource *res, unsigned int n_res, |
| 85 | const void *data, size_t size); | 139 | const void *data, size_t size); |
| 86 | 140 | ||
| 141 | extern const struct dev_pm_ops * platform_bus_get_pm_ops(void); | ||
| 142 | extern void platform_bus_set_pm_ops(const struct dev_pm_ops *pm); | ||
| 143 | |||
| 87 | /* early platform driver interface */ | 144 | /* early platform driver interface */ |
| 88 | struct early_platform_driver { | 145 | struct early_platform_driver { |
| 89 | const char *class_str; | 146 | const char *class_str; |
diff --git a/include/linux/plist.h b/include/linux/plist.h index 6898985e7b38..7254eda078e5 100644 --- a/include/linux/plist.h +++ b/include/linux/plist.h | |||
| @@ -260,6 +260,23 @@ static inline int plist_node_empty(const struct plist_node *node) | |||
| 260 | #endif | 260 | #endif |
| 261 | 261 | ||
| 262 | /** | 262 | /** |
| 263 | * plist_last_entry - get the struct for the last entry | ||
| 264 | * @head: the &struct plist_head pointer | ||
| 265 | * @type: the type of the struct this is embedded in | ||
| 266 | * @member: the name of the list_struct within the struct | ||
| 267 | */ | ||
| 268 | #ifdef CONFIG_DEBUG_PI_LIST | ||
| 269 | # define plist_last_entry(head, type, member) \ | ||
| 270 | ({ \ | ||
| 271 | WARN_ON(plist_head_empty(head)); \ | ||
| 272 | container_of(plist_last(head), type, member); \ | ||
| 273 | }) | ||
| 274 | #else | ||
| 275 | # define plist_last_entry(head, type, member) \ | ||
| 276 | container_of(plist_last(head), type, member) | ||
| 277 | #endif | ||
| 278 | |||
| 279 | /** | ||
| 263 | * plist_first - return the first node (and thus, highest priority) | 280 | * plist_first - return the first node (and thus, highest priority) |
| 264 | * @head: the &struct plist_head pointer | 281 | * @head: the &struct plist_head pointer |
| 265 | * | 282 | * |
| @@ -271,4 +288,16 @@ static inline struct plist_node *plist_first(const struct plist_head *head) | |||
| 271 | struct plist_node, plist.node_list); | 288 | struct plist_node, plist.node_list); |
| 272 | } | 289 | } |
| 273 | 290 | ||
| 291 | /** | ||
| 292 | * plist_last - return the last node (and thus, lowest priority) | ||
| 293 | * @head: the &struct plist_head pointer | ||
| 294 | * | ||
| 295 | * Assumes the plist is _not_ empty. | ||
| 296 | */ | ||
| 297 | static inline struct plist_node *plist_last(const struct plist_head *head) | ||
| 298 | { | ||
| 299 | return list_entry(head->node_list.prev, | ||
| 300 | struct plist_node, plist.node_list); | ||
| 301 | } | ||
| 302 | |||
| 274 | #endif | 303 | #endif |
diff --git a/include/linux/pm.h b/include/linux/pm.h index 8e258c727971..40f3f45702ba 100644 --- a/include/linux/pm.h +++ b/include/linux/pm.h | |||
| @@ -41,6 +41,12 @@ extern void (*pm_power_off_prepare)(void); | |||
| 41 | 41 | ||
| 42 | struct device; | 42 | struct device; |
| 43 | 43 | ||
| 44 | #ifdef CONFIG_PM | ||
| 45 | extern const char power_group_name[]; /* = "power" */ | ||
| 46 | #else | ||
| 47 | #define power_group_name NULL | ||
| 48 | #endif | ||
| 49 | |||
| 44 | typedef struct pm_message { | 50 | typedef struct pm_message { |
| 45 | int event; | 51 | int event; |
| 46 | } pm_message_t; | 52 | } pm_message_t; |
| @@ -438,6 +444,9 @@ enum rpm_status { | |||
| 438 | * | 444 | * |
| 439 | * RPM_REQ_SUSPEND Run the device bus type's ->runtime_suspend() callback | 445 | * RPM_REQ_SUSPEND Run the device bus type's ->runtime_suspend() callback |
| 440 | * | 446 | * |
| 447 | * RPM_REQ_AUTOSUSPEND Same as RPM_REQ_SUSPEND, but not until the device has | ||
| 448 | * been inactive for as long as power.autosuspend_delay | ||
| 449 | * | ||
| 441 | * RPM_REQ_RESUME Run the device bus type's ->runtime_resume() callback | 450 | * RPM_REQ_RESUME Run the device bus type's ->runtime_resume() callback |
| 442 | */ | 451 | */ |
| 443 | 452 | ||
| @@ -445,25 +454,28 @@ enum rpm_request { | |||
| 445 | RPM_REQ_NONE = 0, | 454 | RPM_REQ_NONE = 0, |
| 446 | RPM_REQ_IDLE, | 455 | RPM_REQ_IDLE, |
| 447 | RPM_REQ_SUSPEND, | 456 | RPM_REQ_SUSPEND, |
| 457 | RPM_REQ_AUTOSUSPEND, | ||
| 448 | RPM_REQ_RESUME, | 458 | RPM_REQ_RESUME, |
| 449 | }; | 459 | }; |
| 450 | 460 | ||
| 461 | struct wakeup_source; | ||
| 462 | |||
| 451 | struct dev_pm_info { | 463 | struct dev_pm_info { |
| 452 | pm_message_t power_state; | 464 | pm_message_t power_state; |
| 453 | unsigned int can_wakeup:1; | 465 | unsigned int can_wakeup:1; |
| 454 | unsigned int should_wakeup:1; | ||
| 455 | unsigned async_suspend:1; | 466 | unsigned async_suspend:1; |
| 456 | enum dpm_state status; /* Owned by the PM core */ | 467 | enum dpm_state status; /* Owned by the PM core */ |
| 468 | spinlock_t lock; | ||
| 457 | #ifdef CONFIG_PM_SLEEP | 469 | #ifdef CONFIG_PM_SLEEP |
| 458 | struct list_head entry; | 470 | struct list_head entry; |
| 459 | struct completion completion; | 471 | struct completion completion; |
| 472 | struct wakeup_source *wakeup; | ||
| 460 | #endif | 473 | #endif |
| 461 | #ifdef CONFIG_PM_RUNTIME | 474 | #ifdef CONFIG_PM_RUNTIME |
| 462 | struct timer_list suspend_timer; | 475 | struct timer_list suspend_timer; |
| 463 | unsigned long timer_expires; | 476 | unsigned long timer_expires; |
| 464 | struct work_struct work; | 477 | struct work_struct work; |
| 465 | wait_queue_head_t wait_queue; | 478 | wait_queue_head_t wait_queue; |
| 466 | spinlock_t lock; | ||
| 467 | atomic_t usage_count; | 479 | atomic_t usage_count; |
| 468 | atomic_t child_count; | 480 | atomic_t child_count; |
| 469 | unsigned int disable_depth:3; | 481 | unsigned int disable_depth:3; |
| @@ -473,12 +485,23 @@ struct dev_pm_info { | |||
| 473 | unsigned int deferred_resume:1; | 485 | unsigned int deferred_resume:1; |
| 474 | unsigned int run_wake:1; | 486 | unsigned int run_wake:1; |
| 475 | unsigned int runtime_auto:1; | 487 | unsigned int runtime_auto:1; |
| 488 | unsigned int no_callbacks:1; | ||
| 489 | unsigned int use_autosuspend:1; | ||
| 490 | unsigned int timer_autosuspends:1; | ||
| 476 | enum rpm_request request; | 491 | enum rpm_request request; |
| 477 | enum rpm_status runtime_status; | 492 | enum rpm_status runtime_status; |
| 478 | int runtime_error; | 493 | int runtime_error; |
| 494 | int autosuspend_delay; | ||
| 495 | unsigned long last_busy; | ||
| 496 | unsigned long active_jiffies; | ||
| 497 | unsigned long suspended_jiffies; | ||
| 498 | unsigned long accounting_timestamp; | ||
| 479 | #endif | 499 | #endif |
| 480 | }; | 500 | }; |
| 481 | 501 | ||
| 502 | extern void update_pm_runtime_accounting(struct device *dev); | ||
| 503 | |||
| 504 | |||
| 482 | /* | 505 | /* |
| 483 | * The PM_EVENT_ messages are also used by drivers implementing the legacy | 506 | * The PM_EVENT_ messages are also used by drivers implementing the legacy |
| 484 | * suspend framework, based on the ->suspend() and ->resume() callbacks common | 507 | * suspend framework, based on the ->suspend() and ->resume() callbacks common |
| @@ -551,7 +574,7 @@ extern void __suspend_report_result(const char *function, void *fn, int ret); | |||
| 551 | __suspend_report_result(__func__, fn, ret); \ | 574 | __suspend_report_result(__func__, fn, ret); \ |
| 552 | } while (0) | 575 | } while (0) |
| 553 | 576 | ||
| 554 | extern void device_pm_wait_for_dev(struct device *sub, struct device *dev); | 577 | extern int device_pm_wait_for_dev(struct device *sub, struct device *dev); |
| 555 | #else /* !CONFIG_PM_SLEEP */ | 578 | #else /* !CONFIG_PM_SLEEP */ |
| 556 | 579 | ||
| 557 | #define device_pm_lock() do {} while (0) | 580 | #define device_pm_lock() do {} while (0) |
| @@ -564,7 +587,10 @@ static inline int dpm_suspend_start(pm_message_t state) | |||
| 564 | 587 | ||
| 565 | #define suspend_report_result(fn, ret) do {} while (0) | 588 | #define suspend_report_result(fn, ret) do {} while (0) |
| 566 | 589 | ||
| 567 | static inline void device_pm_wait_for_dev(struct device *a, struct device *b) {} | 590 | static inline int device_pm_wait_for_dev(struct device *a, struct device *b) |
| 591 | { | ||
| 592 | return 0; | ||
| 593 | } | ||
| 568 | #endif /* !CONFIG_PM_SLEEP */ | 594 | #endif /* !CONFIG_PM_SLEEP */ |
| 569 | 595 | ||
| 570 | /* How to reorder dpm_list after device_move() */ | 596 | /* How to reorder dpm_list after device_move() */ |
diff --git a/include/linux/pm_qos_params.h b/include/linux/pm_qos_params.h index 8ba440e5eb7f..77cbddb3784c 100644 --- a/include/linux/pm_qos_params.h +++ b/include/linux/pm_qos_params.h | |||
| @@ -1,8 +1,10 @@ | |||
| 1 | #ifndef _LINUX_PM_QOS_PARAMS_H | ||
| 2 | #define _LINUX_PM_QOS_PARAMS_H | ||
| 1 | /* interface for the pm_qos_power infrastructure of the linux kernel. | 3 | /* interface for the pm_qos_power infrastructure of the linux kernel. |
| 2 | * | 4 | * |
| 3 | * Mark Gross <mgross@linux.intel.com> | 5 | * Mark Gross <mgross@linux.intel.com> |
| 4 | */ | 6 | */ |
| 5 | #include <linux/list.h> | 7 | #include <linux/plist.h> |
| 6 | #include <linux/notifier.h> | 8 | #include <linux/notifier.h> |
| 7 | #include <linux/miscdevice.h> | 9 | #include <linux/miscdevice.h> |
| 8 | 10 | ||
| @@ -14,9 +16,12 @@ | |||
| 14 | #define PM_QOS_NUM_CLASSES 4 | 16 | #define PM_QOS_NUM_CLASSES 4 |
| 15 | #define PM_QOS_DEFAULT_VALUE -1 | 17 | #define PM_QOS_DEFAULT_VALUE -1 |
| 16 | 18 | ||
| 17 | struct pm_qos_request_list; | 19 | struct pm_qos_request_list { |
| 20 | struct plist_node list; | ||
| 21 | int pm_qos_class; | ||
| 22 | }; | ||
| 18 | 23 | ||
| 19 | struct pm_qos_request_list *pm_qos_add_request(int pm_qos_class, s32 value); | 24 | void pm_qos_add_request(struct pm_qos_request_list *l, int pm_qos_class, s32 value); |
| 20 | void pm_qos_update_request(struct pm_qos_request_list *pm_qos_req, | 25 | void pm_qos_update_request(struct pm_qos_request_list *pm_qos_req, |
| 21 | s32 new_value); | 26 | s32 new_value); |
| 22 | void pm_qos_remove_request(struct pm_qos_request_list *pm_qos_req); | 27 | void pm_qos_remove_request(struct pm_qos_request_list *pm_qos_req); |
| @@ -24,4 +29,6 @@ void pm_qos_remove_request(struct pm_qos_request_list *pm_qos_req); | |||
| 24 | int pm_qos_request(int pm_qos_class); | 29 | int pm_qos_request(int pm_qos_class); |
| 25 | int pm_qos_add_notifier(int pm_qos_class, struct notifier_block *notifier); | 30 | int pm_qos_add_notifier(int pm_qos_class, struct notifier_block *notifier); |
| 26 | int pm_qos_remove_notifier(int pm_qos_class, struct notifier_block *notifier); | 31 | int pm_qos_remove_notifier(int pm_qos_class, struct notifier_block *notifier); |
| 32 | int pm_qos_request_active(struct pm_qos_request_list *req); | ||
| 27 | 33 | ||
| 34 | #endif | ||
diff --git a/include/linux/pm_runtime.h b/include/linux/pm_runtime.h index 6e81888c6222..3ec2358f8692 100644 --- a/include/linux/pm_runtime.h +++ b/include/linux/pm_runtime.h | |||
| @@ -12,18 +12,24 @@ | |||
| 12 | #include <linux/device.h> | 12 | #include <linux/device.h> |
| 13 | #include <linux/pm.h> | 13 | #include <linux/pm.h> |
| 14 | 14 | ||
| 15 | #include <linux/jiffies.h> | ||
| 16 | |||
| 17 | /* Runtime PM flag argument bits */ | ||
| 18 | #define RPM_ASYNC 0x01 /* Request is asynchronous */ | ||
| 19 | #define RPM_NOWAIT 0x02 /* Don't wait for concurrent | ||
| 20 | state change */ | ||
| 21 | #define RPM_GET_PUT 0x04 /* Increment/decrement the | ||
| 22 | usage_count */ | ||
| 23 | #define RPM_AUTO 0x08 /* Use autosuspend_delay */ | ||
| 24 | |||
| 15 | #ifdef CONFIG_PM_RUNTIME | 25 | #ifdef CONFIG_PM_RUNTIME |
| 16 | 26 | ||
| 17 | extern struct workqueue_struct *pm_wq; | 27 | extern struct workqueue_struct *pm_wq; |
| 18 | 28 | ||
| 19 | extern int pm_runtime_idle(struct device *dev); | 29 | extern int __pm_runtime_idle(struct device *dev, int rpmflags); |
| 20 | extern int pm_runtime_suspend(struct device *dev); | 30 | extern int __pm_runtime_suspend(struct device *dev, int rpmflags); |
| 21 | extern int pm_runtime_resume(struct device *dev); | 31 | extern int __pm_runtime_resume(struct device *dev, int rpmflags); |
| 22 | extern int pm_request_idle(struct device *dev); | ||
| 23 | extern int pm_schedule_suspend(struct device *dev, unsigned int delay); | 32 | extern int pm_schedule_suspend(struct device *dev, unsigned int delay); |
| 24 | extern int pm_request_resume(struct device *dev); | ||
| 25 | extern int __pm_runtime_get(struct device *dev, bool sync); | ||
| 26 | extern int __pm_runtime_put(struct device *dev, bool sync); | ||
| 27 | extern int __pm_runtime_set_status(struct device *dev, unsigned int status); | 33 | extern int __pm_runtime_set_status(struct device *dev, unsigned int status); |
| 28 | extern int pm_runtime_barrier(struct device *dev); | 34 | extern int pm_runtime_barrier(struct device *dev); |
| 29 | extern void pm_runtime_enable(struct device *dev); | 35 | extern void pm_runtime_enable(struct device *dev); |
| @@ -33,6 +39,10 @@ extern void pm_runtime_forbid(struct device *dev); | |||
| 33 | extern int pm_generic_runtime_idle(struct device *dev); | 39 | extern int pm_generic_runtime_idle(struct device *dev); |
| 34 | extern int pm_generic_runtime_suspend(struct device *dev); | 40 | extern int pm_generic_runtime_suspend(struct device *dev); |
| 35 | extern int pm_generic_runtime_resume(struct device *dev); | 41 | extern int pm_generic_runtime_resume(struct device *dev); |
| 42 | extern void pm_runtime_no_callbacks(struct device *dev); | ||
| 43 | extern void __pm_runtime_use_autosuspend(struct device *dev, bool use); | ||
| 44 | extern void pm_runtime_set_autosuspend_delay(struct device *dev, int delay); | ||
| 45 | extern unsigned long pm_runtime_autosuspend_expiration(struct device *dev); | ||
| 36 | 46 | ||
| 37 | static inline bool pm_children_suspended(struct device *dev) | 47 | static inline bool pm_children_suspended(struct device *dev) |
| 38 | { | 48 | { |
| @@ -70,19 +80,29 @@ static inline bool pm_runtime_suspended(struct device *dev) | |||
| 70 | return dev->power.runtime_status == RPM_SUSPENDED; | 80 | return dev->power.runtime_status == RPM_SUSPENDED; |
| 71 | } | 81 | } |
| 72 | 82 | ||
| 83 | static inline void pm_runtime_mark_last_busy(struct device *dev) | ||
| 84 | { | ||
| 85 | ACCESS_ONCE(dev->power.last_busy) = jiffies; | ||
| 86 | } | ||
| 87 | |||
| 73 | #else /* !CONFIG_PM_RUNTIME */ | 88 | #else /* !CONFIG_PM_RUNTIME */ |
| 74 | 89 | ||
| 75 | static inline int pm_runtime_idle(struct device *dev) { return -ENOSYS; } | 90 | static inline int __pm_runtime_idle(struct device *dev, int rpmflags) |
| 76 | static inline int pm_runtime_suspend(struct device *dev) { return -ENOSYS; } | 91 | { |
| 77 | static inline int pm_runtime_resume(struct device *dev) { return 0; } | 92 | return -ENOSYS; |
| 78 | static inline int pm_request_idle(struct device *dev) { return -ENOSYS; } | 93 | } |
| 94 | static inline int __pm_runtime_suspend(struct device *dev, int rpmflags) | ||
| 95 | { | ||
| 96 | return -ENOSYS; | ||
| 97 | } | ||
| 98 | static inline int __pm_runtime_resume(struct device *dev, int rpmflags) | ||
| 99 | { | ||
| 100 | return 1; | ||
| 101 | } | ||
| 79 | static inline int pm_schedule_suspend(struct device *dev, unsigned int delay) | 102 | static inline int pm_schedule_suspend(struct device *dev, unsigned int delay) |
| 80 | { | 103 | { |
| 81 | return -ENOSYS; | 104 | return -ENOSYS; |
| 82 | } | 105 | } |
| 83 | static inline int pm_request_resume(struct device *dev) { return 0; } | ||
| 84 | static inline int __pm_runtime_get(struct device *dev, bool sync) { return 1; } | ||
| 85 | static inline int __pm_runtime_put(struct device *dev, bool sync) { return 0; } | ||
| 86 | static inline int __pm_runtime_set_status(struct device *dev, | 106 | static inline int __pm_runtime_set_status(struct device *dev, |
| 87 | unsigned int status) { return 0; } | 107 | unsigned int status) { return 0; } |
| 88 | static inline int pm_runtime_barrier(struct device *dev) { return 0; } | 108 | static inline int pm_runtime_barrier(struct device *dev) { return 0; } |
| @@ -102,27 +122,82 @@ static inline bool pm_runtime_suspended(struct device *dev) { return false; } | |||
| 102 | static inline int pm_generic_runtime_idle(struct device *dev) { return 0; } | 122 | static inline int pm_generic_runtime_idle(struct device *dev) { return 0; } |
| 103 | static inline int pm_generic_runtime_suspend(struct device *dev) { return 0; } | 123 | static inline int pm_generic_runtime_suspend(struct device *dev) { return 0; } |
| 104 | static inline int pm_generic_runtime_resume(struct device *dev) { return 0; } | 124 | static inline int pm_generic_runtime_resume(struct device *dev) { return 0; } |
| 125 | static inline void pm_runtime_no_callbacks(struct device *dev) {} | ||
| 126 | |||
| 127 | static inline void pm_runtime_mark_last_busy(struct device *dev) {} | ||
| 128 | static inline void __pm_runtime_use_autosuspend(struct device *dev, | ||
| 129 | bool use) {} | ||
| 130 | static inline void pm_runtime_set_autosuspend_delay(struct device *dev, | ||
| 131 | int delay) {} | ||
| 132 | static inline unsigned long pm_runtime_autosuspend_expiration( | ||
| 133 | struct device *dev) { return 0; } | ||
| 105 | 134 | ||
| 106 | #endif /* !CONFIG_PM_RUNTIME */ | 135 | #endif /* !CONFIG_PM_RUNTIME */ |
| 107 | 136 | ||
| 137 | static inline int pm_runtime_idle(struct device *dev) | ||
| 138 | { | ||
| 139 | return __pm_runtime_idle(dev, 0); | ||
| 140 | } | ||
| 141 | |||
| 142 | static inline int pm_runtime_suspend(struct device *dev) | ||
| 143 | { | ||
| 144 | return __pm_runtime_suspend(dev, 0); | ||
| 145 | } | ||
| 146 | |||
| 147 | static inline int pm_runtime_autosuspend(struct device *dev) | ||
| 148 | { | ||
| 149 | return __pm_runtime_suspend(dev, RPM_AUTO); | ||
| 150 | } | ||
| 151 | |||
| 152 | static inline int pm_runtime_resume(struct device *dev) | ||
| 153 | { | ||
| 154 | return __pm_runtime_resume(dev, 0); | ||
| 155 | } | ||
| 156 | |||
| 157 | static inline int pm_request_idle(struct device *dev) | ||
| 158 | { | ||
| 159 | return __pm_runtime_idle(dev, RPM_ASYNC); | ||
| 160 | } | ||
| 161 | |||
| 162 | static inline int pm_request_resume(struct device *dev) | ||
| 163 | { | ||
| 164 | return __pm_runtime_resume(dev, RPM_ASYNC); | ||
| 165 | } | ||
| 166 | |||
| 167 | static inline int pm_request_autosuspend(struct device *dev) | ||
| 168 | { | ||
| 169 | return __pm_runtime_suspend(dev, RPM_ASYNC | RPM_AUTO); | ||
| 170 | } | ||
| 171 | |||
| 108 | static inline int pm_runtime_get(struct device *dev) | 172 | static inline int pm_runtime_get(struct device *dev) |
| 109 | { | 173 | { |
| 110 | return __pm_runtime_get(dev, false); | 174 | return __pm_runtime_resume(dev, RPM_GET_PUT | RPM_ASYNC); |
| 111 | } | 175 | } |
| 112 | 176 | ||
| 113 | static inline int pm_runtime_get_sync(struct device *dev) | 177 | static inline int pm_runtime_get_sync(struct device *dev) |
| 114 | { | 178 | { |
| 115 | return __pm_runtime_get(dev, true); | 179 | return __pm_runtime_resume(dev, RPM_GET_PUT); |
| 116 | } | 180 | } |
| 117 | 181 | ||
| 118 | static inline int pm_runtime_put(struct device *dev) | 182 | static inline int pm_runtime_put(struct device *dev) |
| 119 | { | 183 | { |
| 120 | return __pm_runtime_put(dev, false); | 184 | return __pm_runtime_idle(dev, RPM_GET_PUT | RPM_ASYNC); |
| 185 | } | ||
| 186 | |||
| 187 | static inline int pm_runtime_put_autosuspend(struct device *dev) | ||
| 188 | { | ||
| 189 | return __pm_runtime_suspend(dev, | ||
| 190 | RPM_GET_PUT | RPM_ASYNC | RPM_AUTO); | ||
| 121 | } | 191 | } |
| 122 | 192 | ||
| 123 | static inline int pm_runtime_put_sync(struct device *dev) | 193 | static inline int pm_runtime_put_sync(struct device *dev) |
| 124 | { | 194 | { |
| 125 | return __pm_runtime_put(dev, true); | 195 | return __pm_runtime_idle(dev, RPM_GET_PUT); |
| 196 | } | ||
| 197 | |||
| 198 | static inline int pm_runtime_put_sync_autosuspend(struct device *dev) | ||
| 199 | { | ||
| 200 | return __pm_runtime_suspend(dev, RPM_GET_PUT | RPM_AUTO); | ||
| 126 | } | 201 | } |
| 127 | 202 | ||
| 128 | static inline int pm_runtime_set_active(struct device *dev) | 203 | static inline int pm_runtime_set_active(struct device *dev) |
| @@ -140,4 +215,14 @@ static inline void pm_runtime_disable(struct device *dev) | |||
| 140 | __pm_runtime_disable(dev, true); | 215 | __pm_runtime_disable(dev, true); |
| 141 | } | 216 | } |
| 142 | 217 | ||
| 218 | static inline void pm_runtime_use_autosuspend(struct device *dev) | ||
| 219 | { | ||
| 220 | __pm_runtime_use_autosuspend(dev, true); | ||
| 221 | } | ||
| 222 | |||
| 223 | static inline void pm_runtime_dont_use_autosuspend(struct device *dev) | ||
| 224 | { | ||
| 225 | __pm_runtime_use_autosuspend(dev, false); | ||
| 226 | } | ||
| 227 | |||
| 143 | #endif | 228 | #endif |
diff --git a/include/linux/pm_wakeup.h b/include/linux/pm_wakeup.h index 22d64c18056c..9cff00dd6b63 100644 --- a/include/linux/pm_wakeup.h +++ b/include/linux/pm_wakeup.h | |||
| @@ -2,6 +2,7 @@ | |||
| 2 | * pm_wakeup.h - Power management wakeup interface | 2 | * pm_wakeup.h - Power management wakeup interface |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2008 Alan Stern | 4 | * Copyright (C) 2008 Alan Stern |
| 5 | * Copyright (C) 2010 Rafael J. Wysocki, Novell Inc. | ||
| 5 | * | 6 | * |
| 6 | * This program is free software; you can redistribute it and/or modify | 7 | * This program is free software; you can redistribute it and/or modify |
| 7 | * it under the terms of the GNU General Public License as published by | 8 | * it under the terms of the GNU General Public License as published by |
| @@ -27,16 +28,77 @@ | |||
| 27 | 28 | ||
| 28 | #include <linux/types.h> | 29 | #include <linux/types.h> |
| 29 | 30 | ||
| 30 | #ifdef CONFIG_PM | 31 | /** |
| 32 | * struct wakeup_source - Representation of wakeup sources | ||
| 33 | * | ||
| 34 | * @total_time: Total time this wakeup source has been active. | ||
| 35 | * @max_time: Maximum time this wakeup source has been continuously active. | ||
| 36 | * @last_time: Monotonic clock when the wakeup source's was activated last time. | ||
| 37 | * @event_count: Number of signaled wakeup events. | ||
| 38 | * @active_count: Number of times the wakeup sorce was activated. | ||
| 39 | * @relax_count: Number of times the wakeup sorce was deactivated. | ||
| 40 | * @hit_count: Number of times the wakeup sorce might abort system suspend. | ||
| 41 | * @active: Status of the wakeup source. | ||
| 42 | */ | ||
| 43 | struct wakeup_source { | ||
| 44 | char *name; | ||
| 45 | struct list_head entry; | ||
| 46 | spinlock_t lock; | ||
| 47 | struct timer_list timer; | ||
| 48 | unsigned long timer_expires; | ||
| 49 | ktime_t total_time; | ||
| 50 | ktime_t max_time; | ||
| 51 | ktime_t last_time; | ||
| 52 | unsigned long event_count; | ||
| 53 | unsigned long active_count; | ||
| 54 | unsigned long relax_count; | ||
| 55 | unsigned long hit_count; | ||
| 56 | unsigned int active:1; | ||
| 57 | }; | ||
| 58 | |||
| 59 | #ifdef CONFIG_PM_SLEEP | ||
| 31 | 60 | ||
| 32 | /* changes to device_may_wakeup take effect on the next pm state change. | 61 | /* |
| 33 | * by default, devices should wakeup if they can. | 62 | * Changes to device_may_wakeup take effect on the next pm state change. |
| 34 | */ | 63 | */ |
| 35 | static inline void device_init_wakeup(struct device *dev, bool val) | 64 | |
| 65 | static inline void device_set_wakeup_capable(struct device *dev, bool capable) | ||
| 36 | { | 66 | { |
| 37 | dev->power.can_wakeup = dev->power.should_wakeup = val; | 67 | dev->power.can_wakeup = capable; |
| 38 | } | 68 | } |
| 39 | 69 | ||
| 70 | static inline bool device_can_wakeup(struct device *dev) | ||
| 71 | { | ||
| 72 | return dev->power.can_wakeup; | ||
| 73 | } | ||
| 74 | |||
| 75 | |||
| 76 | |||
| 77 | static inline bool device_may_wakeup(struct device *dev) | ||
| 78 | { | ||
| 79 | return dev->power.can_wakeup && !!dev->power.wakeup; | ||
| 80 | } | ||
| 81 | |||
| 82 | /* drivers/base/power/wakeup.c */ | ||
| 83 | extern struct wakeup_source *wakeup_source_create(const char *name); | ||
| 84 | extern void wakeup_source_destroy(struct wakeup_source *ws); | ||
| 85 | extern void wakeup_source_add(struct wakeup_source *ws); | ||
| 86 | extern void wakeup_source_remove(struct wakeup_source *ws); | ||
| 87 | extern struct wakeup_source *wakeup_source_register(const char *name); | ||
| 88 | extern void wakeup_source_unregister(struct wakeup_source *ws); | ||
| 89 | extern int device_wakeup_enable(struct device *dev); | ||
| 90 | extern int device_wakeup_disable(struct device *dev); | ||
| 91 | extern int device_init_wakeup(struct device *dev, bool val); | ||
| 92 | extern int device_set_wakeup_enable(struct device *dev, bool enable); | ||
| 93 | extern void __pm_stay_awake(struct wakeup_source *ws); | ||
| 94 | extern void pm_stay_awake(struct device *dev); | ||
| 95 | extern void __pm_relax(struct wakeup_source *ws); | ||
| 96 | extern void pm_relax(struct device *dev); | ||
| 97 | extern void __pm_wakeup_event(struct wakeup_source *ws, unsigned int msec); | ||
| 98 | extern void pm_wakeup_event(struct device *dev, unsigned int msec); | ||
| 99 | |||
| 100 | #else /* !CONFIG_PM_SLEEP */ | ||
| 101 | |||
| 40 | static inline void device_set_wakeup_capable(struct device *dev, bool capable) | 102 | static inline void device_set_wakeup_capable(struct device *dev, bool capable) |
| 41 | { | 103 | { |
| 42 | dev->power.can_wakeup = capable; | 104 | dev->power.can_wakeup = capable; |
| @@ -47,42 +109,63 @@ static inline bool device_can_wakeup(struct device *dev) | |||
| 47 | return dev->power.can_wakeup; | 109 | return dev->power.can_wakeup; |
| 48 | } | 110 | } |
| 49 | 111 | ||
| 50 | static inline void device_set_wakeup_enable(struct device *dev, bool enable) | 112 | static inline bool device_may_wakeup(struct device *dev) |
| 51 | { | 113 | { |
| 52 | dev->power.should_wakeup = enable; | 114 | return false; |
| 53 | } | 115 | } |
| 54 | 116 | ||
| 55 | static inline bool device_may_wakeup(struct device *dev) | 117 | static inline struct wakeup_source *wakeup_source_create(const char *name) |
| 56 | { | 118 | { |
| 57 | return dev->power.can_wakeup && dev->power.should_wakeup; | 119 | return NULL; |
| 58 | } | 120 | } |
| 59 | 121 | ||
| 60 | #else /* !CONFIG_PM */ | 122 | static inline void wakeup_source_destroy(struct wakeup_source *ws) {} |
| 123 | |||
| 124 | static inline void wakeup_source_add(struct wakeup_source *ws) {} | ||
| 61 | 125 | ||
| 62 | /* For some reason the next two routines work even without CONFIG_PM */ | 126 | static inline void wakeup_source_remove(struct wakeup_source *ws) {} |
| 63 | static inline void device_init_wakeup(struct device *dev, bool val) | 127 | |
| 128 | static inline struct wakeup_source *wakeup_source_register(const char *name) | ||
| 64 | { | 129 | { |
| 65 | dev->power.can_wakeup = val; | 130 | return NULL; |
| 66 | } | 131 | } |
| 67 | 132 | ||
| 68 | static inline void device_set_wakeup_capable(struct device *dev, bool capable) | 133 | static inline void wakeup_source_unregister(struct wakeup_source *ws) {} |
| 134 | |||
| 135 | static inline int device_wakeup_enable(struct device *dev) | ||
| 69 | { | 136 | { |
| 137 | return -EINVAL; | ||
| 70 | } | 138 | } |
| 71 | 139 | ||
| 72 | static inline bool device_can_wakeup(struct device *dev) | 140 | static inline int device_wakeup_disable(struct device *dev) |
| 73 | { | 141 | { |
| 74 | return dev->power.can_wakeup; | 142 | return 0; |
| 75 | } | 143 | } |
| 76 | 144 | ||
| 77 | static inline void device_set_wakeup_enable(struct device *dev, bool enable) | 145 | static inline int device_init_wakeup(struct device *dev, bool val) |
| 78 | { | 146 | { |
| 147 | dev->power.can_wakeup = val; | ||
| 148 | return val ? -EINVAL : 0; | ||
| 79 | } | 149 | } |
| 80 | 150 | ||
| 81 | static inline bool device_may_wakeup(struct device *dev) | 151 | |
| 152 | static inline int device_set_wakeup_enable(struct device *dev, bool enable) | ||
| 82 | { | 153 | { |
| 83 | return false; | 154 | return -EINVAL; |
| 84 | } | 155 | } |
| 85 | 156 | ||
| 86 | #endif /* !CONFIG_PM */ | 157 | static inline void __pm_stay_awake(struct wakeup_source *ws) {} |
| 158 | |||
| 159 | static inline void pm_stay_awake(struct device *dev) {} | ||
| 160 | |||
| 161 | static inline void __pm_relax(struct wakeup_source *ws) {} | ||
| 162 | |||
| 163 | static inline void pm_relax(struct device *dev) {} | ||
| 164 | |||
| 165 | static inline void __pm_wakeup_event(struct wakeup_source *ws, unsigned int msec) {} | ||
| 166 | |||
| 167 | static inline void pm_wakeup_event(struct device *dev, unsigned int msec) {} | ||
| 168 | |||
| 169 | #endif /* !CONFIG_PM_SLEEP */ | ||
| 87 | 170 | ||
| 88 | #endif /* _LINUX_PM_WAKEUP_H */ | 171 | #endif /* _LINUX_PM_WAKEUP_H */ |
diff --git a/include/linux/pnp.h b/include/linux/pnp.h index 7c4193eb0072..1bc1338b817b 100644 --- a/include/linux/pnp.h +++ b/include/linux/pnp.h | |||
| @@ -414,6 +414,7 @@ struct pnp_protocol { | |||
| 414 | int (*disable) (struct pnp_dev *dev); | 414 | int (*disable) (struct pnp_dev *dev); |
| 415 | 415 | ||
| 416 | /* protocol specific suspend/resume */ | 416 | /* protocol specific suspend/resume */ |
| 417 | bool (*can_wakeup) (struct pnp_dev *dev); | ||
| 417 | int (*suspend) (struct pnp_dev * dev, pm_message_t state); | 418 | int (*suspend) (struct pnp_dev * dev, pm_message_t state); |
| 418 | int (*resume) (struct pnp_dev * dev); | 419 | int (*resume) (struct pnp_dev * dev); |
| 419 | 420 | ||
diff --git a/include/linux/poison.h b/include/linux/poison.h index 34066ffd893d..2110a81c5e2a 100644 --- a/include/linux/poison.h +++ b/include/linux/poison.h | |||
| @@ -48,15 +48,6 @@ | |||
| 48 | #define POISON_FREE 0x6b /* for use-after-free poisoning */ | 48 | #define POISON_FREE 0x6b /* for use-after-free poisoning */ |
| 49 | #define POISON_END 0xa5 /* end-byte of poisoning */ | 49 | #define POISON_END 0xa5 /* end-byte of poisoning */ |
| 50 | 50 | ||
| 51 | /********** mm/hugetlb.c **********/ | ||
| 52 | /* | ||
| 53 | * Private mappings of hugetlb pages use this poisoned value for | ||
| 54 | * page->mapping. The core VM should not be doing anything with this mapping | ||
| 55 | * but futex requires the existence of some page->mapping value even though it | ||
| 56 | * is unused if PAGE_MAPPING_ANON is set. | ||
| 57 | */ | ||
| 58 | #define HUGETLB_POISON ((void *)(0x00300300 + POISON_POINTER_DELTA + PAGE_MAPPING_ANON)) | ||
| 59 | |||
| 60 | /********** arch/$ARCH/mm/init.c **********/ | 51 | /********** arch/$ARCH/mm/init.c **********/ |
| 61 | #define POISON_FREE_INITMEM 0xcc | 52 | #define POISON_FREE_INITMEM 0xcc |
| 62 | 53 | ||
diff --git a/include/linux/poll.h b/include/linux/poll.h index 600cc1fde64d..56e76af78102 100644 --- a/include/linux/poll.h +++ b/include/linux/poll.h | |||
| @@ -73,6 +73,8 @@ extern void poll_initwait(struct poll_wqueues *pwq); | |||
| 73 | extern void poll_freewait(struct poll_wqueues *pwq); | 73 | extern void poll_freewait(struct poll_wqueues *pwq); |
| 74 | extern int poll_schedule_timeout(struct poll_wqueues *pwq, int state, | 74 | extern int poll_schedule_timeout(struct poll_wqueues *pwq, int state, |
| 75 | ktime_t *expires, unsigned long slack); | 75 | ktime_t *expires, unsigned long slack); |
| 76 | extern long select_estimate_accuracy(struct timespec *tv); | ||
| 77 | |||
| 76 | 78 | ||
| 77 | static inline int poll_schedule(struct poll_wqueues *pwq, int state) | 79 | static inline int poll_schedule(struct poll_wqueues *pwq, int state) |
| 78 | { | 80 | { |
diff --git a/include/linux/posix-timers.h b/include/linux/posix-timers.h index 4f71bf4e628c..3e23844a6990 100644 --- a/include/linux/posix-timers.h +++ b/include/linux/posix-timers.h | |||
| @@ -117,6 +117,6 @@ void set_process_cpu_timer(struct task_struct *task, unsigned int clock_idx, | |||
| 117 | 117 | ||
| 118 | long clock_nanosleep_restart(struct restart_block *restart_block); | 118 | long clock_nanosleep_restart(struct restart_block *restart_block); |
| 119 | 119 | ||
| 120 | void update_rlimit_cpu(unsigned long rlim_new); | 120 | void update_rlimit_cpu(struct task_struct *task, unsigned long rlim_new); |
| 121 | 121 | ||
| 122 | #endif | 122 | #endif |
diff --git a/include/linux/power/jz4740-battery.h b/include/linux/power/jz4740-battery.h new file mode 100644 index 000000000000..19c9610c720a --- /dev/null +++ b/include/linux/power/jz4740-battery.h | |||
| @@ -0,0 +1,24 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2009, Jiejing Zhang <kzjeef@gmail.com> | ||
| 3 | * | ||
| 4 | * This program is free software; you can redistribute it and/or modify it | ||
| 5 | * under the terms of the GNU General Public License as published by the | ||
| 6 | * Free Software Foundation; either version 2 of the License, or (at your | ||
| 7 | * option) any later version. | ||
| 8 | * | ||
| 9 | * You should have received a copy of the GNU General Public License along | ||
| 10 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
| 11 | * 675 Mass Ave, Cambridge, MA 02139, USA. | ||
| 12 | * | ||
| 13 | */ | ||
| 14 | |||
| 15 | #ifndef __JZ4740_BATTERY_H | ||
| 16 | #define __JZ4740_BATTERY_H | ||
| 17 | |||
| 18 | struct jz_battery_platform_data { | ||
| 19 | struct power_supply_info info; | ||
| 20 | int gpio_charge; /* GPIO port of Charger state */ | ||
| 21 | int gpio_charge_active_low; | ||
| 22 | }; | ||
| 23 | |||
| 24 | #endif | ||
diff --git a/include/linux/power_supply.h b/include/linux/power_supply.h index 30083a896f36..7d7325685c42 100644 --- a/include/linux/power_supply.h +++ b/include/linux/power_supply.h | |||
| @@ -89,6 +89,7 @@ enum power_supply_property { | |||
| 89 | POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN, | 89 | POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN, |
| 90 | POWER_SUPPLY_PROP_VOLTAGE_NOW, | 90 | POWER_SUPPLY_PROP_VOLTAGE_NOW, |
| 91 | POWER_SUPPLY_PROP_VOLTAGE_AVG, | 91 | POWER_SUPPLY_PROP_VOLTAGE_AVG, |
| 92 | POWER_SUPPLY_PROP_CURRENT_MAX, | ||
| 92 | POWER_SUPPLY_PROP_CURRENT_NOW, | 93 | POWER_SUPPLY_PROP_CURRENT_NOW, |
| 93 | POWER_SUPPLY_PROP_CURRENT_AVG, | 94 | POWER_SUPPLY_PROP_CURRENT_AVG, |
| 94 | POWER_SUPPLY_PROP_POWER_NOW, | 95 | POWER_SUPPLY_PROP_POWER_NOW, |
| @@ -125,7 +126,10 @@ enum power_supply_type { | |||
| 125 | POWER_SUPPLY_TYPE_BATTERY = 0, | 126 | POWER_SUPPLY_TYPE_BATTERY = 0, |
| 126 | POWER_SUPPLY_TYPE_UPS, | 127 | POWER_SUPPLY_TYPE_UPS, |
| 127 | POWER_SUPPLY_TYPE_MAINS, | 128 | POWER_SUPPLY_TYPE_MAINS, |
| 128 | POWER_SUPPLY_TYPE_USB, | 129 | POWER_SUPPLY_TYPE_USB, /* Standard Downstream Port */ |
| 130 | POWER_SUPPLY_TYPE_USB_DCP, /* Dedicated Charging Port */ | ||
| 131 | POWER_SUPPLY_TYPE_USB_CDP, /* Charging Downstream Port */ | ||
| 132 | POWER_SUPPLY_TYPE_USB_ACA, /* Accessory Charger Adapters */ | ||
| 129 | }; | 133 | }; |
| 130 | 134 | ||
| 131 | union power_supply_propval { | 135 | union power_supply_propval { |
diff --git a/include/linux/ppp_channel.h b/include/linux/ppp_channel.h index bff98ec1bfed..5d87f810a3b7 100644 --- a/include/linux/ppp_channel.h +++ b/include/linux/ppp_channel.h | |||
| @@ -36,7 +36,7 @@ struct ppp_channel_ops { | |||
| 36 | 36 | ||
| 37 | struct ppp_channel { | 37 | struct ppp_channel { |
| 38 | void *private; /* channel private data */ | 38 | void *private; /* channel private data */ |
| 39 | struct ppp_channel_ops *ops; /* operations for this channel */ | 39 | const struct ppp_channel_ops *ops; /* operations for this channel */ |
| 40 | int mtu; /* max transmit packet size */ | 40 | int mtu; /* max transmit packet size */ |
| 41 | int hdrlen; /* amount of headroom channel needs */ | 41 | int hdrlen; /* amount of headroom channel needs */ |
| 42 | void *ppp; /* opaque to channel */ | 42 | void *ppp; /* opaque to channel */ |
diff --git a/include/linux/ptp_classify.h b/include/linux/ptp_classify.h new file mode 100644 index 000000000000..943a85ab0020 --- /dev/null +++ b/include/linux/ptp_classify.h | |||
| @@ -0,0 +1,126 @@ | |||
| 1 | /* | ||
| 2 | * PTP 1588 support | ||
| 3 | * | ||
| 4 | * This file implements a BPF that recognizes PTP event messages. | ||
| 5 | * | ||
| 6 | * Copyright (C) 2010 OMICRON electronics GmbH | ||
| 7 | * | ||
| 8 | * This program is free software; you can redistribute it and/or modify | ||
| 9 | * it under the terms of the GNU General Public License as published by | ||
| 10 | * the Free Software Foundation; either version 2 of the License, or | ||
| 11 | * (at your option) any later version. | ||
| 12 | * | ||
| 13 | * This program is distributed in the hope that it will be useful, | ||
| 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 16 | * GNU General Public License for more details. | ||
| 17 | * | ||
| 18 | * You should have received a copy of the GNU General Public License | ||
| 19 | * along with this program; if not, write to the Free Software | ||
| 20 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
| 21 | */ | ||
| 22 | |||
| 23 | #ifndef _PTP_CLASSIFY_H_ | ||
| 24 | #define _PTP_CLASSIFY_H_ | ||
| 25 | |||
| 26 | #include <linux/if_ether.h> | ||
| 27 | #include <linux/if_vlan.h> | ||
| 28 | #include <linux/filter.h> | ||
| 29 | #ifdef __KERNEL__ | ||
| 30 | #include <linux/in.h> | ||
| 31 | #else | ||
| 32 | #include <netinet/in.h> | ||
| 33 | #endif | ||
| 34 | |||
| 35 | #define PTP_CLASS_NONE 0x00 /* not a PTP event message */ | ||
| 36 | #define PTP_CLASS_V1 0x01 /* protocol version 1 */ | ||
| 37 | #define PTP_CLASS_V2 0x02 /* protocol version 2 */ | ||
| 38 | #define PTP_CLASS_VMASK 0x0f /* max protocol version is 15 */ | ||
| 39 | #define PTP_CLASS_IPV4 0x10 /* event in an IPV4 UDP packet */ | ||
| 40 | #define PTP_CLASS_IPV6 0x20 /* event in an IPV6 UDP packet */ | ||
| 41 | #define PTP_CLASS_L2 0x30 /* event in a L2 packet */ | ||
| 42 | #define PTP_CLASS_VLAN 0x40 /* event in a VLAN tagged L2 packet */ | ||
| 43 | #define PTP_CLASS_PMASK 0xf0 /* mask for the packet type field */ | ||
| 44 | |||
| 45 | #define PTP_CLASS_V1_IPV4 (PTP_CLASS_V1 | PTP_CLASS_IPV4) | ||
| 46 | #define PTP_CLASS_V1_IPV6 (PTP_CLASS_V1 | PTP_CLASS_IPV6) /*probably DNE*/ | ||
| 47 | #define PTP_CLASS_V2_IPV4 (PTP_CLASS_V2 | PTP_CLASS_IPV4) | ||
| 48 | #define PTP_CLASS_V2_IPV6 (PTP_CLASS_V2 | PTP_CLASS_IPV6) | ||
| 49 | #define PTP_CLASS_V2_L2 (PTP_CLASS_V2 | PTP_CLASS_L2) | ||
| 50 | #define PTP_CLASS_V2_VLAN (PTP_CLASS_V2 | PTP_CLASS_VLAN) | ||
| 51 | |||
| 52 | #define PTP_EV_PORT 319 | ||
| 53 | |||
| 54 | #define OFF_ETYPE 12 | ||
| 55 | #define OFF_IHL 14 | ||
| 56 | #define OFF_FRAG 20 | ||
| 57 | #define OFF_PROTO4 23 | ||
| 58 | #define OFF_NEXT 6 | ||
| 59 | #define OFF_UDP_DST 2 | ||
| 60 | |||
| 61 | #define IP6_HLEN 40 | ||
| 62 | #define UDP_HLEN 8 | ||
| 63 | |||
| 64 | #define RELOFF_DST4 (ETH_HLEN + OFF_UDP_DST) | ||
| 65 | #define OFF_DST6 (ETH_HLEN + IP6_HLEN + OFF_UDP_DST) | ||
| 66 | #define OFF_PTP6 (ETH_HLEN + IP6_HLEN + UDP_HLEN) | ||
| 67 | |||
| 68 | #define OP_AND (BPF_ALU | BPF_AND | BPF_K) | ||
| 69 | #define OP_JEQ (BPF_JMP | BPF_JEQ | BPF_K) | ||
| 70 | #define OP_JSET (BPF_JMP | BPF_JSET | BPF_K) | ||
| 71 | #define OP_LDB (BPF_LD | BPF_B | BPF_ABS) | ||
| 72 | #define OP_LDH (BPF_LD | BPF_H | BPF_ABS) | ||
| 73 | #define OP_LDHI (BPF_LD | BPF_H | BPF_IND) | ||
| 74 | #define OP_LDX (BPF_LDX | BPF_B | BPF_MSH) | ||
| 75 | #define OP_OR (BPF_ALU | BPF_OR | BPF_K) | ||
| 76 | #define OP_RETA (BPF_RET | BPF_A) | ||
| 77 | #define OP_RETK (BPF_RET | BPF_K) | ||
| 78 | |||
| 79 | static inline int ptp_filter_init(struct sock_filter *f, int len) | ||
| 80 | { | ||
| 81 | if (OP_LDH == f[0].code) | ||
| 82 | return sk_chk_filter(f, len); | ||
| 83 | else | ||
| 84 | return 0; | ||
| 85 | } | ||
| 86 | |||
| 87 | #define PTP_FILTER \ | ||
| 88 | {OP_LDH, 0, 0, OFF_ETYPE }, /* */ \ | ||
| 89 | {OP_JEQ, 0, 12, ETH_P_IP }, /* f goto L20 */ \ | ||
| 90 | {OP_LDB, 0, 0, OFF_PROTO4 }, /* */ \ | ||
| 91 | {OP_JEQ, 0, 9, IPPROTO_UDP }, /* f goto L10 */ \ | ||
| 92 | {OP_LDH, 0, 0, OFF_FRAG }, /* */ \ | ||
| 93 | {OP_JSET, 7, 0, 0x1fff }, /* t goto L11 */ \ | ||
| 94 | {OP_LDX, 0, 0, OFF_IHL }, /* */ \ | ||
| 95 | {OP_LDHI, 0, 0, RELOFF_DST4 }, /* */ \ | ||
| 96 | {OP_JEQ, 0, 4, PTP_EV_PORT }, /* f goto L12 */ \ | ||
| 97 | {OP_LDHI, 0, 0, ETH_HLEN + UDP_HLEN }, /* */ \ | ||
| 98 | {OP_AND, 0, 0, PTP_CLASS_VMASK }, /* */ \ | ||
| 99 | {OP_OR, 0, 0, PTP_CLASS_IPV4 }, /* */ \ | ||
| 100 | {OP_RETA, 0, 0, 0 }, /* */ \ | ||
| 101 | /*L1x*/ {OP_RETK, 0, 0, PTP_CLASS_NONE }, /* */ \ | ||
| 102 | /*L20*/ {OP_JEQ, 0, 9, ETH_P_IPV6 }, /* f goto L40 */ \ | ||
| 103 | {OP_LDB, 0, 0, ETH_HLEN + OFF_NEXT }, /* */ \ | ||
| 104 | {OP_JEQ, 0, 6, IPPROTO_UDP }, /* f goto L30 */ \ | ||
| 105 | {OP_LDH, 0, 0, OFF_DST6 }, /* */ \ | ||
| 106 | {OP_JEQ, 0, 4, PTP_EV_PORT }, /* f goto L31 */ \ | ||
| 107 | {OP_LDH, 0, 0, OFF_PTP6 }, /* */ \ | ||
| 108 | {OP_AND, 0, 0, PTP_CLASS_VMASK }, /* */ \ | ||
| 109 | {OP_OR, 0, 0, PTP_CLASS_IPV6 }, /* */ \ | ||
| 110 | {OP_RETA, 0, 0, 0 }, /* */ \ | ||
| 111 | /*L3x*/ {OP_RETK, 0, 0, PTP_CLASS_NONE }, /* */ \ | ||
| 112 | /*L40*/ {OP_JEQ, 0, 6, ETH_P_8021Q }, /* f goto L50 */ \ | ||
| 113 | {OP_LDH, 0, 0, OFF_ETYPE + 4 }, /* */ \ | ||
| 114 | {OP_JEQ, 0, 9, ETH_P_1588 }, /* f goto L60 */ \ | ||
| 115 | {OP_LDH, 0, 0, ETH_HLEN + VLAN_HLEN }, /* */ \ | ||
| 116 | {OP_AND, 0, 0, PTP_CLASS_VMASK }, /* */ \ | ||
| 117 | {OP_OR, 0, 0, PTP_CLASS_VLAN }, /* */ \ | ||
| 118 | {OP_RETA, 0, 0, 0 }, /* */ \ | ||
| 119 | /*L50*/ {OP_JEQ, 0, 4, ETH_P_1588 }, /* f goto L61 */ \ | ||
| 120 | {OP_LDH, 0, 0, ETH_HLEN }, /* */ \ | ||
| 121 | {OP_AND, 0, 0, PTP_CLASS_VMASK }, /* */ \ | ||
| 122 | {OP_OR, 0, 0, PTP_CLASS_L2 }, /* */ \ | ||
| 123 | {OP_RETA, 0, 0, 0 }, /* */ \ | ||
| 124 | /*L6x*/ {OP_RETK, 0, 0, PTP_CLASS_NONE }, | ||
| 125 | |||
| 126 | #endif | ||
diff --git a/include/linux/ptrace.h b/include/linux/ptrace.h index 4272521e29e9..092a04f874a8 100644 --- a/include/linux/ptrace.h +++ b/include/linux/ptrace.h | |||
| @@ -100,7 +100,8 @@ | |||
| 100 | #include <linux/sched.h> /* For struct task_struct. */ | 100 | #include <linux/sched.h> /* For struct task_struct. */ |
| 101 | 101 | ||
| 102 | 102 | ||
| 103 | extern long arch_ptrace(struct task_struct *child, long request, long addr, long data); | 103 | extern long arch_ptrace(struct task_struct *child, long request, |
| 104 | unsigned long addr, unsigned long data); | ||
| 104 | extern int ptrace_traceme(void); | 105 | extern int ptrace_traceme(void); |
| 105 | extern int ptrace_readdata(struct task_struct *tsk, unsigned long src, char __user *dst, int len); | 106 | extern int ptrace_readdata(struct task_struct *tsk, unsigned long src, char __user *dst, int len); |
| 106 | extern int ptrace_writedata(struct task_struct *tsk, char __user *src, unsigned long dst, int len); | 107 | extern int ptrace_writedata(struct task_struct *tsk, char __user *src, unsigned long dst, int len); |
| @@ -108,7 +109,8 @@ extern int ptrace_attach(struct task_struct *tsk); | |||
| 108 | extern int ptrace_detach(struct task_struct *, unsigned int); | 109 | extern int ptrace_detach(struct task_struct *, unsigned int); |
| 109 | extern void ptrace_disable(struct task_struct *); | 110 | extern void ptrace_disable(struct task_struct *); |
| 110 | extern int ptrace_check_attach(struct task_struct *task, int kill); | 111 | extern int ptrace_check_attach(struct task_struct *task, int kill); |
| 111 | extern int ptrace_request(struct task_struct *child, long request, long addr, long data); | 112 | extern int ptrace_request(struct task_struct *child, long request, |
| 113 | unsigned long addr, unsigned long data); | ||
| 112 | extern void ptrace_notify(int exit_code); | 114 | extern void ptrace_notify(int exit_code); |
| 113 | extern void __ptrace_link(struct task_struct *child, | 115 | extern void __ptrace_link(struct task_struct *child, |
| 114 | struct task_struct *new_parent); | 116 | struct task_struct *new_parent); |
| @@ -132,8 +134,10 @@ static inline void ptrace_unlink(struct task_struct *child) | |||
| 132 | __ptrace_unlink(child); | 134 | __ptrace_unlink(child); |
| 133 | } | 135 | } |
| 134 | 136 | ||
| 135 | int generic_ptrace_peekdata(struct task_struct *tsk, long addr, long data); | 137 | int generic_ptrace_peekdata(struct task_struct *tsk, unsigned long addr, |
| 136 | int generic_ptrace_pokedata(struct task_struct *tsk, long addr, long data); | 138 | unsigned long data); |
| 139 | int generic_ptrace_pokedata(struct task_struct *tsk, unsigned long addr, | ||
| 140 | unsigned long data); | ||
| 137 | 141 | ||
| 138 | /** | 142 | /** |
| 139 | * task_ptrace - return %PT_* flags that apply to a task | 143 | * task_ptrace - return %PT_* flags that apply to a task |
diff --git a/include/linux/pxa168_eth.h b/include/linux/pxa168_eth.h new file mode 100644 index 000000000000..18d75e795606 --- /dev/null +++ b/include/linux/pxa168_eth.h | |||
| @@ -0,0 +1,30 @@ | |||
| 1 | /* | ||
| 2 | *pxa168 ethernet platform device data definition file. | ||
| 3 | */ | ||
| 4 | #ifndef __LINUX_PXA168_ETH_H | ||
| 5 | #define __LINUX_PXA168_ETH_H | ||
| 6 | |||
| 7 | struct pxa168_eth_platform_data { | ||
| 8 | int port_number; | ||
| 9 | int phy_addr; | ||
| 10 | |||
| 11 | /* | ||
| 12 | * If speed is 0, then speed and duplex are autonegotiated. | ||
| 13 | */ | ||
| 14 | int speed; /* 0, SPEED_10, SPEED_100 */ | ||
| 15 | int duplex; /* DUPLEX_HALF or DUPLEX_FULL */ | ||
| 16 | |||
| 17 | /* | ||
| 18 | * Override default RX/TX queue sizes if nonzero. | ||
| 19 | */ | ||
| 20 | int rx_queue_size; | ||
| 21 | int tx_queue_size; | ||
| 22 | |||
| 23 | /* | ||
| 24 | * init callback is used for board specific initialization | ||
| 25 | * e.g on Aspenite its used to initialize the PHY transceiver. | ||
| 26 | */ | ||
| 27 | int (*init)(void); | ||
| 28 | }; | ||
| 29 | |||
| 30 | #endif /* __LINUX_PXA168_ETH_H */ | ||
diff --git a/include/linux/quotaops.h b/include/linux/quotaops.h index aa36793b48bd..d1a9193960f1 100644 --- a/include/linux/quotaops.h +++ b/include/linux/quotaops.h | |||
| @@ -28,6 +28,12 @@ static inline bool is_quota_modification(struct inode *inode, struct iattr *ia) | |||
| 28 | 28 | ||
| 29 | #if defined(CONFIG_QUOTA) | 29 | #if defined(CONFIG_QUOTA) |
| 30 | 30 | ||
| 31 | #define quota_error(sb, fmt, args...) \ | ||
| 32 | __quota_error((sb), __func__, fmt , ## args) | ||
| 33 | |||
| 34 | extern void __quota_error(struct super_block *sb, const char *func, | ||
| 35 | const char *fmt, ...); | ||
| 36 | |||
| 31 | /* | 37 | /* |
| 32 | * declaration of quota_function calls in kernel. | 38 | * declaration of quota_function calls in kernel. |
| 33 | */ | 39 | */ |
| @@ -145,11 +151,6 @@ static inline bool sb_has_quota_active(struct super_block *sb, int type) | |||
| 145 | !sb_has_quota_suspended(sb, type); | 151 | !sb_has_quota_suspended(sb, type); |
| 146 | } | 152 | } |
| 147 | 153 | ||
| 148 | static inline unsigned sb_any_quota_active(struct super_block *sb) | ||
| 149 | { | ||
| 150 | return sb_any_quota_loaded(sb) & ~sb_any_quota_suspended(sb); | ||
| 151 | } | ||
| 152 | |||
| 153 | /* | 154 | /* |
| 154 | * Operations supported for diskquotas. | 155 | * Operations supported for diskquotas. |
| 155 | */ | 156 | */ |
| @@ -194,11 +195,6 @@ static inline int sb_has_quota_active(struct super_block *sb, int type) | |||
| 194 | return 0; | 195 | return 0; |
| 195 | } | 196 | } |
| 196 | 197 | ||
| 197 | static inline int sb_any_quota_active(struct super_block *sb) | ||
| 198 | { | ||
| 199 | return 0; | ||
| 200 | } | ||
| 201 | |||
| 202 | static inline void dquot_initialize(struct inode *inode) | 198 | static inline void dquot_initialize(struct inode *inode) |
| 203 | { | 199 | { |
| 204 | } | 200 | } |
| @@ -270,7 +266,7 @@ static inline int dquot_alloc_space_nodirty(struct inode *inode, qsize_t nr) | |||
| 270 | static inline void dquot_alloc_space_nofail(struct inode *inode, qsize_t nr) | 266 | static inline void dquot_alloc_space_nofail(struct inode *inode, qsize_t nr) |
| 271 | { | 267 | { |
| 272 | __dquot_alloc_space(inode, nr, DQUOT_SPACE_WARN|DQUOT_SPACE_NOFAIL); | 268 | __dquot_alloc_space(inode, nr, DQUOT_SPACE_WARN|DQUOT_SPACE_NOFAIL); |
| 273 | mark_inode_dirty(inode); | 269 | mark_inode_dirty_sync(inode); |
| 274 | } | 270 | } |
| 275 | 271 | ||
| 276 | static inline int dquot_alloc_space(struct inode *inode, qsize_t nr) | 272 | static inline int dquot_alloc_space(struct inode *inode, qsize_t nr) |
| @@ -278,8 +274,14 @@ static inline int dquot_alloc_space(struct inode *inode, qsize_t nr) | |||
| 278 | int ret; | 274 | int ret; |
| 279 | 275 | ||
| 280 | ret = dquot_alloc_space_nodirty(inode, nr); | 276 | ret = dquot_alloc_space_nodirty(inode, nr); |
| 281 | if (!ret) | 277 | if (!ret) { |
| 278 | /* | ||
| 279 | * Mark inode fully dirty. Since we are allocating blocks, inode | ||
| 280 | * would become fully dirty soon anyway and it reportedly | ||
| 281 | * reduces inode_lock contention. | ||
| 282 | */ | ||
| 282 | mark_inode_dirty(inode); | 283 | mark_inode_dirty(inode); |
| 284 | } | ||
| 283 | return ret; | 285 | return ret; |
| 284 | } | 286 | } |
| 285 | 287 | ||
| @@ -309,7 +311,7 @@ static inline int dquot_prealloc_block(struct inode *inode, qsize_t nr) | |||
| 309 | 311 | ||
| 310 | ret = dquot_prealloc_block_nodirty(inode, nr); | 312 | ret = dquot_prealloc_block_nodirty(inode, nr); |
| 311 | if (!ret) | 313 | if (!ret) |
| 312 | mark_inode_dirty(inode); | 314 | mark_inode_dirty_sync(inode); |
| 313 | return ret; | 315 | return ret; |
| 314 | } | 316 | } |
| 315 | 317 | ||
| @@ -325,7 +327,7 @@ static inline int dquot_claim_block(struct inode *inode, qsize_t nr) | |||
| 325 | 327 | ||
| 326 | ret = dquot_claim_space_nodirty(inode, nr << inode->i_blkbits); | 328 | ret = dquot_claim_space_nodirty(inode, nr << inode->i_blkbits); |
| 327 | if (!ret) | 329 | if (!ret) |
| 328 | mark_inode_dirty(inode); | 330 | mark_inode_dirty_sync(inode); |
| 329 | return ret; | 331 | return ret; |
| 330 | } | 332 | } |
| 331 | 333 | ||
| @@ -337,7 +339,7 @@ static inline void dquot_free_space_nodirty(struct inode *inode, qsize_t nr) | |||
| 337 | static inline void dquot_free_space(struct inode *inode, qsize_t nr) | 339 | static inline void dquot_free_space(struct inode *inode, qsize_t nr) |
| 338 | { | 340 | { |
| 339 | dquot_free_space_nodirty(inode, nr); | 341 | dquot_free_space_nodirty(inode, nr); |
| 340 | mark_inode_dirty(inode); | 342 | mark_inode_dirty_sync(inode); |
| 341 | } | 343 | } |
| 342 | 344 | ||
| 343 | static inline void dquot_free_block_nodirty(struct inode *inode, qsize_t nr) | 345 | static inline void dquot_free_block_nodirty(struct inode *inode, qsize_t nr) |
diff --git a/include/linux/radix-tree.h b/include/linux/radix-tree.h index 55ca73cf25e5..a39cbed9ee17 100644 --- a/include/linux/radix-tree.h +++ b/include/linux/radix-tree.h | |||
| @@ -47,6 +47,8 @@ static inline void *radix_tree_indirect_to_ptr(void *ptr) | |||
| 47 | { | 47 | { |
| 48 | return (void *)((unsigned long)ptr & ~RADIX_TREE_INDIRECT_PTR); | 48 | return (void *)((unsigned long)ptr & ~RADIX_TREE_INDIRECT_PTR); |
| 49 | } | 49 | } |
| 50 | #define radix_tree_indirect_to_ptr(ptr) \ | ||
| 51 | radix_tree_indirect_to_ptr((void __force *)(ptr)) | ||
| 50 | 52 | ||
| 51 | static inline int radix_tree_is_indirect_ptr(void *ptr) | 53 | static inline int radix_tree_is_indirect_ptr(void *ptr) |
| 52 | { | 54 | { |
| @@ -55,13 +57,13 @@ static inline int radix_tree_is_indirect_ptr(void *ptr) | |||
| 55 | 57 | ||
| 56 | /*** radix-tree API starts here ***/ | 58 | /*** radix-tree API starts here ***/ |
| 57 | 59 | ||
| 58 | #define RADIX_TREE_MAX_TAGS 2 | 60 | #define RADIX_TREE_MAX_TAGS 3 |
| 59 | 61 | ||
| 60 | /* root tags are stored in gfp_mask, shifted by __GFP_BITS_SHIFT */ | 62 | /* root tags are stored in gfp_mask, shifted by __GFP_BITS_SHIFT */ |
| 61 | struct radix_tree_root { | 63 | struct radix_tree_root { |
| 62 | unsigned int height; | 64 | unsigned int height; |
| 63 | gfp_t gfp_mask; | 65 | gfp_t gfp_mask; |
| 64 | struct radix_tree_node *rnode; | 66 | struct radix_tree_node __rcu *rnode; |
| 65 | }; | 67 | }; |
| 66 | 68 | ||
| 67 | #define RADIX_TREE_INIT(mask) { \ | 69 | #define RADIX_TREE_INIT(mask) { \ |
| @@ -192,6 +194,10 @@ unsigned int | |||
| 192 | radix_tree_gang_lookup_tag_slot(struct radix_tree_root *root, void ***results, | 194 | radix_tree_gang_lookup_tag_slot(struct radix_tree_root *root, void ***results, |
| 193 | unsigned long first_index, unsigned int max_items, | 195 | unsigned long first_index, unsigned int max_items, |
| 194 | unsigned int tag); | 196 | unsigned int tag); |
| 197 | unsigned long radix_tree_range_tag_if_tagged(struct radix_tree_root *root, | ||
| 198 | unsigned long *first_indexp, unsigned long last_index, | ||
| 199 | unsigned long nr_to_tag, | ||
| 200 | unsigned int fromtag, unsigned int totag); | ||
| 195 | int radix_tree_tagged(struct radix_tree_root *root, unsigned int tag); | 201 | int radix_tree_tagged(struct radix_tree_root *root, unsigned int tag); |
| 196 | 202 | ||
| 197 | static inline void radix_tree_preload_end(void) | 203 | static inline void radix_tree_preload_end(void) |
diff --git a/include/linux/raid/pq.h b/include/linux/raid/pq.h index 1cbbd2c11aa9..2b59cc824395 100644 --- a/include/linux/raid/pq.h +++ b/include/linux/raid/pq.h | |||
| @@ -62,7 +62,9 @@ extern const char raid6_empty_zero_page[PAGE_SIZE]; | |||
| 62 | #define disable_kernel_altivec() | 62 | #define disable_kernel_altivec() |
| 63 | 63 | ||
| 64 | #define EXPORT_SYMBOL(sym) | 64 | #define EXPORT_SYMBOL(sym) |
| 65 | #define EXPORT_SYMBOL_GPL(sym) | ||
| 65 | #define MODULE_LICENSE(licence) | 66 | #define MODULE_LICENSE(licence) |
| 67 | #define MODULE_DESCRIPTION(desc) | ||
| 66 | #define subsys_initcall(x) | 68 | #define subsys_initcall(x) |
| 67 | #define module_exit(x) | 69 | #define module_exit(x) |
| 68 | #endif /* __KERNEL__ */ | 70 | #endif /* __KERNEL__ */ |
diff --git a/include/linux/ramoops.h b/include/linux/ramoops.h new file mode 100644 index 000000000000..0ae68a2c1212 --- /dev/null +++ b/include/linux/ramoops.h | |||
| @@ -0,0 +1,15 @@ | |||
| 1 | #ifndef __RAMOOPS_H | ||
| 2 | #define __RAMOOPS_H | ||
| 3 | |||
| 4 | /* | ||
| 5 | * Ramoops platform data | ||
| 6 | * @mem_size memory size for ramoops | ||
| 7 | * @mem_address physical memory address to contain ramoops | ||
| 8 | */ | ||
| 9 | |||
| 10 | struct ramoops_platform_data { | ||
| 11 | unsigned long mem_size; | ||
| 12 | unsigned long mem_address; | ||
| 13 | }; | ||
| 14 | |||
| 15 | #endif | ||
diff --git a/include/linux/rar_register.h b/include/linux/rar_register.h new file mode 100644 index 000000000000..ffa805780f85 --- /dev/null +++ b/include/linux/rar_register.h | |||
| @@ -0,0 +1,44 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2010 Intel Corporation. All rights reserved. | ||
| 3 | * | ||
| 4 | * This program is free software; you can redistribute it and/or | ||
| 5 | * modify it under the terms of version 2 of the GNU General | ||
| 6 | * Public License as published by the Free Software Foundation. | ||
| 7 | * | ||
| 8 | * This program is distributed in the hope that it will be | ||
| 9 | * useful, but WITHOUT ANY WARRANTY; without even the implied | ||
| 10 | * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR | ||
| 11 | * PURPOSE. See the GNU General Public License for more details. | ||
| 12 | * You should have received a copy of the GNU General Public | ||
| 13 | * License along with this program; if not, write to the Free | ||
| 14 | * Software Foundation, Inc., 59 Temple Place - Suite 330, | ||
| 15 | * Boston, MA 02111-1307, USA. | ||
| 16 | * The full GNU General Public License is included in this | ||
| 17 | * distribution in the file called COPYING. | ||
| 18 | */ | ||
| 19 | |||
| 20 | |||
| 21 | #ifndef _RAR_REGISTER_H | ||
| 22 | #define _RAR_REGISTER_H | ||
| 23 | |||
| 24 | #include <linux/types.h> | ||
| 25 | |||
| 26 | /* following are used both in drivers as well as user space apps */ | ||
| 27 | |||
| 28 | #define RAR_TYPE_VIDEO 0 | ||
| 29 | #define RAR_TYPE_AUDIO 1 | ||
| 30 | #define RAR_TYPE_IMAGE 2 | ||
| 31 | #define RAR_TYPE_DATA 3 | ||
| 32 | |||
| 33 | #ifdef __KERNEL__ | ||
| 34 | |||
| 35 | struct rar_device; | ||
| 36 | |||
| 37 | int register_rar(int num, | ||
| 38 | int (*callback)(unsigned long data), unsigned long data); | ||
| 39 | void unregister_rar(int num); | ||
| 40 | int rar_get_address(int rar_index, dma_addr_t *start, dma_addr_t *end); | ||
| 41 | int rar_lock(int rar_index); | ||
| 42 | |||
| 43 | #endif /* __KERNEL__ */ | ||
| 44 | #endif /* _RAR_REGISTER_H */ | ||
diff --git a/include/linux/ratelimit.h b/include/linux/ratelimit.h index 8f69d09a41a5..03ff67b0cdf5 100644 --- a/include/linux/ratelimit.h +++ b/include/linux/ratelimit.h | |||
| @@ -36,6 +36,8 @@ static inline void ratelimit_state_init(struct ratelimit_state *rs, | |||
| 36 | rs->begin = 0; | 36 | rs->begin = 0; |
| 37 | } | 37 | } |
| 38 | 38 | ||
| 39 | extern struct ratelimit_state printk_ratelimit_state; | ||
| 40 | |||
| 39 | extern int ___ratelimit(struct ratelimit_state *rs, const char *func); | 41 | extern int ___ratelimit(struct ratelimit_state *rs, const char *func); |
| 40 | #define __ratelimit(state) ___ratelimit(state, __func__) | 42 | #define __ratelimit(state) ___ratelimit(state, __func__) |
| 41 | 43 | ||
diff --git a/include/linux/rculist.h b/include/linux/rculist.h index 4ec3b38ce9c5..f31ef61f1c65 100644 --- a/include/linux/rculist.h +++ b/include/linux/rculist.h | |||
| @@ -10,6 +10,21 @@ | |||
| 10 | #include <linux/rcupdate.h> | 10 | #include <linux/rcupdate.h> |
| 11 | 11 | ||
| 12 | /* | 12 | /* |
| 13 | * Why is there no list_empty_rcu()? Because list_empty() serves this | ||
| 14 | * purpose. The list_empty() function fetches the RCU-protected pointer | ||
| 15 | * and compares it to the address of the list head, but neither dereferences | ||
| 16 | * this pointer itself nor provides this pointer to the caller. Therefore, | ||
| 17 | * it is not necessary to use rcu_dereference(), so that list_empty() can | ||
| 18 | * be used anywhere you would want to use a list_empty_rcu(). | ||
| 19 | */ | ||
| 20 | |||
| 21 | /* | ||
| 22 | * return the ->next pointer of a list_head in an rcu safe | ||
| 23 | * way, we must not access it directly | ||
| 24 | */ | ||
| 25 | #define list_next_rcu(list) (*((struct list_head __rcu **)(&(list)->next))) | ||
| 26 | |||
| 27 | /* | ||
| 13 | * Insert a new entry between two known consecutive entries. | 28 | * Insert a new entry between two known consecutive entries. |
| 14 | * | 29 | * |
| 15 | * This is only for internal list manipulation where we know | 30 | * This is only for internal list manipulation where we know |
| @@ -20,7 +35,7 @@ static inline void __list_add_rcu(struct list_head *new, | |||
| 20 | { | 35 | { |
| 21 | new->next = next; | 36 | new->next = next; |
| 22 | new->prev = prev; | 37 | new->prev = prev; |
| 23 | rcu_assign_pointer(prev->next, new); | 38 | rcu_assign_pointer(list_next_rcu(prev), new); |
| 24 | next->prev = new; | 39 | next->prev = new; |
| 25 | } | 40 | } |
| 26 | 41 | ||
| @@ -138,7 +153,7 @@ static inline void list_replace_rcu(struct list_head *old, | |||
| 138 | { | 153 | { |
| 139 | new->next = old->next; | 154 | new->next = old->next; |
| 140 | new->prev = old->prev; | 155 | new->prev = old->prev; |
| 141 | rcu_assign_pointer(new->prev->next, new); | 156 | rcu_assign_pointer(list_next_rcu(new->prev), new); |
| 142 | new->next->prev = new; | 157 | new->next->prev = new; |
| 143 | old->prev = LIST_POISON2; | 158 | old->prev = LIST_POISON2; |
| 144 | } | 159 | } |
| @@ -193,7 +208,7 @@ static inline void list_splice_init_rcu(struct list_head *list, | |||
| 193 | */ | 208 | */ |
| 194 | 209 | ||
| 195 | last->next = at; | 210 | last->next = at; |
| 196 | rcu_assign_pointer(head->next, first); | 211 | rcu_assign_pointer(list_next_rcu(head), first); |
| 197 | first->prev = head; | 212 | first->prev = head; |
| 198 | at->prev = last; | 213 | at->prev = last; |
| 199 | } | 214 | } |
| @@ -208,7 +223,9 @@ static inline void list_splice_init_rcu(struct list_head *list, | |||
| 208 | * primitives such as list_add_rcu() as long as it's guarded by rcu_read_lock(). | 223 | * primitives such as list_add_rcu() as long as it's guarded by rcu_read_lock(). |
| 209 | */ | 224 | */ |
| 210 | #define list_entry_rcu(ptr, type, member) \ | 225 | #define list_entry_rcu(ptr, type, member) \ |
| 211 | container_of(rcu_dereference_raw(ptr), type, member) | 226 | ({typeof (*ptr) __rcu *__ptr = (typeof (*ptr) __rcu __force *)ptr; \ |
| 227 | container_of((typeof(ptr))rcu_dereference_raw(__ptr), type, member); \ | ||
| 228 | }) | ||
| 212 | 229 | ||
| 213 | /** | 230 | /** |
| 214 | * list_first_entry_rcu - get the first element from a list | 231 | * list_first_entry_rcu - get the first element from a list |
| @@ -225,9 +242,9 @@ static inline void list_splice_init_rcu(struct list_head *list, | |||
| 225 | list_entry_rcu((ptr)->next, type, member) | 242 | list_entry_rcu((ptr)->next, type, member) |
| 226 | 243 | ||
| 227 | #define __list_for_each_rcu(pos, head) \ | 244 | #define __list_for_each_rcu(pos, head) \ |
| 228 | for (pos = rcu_dereference_raw((head)->next); \ | 245 | for (pos = rcu_dereference_raw(list_next_rcu(head)); \ |
| 229 | pos != (head); \ | 246 | pos != (head); \ |
| 230 | pos = rcu_dereference_raw(pos->next)) | 247 | pos = rcu_dereference_raw(list_next_rcu((pos))) |
| 231 | 248 | ||
| 232 | /** | 249 | /** |
| 233 | * list_for_each_entry_rcu - iterate over rcu list of given type | 250 | * list_for_each_entry_rcu - iterate over rcu list of given type |
| @@ -257,9 +274,9 @@ static inline void list_splice_init_rcu(struct list_head *list, | |||
| 257 | * as long as the traversal is guarded by rcu_read_lock(). | 274 | * as long as the traversal is guarded by rcu_read_lock(). |
| 258 | */ | 275 | */ |
| 259 | #define list_for_each_continue_rcu(pos, head) \ | 276 | #define list_for_each_continue_rcu(pos, head) \ |
| 260 | for ((pos) = rcu_dereference_raw((pos)->next); \ | 277 | for ((pos) = rcu_dereference_raw(list_next_rcu(pos)); \ |
| 261 | prefetch((pos)->next), (pos) != (head); \ | 278 | prefetch((pos)->next), (pos) != (head); \ |
| 262 | (pos) = rcu_dereference_raw((pos)->next)) | 279 | (pos) = rcu_dereference_raw(list_next_rcu(pos))) |
| 263 | 280 | ||
| 264 | /** | 281 | /** |
| 265 | * list_for_each_entry_continue_rcu - continue iteration over list of given type | 282 | * list_for_each_entry_continue_rcu - continue iteration over list of given type |
| @@ -314,12 +331,19 @@ static inline void hlist_replace_rcu(struct hlist_node *old, | |||
| 314 | 331 | ||
| 315 | new->next = next; | 332 | new->next = next; |
| 316 | new->pprev = old->pprev; | 333 | new->pprev = old->pprev; |
| 317 | rcu_assign_pointer(*new->pprev, new); | 334 | rcu_assign_pointer(*(struct hlist_node __rcu **)new->pprev, new); |
| 318 | if (next) | 335 | if (next) |
| 319 | new->next->pprev = &new->next; | 336 | new->next->pprev = &new->next; |
| 320 | old->pprev = LIST_POISON2; | 337 | old->pprev = LIST_POISON2; |
| 321 | } | 338 | } |
| 322 | 339 | ||
| 340 | /* | ||
| 341 | * return the first or the next element in an RCU protected hlist | ||
| 342 | */ | ||
| 343 | #define hlist_first_rcu(head) (*((struct hlist_node __rcu **)(&(head)->first))) | ||
| 344 | #define hlist_next_rcu(node) (*((struct hlist_node __rcu **)(&(node)->next))) | ||
| 345 | #define hlist_pprev_rcu(node) (*((struct hlist_node __rcu **)((node)->pprev))) | ||
| 346 | |||
| 323 | /** | 347 | /** |
| 324 | * hlist_add_head_rcu | 348 | * hlist_add_head_rcu |
| 325 | * @n: the element to add to the hash list. | 349 | * @n: the element to add to the hash list. |
| @@ -346,7 +370,7 @@ static inline void hlist_add_head_rcu(struct hlist_node *n, | |||
| 346 | 370 | ||
| 347 | n->next = first; | 371 | n->next = first; |
| 348 | n->pprev = &h->first; | 372 | n->pprev = &h->first; |
| 349 | rcu_assign_pointer(h->first, n); | 373 | rcu_assign_pointer(hlist_first_rcu(h), n); |
| 350 | if (first) | 374 | if (first) |
| 351 | first->pprev = &n->next; | 375 | first->pprev = &n->next; |
| 352 | } | 376 | } |
| @@ -374,7 +398,7 @@ static inline void hlist_add_before_rcu(struct hlist_node *n, | |||
| 374 | { | 398 | { |
| 375 | n->pprev = next->pprev; | 399 | n->pprev = next->pprev; |
| 376 | n->next = next; | 400 | n->next = next; |
| 377 | rcu_assign_pointer(*(n->pprev), n); | 401 | rcu_assign_pointer(hlist_pprev_rcu(n), n); |
| 378 | next->pprev = &n->next; | 402 | next->pprev = &n->next; |
| 379 | } | 403 | } |
| 380 | 404 | ||
| @@ -401,15 +425,15 @@ static inline void hlist_add_after_rcu(struct hlist_node *prev, | |||
| 401 | { | 425 | { |
| 402 | n->next = prev->next; | 426 | n->next = prev->next; |
| 403 | n->pprev = &prev->next; | 427 | n->pprev = &prev->next; |
| 404 | rcu_assign_pointer(prev->next, n); | 428 | rcu_assign_pointer(hlist_next_rcu(prev), n); |
| 405 | if (n->next) | 429 | if (n->next) |
| 406 | n->next->pprev = &n->next; | 430 | n->next->pprev = &n->next; |
| 407 | } | 431 | } |
| 408 | 432 | ||
| 409 | #define __hlist_for_each_rcu(pos, head) \ | 433 | #define __hlist_for_each_rcu(pos, head) \ |
| 410 | for (pos = rcu_dereference((head)->first); \ | 434 | for (pos = rcu_dereference(hlist_first_rcu(head)); \ |
| 411 | pos && ({ prefetch(pos->next); 1; }); \ | 435 | pos && ({ prefetch(pos->next); 1; }); \ |
| 412 | pos = rcu_dereference(pos->next)) | 436 | pos = rcu_dereference(hlist_next_rcu(pos))) |
| 413 | 437 | ||
| 414 | /** | 438 | /** |
| 415 | * hlist_for_each_entry_rcu - iterate over rcu list of given type | 439 | * hlist_for_each_entry_rcu - iterate over rcu list of given type |
| @@ -422,11 +446,11 @@ static inline void hlist_add_after_rcu(struct hlist_node *prev, | |||
| 422 | * the _rcu list-mutation primitives such as hlist_add_head_rcu() | 446 | * the _rcu list-mutation primitives such as hlist_add_head_rcu() |
| 423 | * as long as the traversal is guarded by rcu_read_lock(). | 447 | * as long as the traversal is guarded by rcu_read_lock(). |
| 424 | */ | 448 | */ |
| 425 | #define hlist_for_each_entry_rcu(tpos, pos, head, member) \ | 449 | #define hlist_for_each_entry_rcu(tpos, pos, head, member) \ |
| 426 | for (pos = rcu_dereference_raw((head)->first); \ | 450 | for (pos = rcu_dereference_raw(hlist_first_rcu(head)); \ |
| 427 | pos && ({ prefetch(pos->next); 1; }) && \ | 451 | pos && ({ prefetch(pos->next); 1; }) && \ |
| 428 | ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1; }); \ | 452 | ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1; }); \ |
| 429 | pos = rcu_dereference_raw(pos->next)) | 453 | pos = rcu_dereference_raw(hlist_next_rcu(pos))) |
| 430 | 454 | ||
| 431 | /** | 455 | /** |
| 432 | * hlist_for_each_entry_rcu_bh - iterate over rcu list of given type | 456 | * hlist_for_each_entry_rcu_bh - iterate over rcu list of given type |
diff --git a/include/linux/rculist_nulls.h b/include/linux/rculist_nulls.h index b70ffe53cb9f..2ae13714828b 100644 --- a/include/linux/rculist_nulls.h +++ b/include/linux/rculist_nulls.h | |||
| @@ -37,6 +37,12 @@ static inline void hlist_nulls_del_init_rcu(struct hlist_nulls_node *n) | |||
| 37 | } | 37 | } |
| 38 | } | 38 | } |
| 39 | 39 | ||
| 40 | #define hlist_nulls_first_rcu(head) \ | ||
| 41 | (*((struct hlist_nulls_node __rcu __force **)&(head)->first)) | ||
| 42 | |||
| 43 | #define hlist_nulls_next_rcu(node) \ | ||
| 44 | (*((struct hlist_nulls_node __rcu __force **)&(node)->next)) | ||
| 45 | |||
| 40 | /** | 46 | /** |
| 41 | * hlist_nulls_del_rcu - deletes entry from hash list without re-initialization | 47 | * hlist_nulls_del_rcu - deletes entry from hash list without re-initialization |
| 42 | * @n: the element to delete from the hash list. | 48 | * @n: the element to delete from the hash list. |
| @@ -88,7 +94,7 @@ static inline void hlist_nulls_add_head_rcu(struct hlist_nulls_node *n, | |||
| 88 | 94 | ||
| 89 | n->next = first; | 95 | n->next = first; |
| 90 | n->pprev = &h->first; | 96 | n->pprev = &h->first; |
| 91 | rcu_assign_pointer(h->first, n); | 97 | rcu_assign_pointer(hlist_nulls_first_rcu(h), n); |
| 92 | if (!is_a_nulls(first)) | 98 | if (!is_a_nulls(first)) |
| 93 | first->pprev = &n->next; | 99 | first->pprev = &n->next; |
| 94 | } | 100 | } |
| @@ -100,11 +106,11 @@ static inline void hlist_nulls_add_head_rcu(struct hlist_nulls_node *n, | |||
| 100 | * @member: the name of the hlist_nulls_node within the struct. | 106 | * @member: the name of the hlist_nulls_node within the struct. |
| 101 | * | 107 | * |
| 102 | */ | 108 | */ |
| 103 | #define hlist_nulls_for_each_entry_rcu(tpos, pos, head, member) \ | 109 | #define hlist_nulls_for_each_entry_rcu(tpos, pos, head, member) \ |
| 104 | for (pos = rcu_dereference_raw((head)->first); \ | 110 | for (pos = rcu_dereference_raw(hlist_nulls_first_rcu(head)); \ |
| 105 | (!is_a_nulls(pos)) && \ | 111 | (!is_a_nulls(pos)) && \ |
| 106 | ({ tpos = hlist_nulls_entry(pos, typeof(*tpos), member); 1; }); \ | 112 | ({ tpos = hlist_nulls_entry(pos, typeof(*tpos), member); 1; }); \ |
| 107 | pos = rcu_dereference_raw(pos->next)) | 113 | pos = rcu_dereference_raw(hlist_nulls_next_rcu(pos))) |
| 108 | 114 | ||
| 109 | #endif | 115 | #endif |
| 110 | #endif | 116 | #endif |
diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h index b653b4aaa8a6..03cda7bed985 100644 --- a/include/linux/rcupdate.h +++ b/include/linux/rcupdate.h | |||
| @@ -40,11 +40,16 @@ | |||
| 40 | #include <linux/seqlock.h> | 40 | #include <linux/seqlock.h> |
| 41 | #include <linux/lockdep.h> | 41 | #include <linux/lockdep.h> |
| 42 | #include <linux/completion.h> | 42 | #include <linux/completion.h> |
| 43 | #include <linux/debugobjects.h> | ||
| 44 | #include <linux/compiler.h> | ||
| 43 | 45 | ||
| 44 | #ifdef CONFIG_RCU_TORTURE_TEST | 46 | #ifdef CONFIG_RCU_TORTURE_TEST |
| 45 | extern int rcutorture_runnable; /* for sysctl */ | 47 | extern int rcutorture_runnable; /* for sysctl */ |
| 46 | #endif /* #ifdef CONFIG_RCU_TORTURE_TEST */ | 48 | #endif /* #ifdef CONFIG_RCU_TORTURE_TEST */ |
| 47 | 49 | ||
| 50 | #define ULONG_CMP_GE(a, b) (ULONG_MAX / 2 >= (a) - (b)) | ||
| 51 | #define ULONG_CMP_LT(a, b) (ULONG_MAX / 2 < (a) - (b)) | ||
| 52 | |||
| 48 | /** | 53 | /** |
| 49 | * struct rcu_head - callback structure for use with RCU | 54 | * struct rcu_head - callback structure for use with RCU |
| 50 | * @next: next update requests in a list | 55 | * @next: next update requests in a list |
| @@ -56,29 +61,104 @@ struct rcu_head { | |||
| 56 | }; | 61 | }; |
| 57 | 62 | ||
| 58 | /* Exported common interfaces */ | 63 | /* Exported common interfaces */ |
| 59 | extern void rcu_barrier(void); | 64 | extern void call_rcu_sched(struct rcu_head *head, |
| 65 | void (*func)(struct rcu_head *rcu)); | ||
| 66 | extern void synchronize_sched(void); | ||
| 60 | extern void rcu_barrier_bh(void); | 67 | extern void rcu_barrier_bh(void); |
| 61 | extern void rcu_barrier_sched(void); | 68 | extern void rcu_barrier_sched(void); |
| 62 | extern void synchronize_sched_expedited(void); | 69 | extern void synchronize_sched_expedited(void); |
| 63 | extern int sched_expedited_torture_stats(char *page); | 70 | extern int sched_expedited_torture_stats(char *page); |
| 64 | 71 | ||
| 72 | static inline void __rcu_read_lock_bh(void) | ||
| 73 | { | ||
| 74 | local_bh_disable(); | ||
| 75 | } | ||
| 76 | |||
| 77 | static inline void __rcu_read_unlock_bh(void) | ||
| 78 | { | ||
| 79 | local_bh_enable(); | ||
| 80 | } | ||
| 81 | |||
| 82 | #ifdef CONFIG_PREEMPT_RCU | ||
| 83 | |||
| 84 | extern void __rcu_read_lock(void); | ||
| 85 | extern void __rcu_read_unlock(void); | ||
| 86 | void synchronize_rcu(void); | ||
| 87 | |||
| 88 | /* | ||
| 89 | * Defined as a macro as it is a very low level header included from | ||
| 90 | * areas that don't even know about current. This gives the rcu_read_lock() | ||
| 91 | * nesting depth, but makes sense only if CONFIG_PREEMPT_RCU -- in other | ||
| 92 | * types of kernel builds, the rcu_read_lock() nesting depth is unknowable. | ||
| 93 | */ | ||
| 94 | #define rcu_preempt_depth() (current->rcu_read_lock_nesting) | ||
| 95 | |||
| 96 | #else /* #ifdef CONFIG_PREEMPT_RCU */ | ||
| 97 | |||
| 98 | static inline void __rcu_read_lock(void) | ||
| 99 | { | ||
| 100 | preempt_disable(); | ||
| 101 | } | ||
| 102 | |||
| 103 | static inline void __rcu_read_unlock(void) | ||
| 104 | { | ||
| 105 | preempt_enable(); | ||
| 106 | } | ||
| 107 | |||
| 108 | static inline void synchronize_rcu(void) | ||
| 109 | { | ||
| 110 | synchronize_sched(); | ||
| 111 | } | ||
| 112 | |||
| 113 | static inline int rcu_preempt_depth(void) | ||
| 114 | { | ||
| 115 | return 0; | ||
| 116 | } | ||
| 117 | |||
| 118 | #endif /* #else #ifdef CONFIG_PREEMPT_RCU */ | ||
| 119 | |||
| 65 | /* Internal to kernel */ | 120 | /* Internal to kernel */ |
| 66 | extern void rcu_init(void); | 121 | extern void rcu_init(void); |
| 122 | extern void rcu_sched_qs(int cpu); | ||
| 123 | extern void rcu_bh_qs(int cpu); | ||
| 124 | extern void rcu_check_callbacks(int cpu, int user); | ||
| 125 | struct notifier_block; | ||
| 126 | |||
| 127 | #ifdef CONFIG_NO_HZ | ||
| 128 | |||
| 129 | extern void rcu_enter_nohz(void); | ||
| 130 | extern void rcu_exit_nohz(void); | ||
| 131 | |||
| 132 | #else /* #ifdef CONFIG_NO_HZ */ | ||
| 133 | |||
| 134 | static inline void rcu_enter_nohz(void) | ||
| 135 | { | ||
| 136 | } | ||
| 137 | |||
| 138 | static inline void rcu_exit_nohz(void) | ||
| 139 | { | ||
| 140 | } | ||
| 141 | |||
| 142 | #endif /* #else #ifdef CONFIG_NO_HZ */ | ||
| 67 | 143 | ||
| 68 | #if defined(CONFIG_TREE_RCU) || defined(CONFIG_TREE_PREEMPT_RCU) | 144 | #if defined(CONFIG_TREE_RCU) || defined(CONFIG_TREE_PREEMPT_RCU) |
| 69 | #include <linux/rcutree.h> | 145 | #include <linux/rcutree.h> |
| 70 | #elif defined(CONFIG_TINY_RCU) | 146 | #elif defined(CONFIG_TINY_RCU) || defined(CONFIG_TINY_PREEMPT_RCU) |
| 71 | #include <linux/rcutiny.h> | 147 | #include <linux/rcutiny.h> |
| 72 | #else | 148 | #else |
| 73 | #error "Unknown RCU implementation specified to kernel configuration" | 149 | #error "Unknown RCU implementation specified to kernel configuration" |
| 74 | #endif | 150 | #endif |
| 75 | 151 | ||
| 76 | #define RCU_HEAD_INIT { .next = NULL, .func = NULL } | 152 | /* |
| 77 | #define RCU_HEAD(head) struct rcu_head head = RCU_HEAD_INIT | 153 | * init_rcu_head_on_stack()/destroy_rcu_head_on_stack() are needed for dynamic |
| 78 | #define INIT_RCU_HEAD(ptr) do { \ | 154 | * initialization and destruction of rcu_head on the stack. rcu_head structures |
| 79 | (ptr)->next = NULL; (ptr)->func = NULL; \ | 155 | * allocated dynamically in the heap or defined statically don't need any |
| 80 | } while (0) | 156 | * initialization. |
| 81 | 157 | */ | |
| 158 | #ifdef CONFIG_DEBUG_OBJECTS_RCU_HEAD | ||
| 159 | extern void init_rcu_head_on_stack(struct rcu_head *head); | ||
| 160 | extern void destroy_rcu_head_on_stack(struct rcu_head *head); | ||
| 161 | #else /* !CONFIG_DEBUG_OBJECTS_RCU_HEAD */ | ||
| 82 | static inline void init_rcu_head_on_stack(struct rcu_head *head) | 162 | static inline void init_rcu_head_on_stack(struct rcu_head *head) |
| 83 | { | 163 | { |
| 84 | } | 164 | } |
| @@ -86,6 +166,7 @@ static inline void init_rcu_head_on_stack(struct rcu_head *head) | |||
| 86 | static inline void destroy_rcu_head_on_stack(struct rcu_head *head) | 166 | static inline void destroy_rcu_head_on_stack(struct rcu_head *head) |
| 87 | { | 167 | { |
| 88 | } | 168 | } |
| 169 | #endif /* #else !CONFIG_DEBUG_OBJECTS_RCU_HEAD */ | ||
| 89 | 170 | ||
| 90 | #ifdef CONFIG_DEBUG_LOCK_ALLOC | 171 | #ifdef CONFIG_DEBUG_LOCK_ALLOC |
| 91 | 172 | ||
| @@ -108,14 +189,15 @@ extern struct lockdep_map rcu_sched_lock_map; | |||
| 108 | extern int debug_lockdep_rcu_enabled(void); | 189 | extern int debug_lockdep_rcu_enabled(void); |
| 109 | 190 | ||
| 110 | /** | 191 | /** |
| 111 | * rcu_read_lock_held - might we be in RCU read-side critical section? | 192 | * rcu_read_lock_held() - might we be in RCU read-side critical section? |
| 112 | * | 193 | * |
| 113 | * If CONFIG_DEBUG_LOCK_ALLOC is selected, returns nonzero iff in an RCU | 194 | * If CONFIG_DEBUG_LOCK_ALLOC is selected, returns nonzero iff in an RCU |
| 114 | * read-side critical section. In absence of CONFIG_DEBUG_LOCK_ALLOC, | 195 | * read-side critical section. In absence of CONFIG_DEBUG_LOCK_ALLOC, |
| 115 | * this assumes we are in an RCU read-side critical section unless it can | 196 | * this assumes we are in an RCU read-side critical section unless it can |
| 116 | * prove otherwise. | 197 | * prove otherwise. This is useful for debug checks in functions that |
| 198 | * require that they be called within an RCU read-side critical section. | ||
| 117 | * | 199 | * |
| 118 | * Check debug_lockdep_rcu_enabled() to prevent false positives during boot | 200 | * Checks debug_lockdep_rcu_enabled() to prevent false positives during boot |
| 119 | * and while lockdep is disabled. | 201 | * and while lockdep is disabled. |
| 120 | */ | 202 | */ |
| 121 | static inline int rcu_read_lock_held(void) | 203 | static inline int rcu_read_lock_held(void) |
| @@ -132,14 +214,16 @@ static inline int rcu_read_lock_held(void) | |||
| 132 | extern int rcu_read_lock_bh_held(void); | 214 | extern int rcu_read_lock_bh_held(void); |
| 133 | 215 | ||
| 134 | /** | 216 | /** |
| 135 | * rcu_read_lock_sched_held - might we be in RCU-sched read-side critical section? | 217 | * rcu_read_lock_sched_held() - might we be in RCU-sched read-side critical section? |
| 136 | * | 218 | * |
| 137 | * If CONFIG_DEBUG_LOCK_ALLOC is selected, returns nonzero iff in an | 219 | * If CONFIG_DEBUG_LOCK_ALLOC is selected, returns nonzero iff in an |
| 138 | * RCU-sched read-side critical section. In absence of | 220 | * RCU-sched read-side critical section. In absence of |
| 139 | * CONFIG_DEBUG_LOCK_ALLOC, this assumes we are in an RCU-sched read-side | 221 | * CONFIG_DEBUG_LOCK_ALLOC, this assumes we are in an RCU-sched read-side |
| 140 | * critical section unless it can prove otherwise. Note that disabling | 222 | * critical section unless it can prove otherwise. Note that disabling |
| 141 | * of preemption (including disabling irqs) counts as an RCU-sched | 223 | * of preemption (including disabling irqs) counts as an RCU-sched |
| 142 | * read-side critical section. | 224 | * read-side critical section. This is useful for debug checks in functions |
| 225 | * that required that they be called within an RCU-sched read-side | ||
| 226 | * critical section. | ||
| 143 | * | 227 | * |
| 144 | * Check debug_lockdep_rcu_enabled() to prevent false positives during boot | 228 | * Check debug_lockdep_rcu_enabled() to prevent false positives during boot |
| 145 | * and while lockdep is disabled. | 229 | * and while lockdep is disabled. |
| @@ -199,7 +283,11 @@ static inline int rcu_read_lock_sched_held(void) | |||
| 199 | 283 | ||
| 200 | extern int rcu_my_thread_group_empty(void); | 284 | extern int rcu_my_thread_group_empty(void); |
| 201 | 285 | ||
| 202 | #define __do_rcu_dereference_check(c) \ | 286 | /** |
| 287 | * rcu_lockdep_assert - emit lockdep splat if specified condition not met | ||
| 288 | * @c: condition to check | ||
| 289 | */ | ||
| 290 | #define rcu_lockdep_assert(c) \ | ||
| 203 | do { \ | 291 | do { \ |
| 204 | static bool __warned; \ | 292 | static bool __warned; \ |
| 205 | if (debug_lockdep_rcu_enabled() && !__warned && !(c)) { \ | 293 | if (debug_lockdep_rcu_enabled() && !__warned && !(c)) { \ |
| @@ -208,41 +296,163 @@ extern int rcu_my_thread_group_empty(void); | |||
| 208 | } \ | 296 | } \ |
| 209 | } while (0) | 297 | } while (0) |
| 210 | 298 | ||
| 299 | #else /* #ifdef CONFIG_PROVE_RCU */ | ||
| 300 | |||
| 301 | #define rcu_lockdep_assert(c) do { } while (0) | ||
| 302 | |||
| 303 | #endif /* #else #ifdef CONFIG_PROVE_RCU */ | ||
| 304 | |||
| 305 | /* | ||
| 306 | * Helper functions for rcu_dereference_check(), rcu_dereference_protected() | ||
| 307 | * and rcu_assign_pointer(). Some of these could be folded into their | ||
| 308 | * callers, but they are left separate in order to ease introduction of | ||
| 309 | * multiple flavors of pointers to match the multiple flavors of RCU | ||
| 310 | * (e.g., __rcu_bh, * __rcu_sched, and __srcu), should this make sense in | ||
| 311 | * the future. | ||
| 312 | */ | ||
| 313 | |||
| 314 | #ifdef __CHECKER__ | ||
| 315 | #define rcu_dereference_sparse(p, space) \ | ||
| 316 | ((void)(((typeof(*p) space *)p) == p)) | ||
| 317 | #else /* #ifdef __CHECKER__ */ | ||
| 318 | #define rcu_dereference_sparse(p, space) | ||
| 319 | #endif /* #else #ifdef __CHECKER__ */ | ||
| 320 | |||
| 321 | #define __rcu_access_pointer(p, space) \ | ||
| 322 | ({ \ | ||
| 323 | typeof(*p) *_________p1 = (typeof(*p)*__force )ACCESS_ONCE(p); \ | ||
| 324 | rcu_dereference_sparse(p, space); \ | ||
| 325 | ((typeof(*p) __force __kernel *)(_________p1)); \ | ||
| 326 | }) | ||
| 327 | #define __rcu_dereference_check(p, c, space) \ | ||
| 328 | ({ \ | ||
| 329 | typeof(*p) *_________p1 = (typeof(*p)*__force )ACCESS_ONCE(p); \ | ||
| 330 | rcu_lockdep_assert(c); \ | ||
| 331 | rcu_dereference_sparse(p, space); \ | ||
| 332 | smp_read_barrier_depends(); \ | ||
| 333 | ((typeof(*p) __force __kernel *)(_________p1)); \ | ||
| 334 | }) | ||
| 335 | #define __rcu_dereference_protected(p, c, space) \ | ||
| 336 | ({ \ | ||
| 337 | rcu_lockdep_assert(c); \ | ||
| 338 | rcu_dereference_sparse(p, space); \ | ||
| 339 | ((typeof(*p) __force __kernel *)(p)); \ | ||
| 340 | }) | ||
| 341 | |||
| 342 | #define __rcu_dereference_index_check(p, c) \ | ||
| 343 | ({ \ | ||
| 344 | typeof(p) _________p1 = ACCESS_ONCE(p); \ | ||
| 345 | rcu_lockdep_assert(c); \ | ||
| 346 | smp_read_barrier_depends(); \ | ||
| 347 | (_________p1); \ | ||
| 348 | }) | ||
| 349 | #define __rcu_assign_pointer(p, v, space) \ | ||
| 350 | ({ \ | ||
| 351 | if (!__builtin_constant_p(v) || \ | ||
| 352 | ((v) != NULL)) \ | ||
| 353 | smp_wmb(); \ | ||
| 354 | (p) = (typeof(*v) __force space *)(v); \ | ||
| 355 | }) | ||
| 356 | |||
| 357 | |||
| 211 | /** | 358 | /** |
| 212 | * rcu_dereference_check - rcu_dereference with debug checking | 359 | * rcu_access_pointer() - fetch RCU pointer with no dereferencing |
| 360 | * @p: The pointer to read | ||
| 361 | * | ||
| 362 | * Return the value of the specified RCU-protected pointer, but omit the | ||
| 363 | * smp_read_barrier_depends() and keep the ACCESS_ONCE(). This is useful | ||
| 364 | * when the value of this pointer is accessed, but the pointer is not | ||
| 365 | * dereferenced, for example, when testing an RCU-protected pointer against | ||
| 366 | * NULL. Although rcu_access_pointer() may also be used in cases where | ||
| 367 | * update-side locks prevent the value of the pointer from changing, you | ||
| 368 | * should instead use rcu_dereference_protected() for this use case. | ||
| 369 | */ | ||
| 370 | #define rcu_access_pointer(p) __rcu_access_pointer((p), __rcu) | ||
| 371 | |||
| 372 | /** | ||
| 373 | * rcu_dereference_check() - rcu_dereference with debug checking | ||
| 213 | * @p: The pointer to read, prior to dereferencing | 374 | * @p: The pointer to read, prior to dereferencing |
| 214 | * @c: The conditions under which the dereference will take place | 375 | * @c: The conditions under which the dereference will take place |
| 215 | * | 376 | * |
| 216 | * Do an rcu_dereference(), but check that the conditions under which the | 377 | * Do an rcu_dereference(), but check that the conditions under which the |
| 217 | * dereference will take place are correct. Typically the conditions indicate | 378 | * dereference will take place are correct. Typically the conditions |
| 218 | * the various locking conditions that should be held at that point. The check | 379 | * indicate the various locking conditions that should be held at that |
| 219 | * should return true if the conditions are satisfied. | 380 | * point. The check should return true if the conditions are satisfied. |
| 381 | * An implicit check for being in an RCU read-side critical section | ||
| 382 | * (rcu_read_lock()) is included. | ||
| 220 | * | 383 | * |
| 221 | * For example: | 384 | * For example: |
| 222 | * | 385 | * |
| 223 | * bar = rcu_dereference_check(foo->bar, rcu_read_lock_held() || | 386 | * bar = rcu_dereference_check(foo->bar, lockdep_is_held(&foo->lock)); |
| 224 | * lockdep_is_held(&foo->lock)); | ||
| 225 | * | 387 | * |
| 226 | * could be used to indicate to lockdep that foo->bar may only be dereferenced | 388 | * could be used to indicate to lockdep that foo->bar may only be dereferenced |
| 227 | * if either the RCU read lock is held, or that the lock required to replace | 389 | * if either rcu_read_lock() is held, or that the lock required to replace |
| 228 | * the bar struct at foo->bar is held. | 390 | * the bar struct at foo->bar is held. |
| 229 | * | 391 | * |
| 230 | * Note that the list of conditions may also include indications of when a lock | 392 | * Note that the list of conditions may also include indications of when a lock |
| 231 | * need not be held, for example during initialisation or destruction of the | 393 | * need not be held, for example during initialisation or destruction of the |
| 232 | * target struct: | 394 | * target struct: |
| 233 | * | 395 | * |
| 234 | * bar = rcu_dereference_check(foo->bar, rcu_read_lock_held() || | 396 | * bar = rcu_dereference_check(foo->bar, lockdep_is_held(&foo->lock) || |
| 235 | * lockdep_is_held(&foo->lock) || | ||
| 236 | * atomic_read(&foo->usage) == 0); | 397 | * atomic_read(&foo->usage) == 0); |
| 398 | * | ||
| 399 | * Inserts memory barriers on architectures that require them | ||
| 400 | * (currently only the Alpha), prevents the compiler from refetching | ||
| 401 | * (and from merging fetches), and, more importantly, documents exactly | ||
| 402 | * which pointers are protected by RCU and checks that the pointer is | ||
| 403 | * annotated as __rcu. | ||
| 237 | */ | 404 | */ |
| 238 | #define rcu_dereference_check(p, c) \ | 405 | #define rcu_dereference_check(p, c) \ |
| 239 | ({ \ | 406 | __rcu_dereference_check((p), rcu_read_lock_held() || (c), __rcu) |
| 240 | __do_rcu_dereference_check(c); \ | 407 | |
| 241 | rcu_dereference_raw(p); \ | 408 | /** |
| 242 | }) | 409 | * rcu_dereference_bh_check() - rcu_dereference_bh with debug checking |
| 410 | * @p: The pointer to read, prior to dereferencing | ||
| 411 | * @c: The conditions under which the dereference will take place | ||
| 412 | * | ||
| 413 | * This is the RCU-bh counterpart to rcu_dereference_check(). | ||
| 414 | */ | ||
| 415 | #define rcu_dereference_bh_check(p, c) \ | ||
| 416 | __rcu_dereference_check((p), rcu_read_lock_bh_held() || (c), __rcu) | ||
| 417 | |||
| 418 | /** | ||
| 419 | * rcu_dereference_sched_check() - rcu_dereference_sched with debug checking | ||
| 420 | * @p: The pointer to read, prior to dereferencing | ||
| 421 | * @c: The conditions under which the dereference will take place | ||
| 422 | * | ||
| 423 | * This is the RCU-sched counterpart to rcu_dereference_check(). | ||
| 424 | */ | ||
| 425 | #define rcu_dereference_sched_check(p, c) \ | ||
| 426 | __rcu_dereference_check((p), rcu_read_lock_sched_held() || (c), \ | ||
| 427 | __rcu) | ||
| 428 | |||
| 429 | #define rcu_dereference_raw(p) rcu_dereference_check(p, 1) /*@@@ needed? @@@*/ | ||
| 243 | 430 | ||
| 244 | /** | 431 | /** |
| 245 | * rcu_dereference_protected - fetch RCU pointer when updates prevented | 432 | * rcu_dereference_index_check() - rcu_dereference for indices with debug checking |
| 433 | * @p: The pointer to read, prior to dereferencing | ||
| 434 | * @c: The conditions under which the dereference will take place | ||
| 435 | * | ||
| 436 | * Similar to rcu_dereference_check(), but omits the sparse checking. | ||
| 437 | * This allows rcu_dereference_index_check() to be used on integers, | ||
| 438 | * which can then be used as array indices. Attempting to use | ||
| 439 | * rcu_dereference_check() on an integer will give compiler warnings | ||
| 440 | * because the sparse address-space mechanism relies on dereferencing | ||
| 441 | * the RCU-protected pointer. Dereferencing integers is not something | ||
| 442 | * that even gcc will put up with. | ||
| 443 | * | ||
| 444 | * Note that this function does not implicitly check for RCU read-side | ||
| 445 | * critical sections. If this function gains lots of uses, it might | ||
| 446 | * make sense to provide versions for each flavor of RCU, but it does | ||
| 447 | * not make sense as of early 2010. | ||
| 448 | */ | ||
| 449 | #define rcu_dereference_index_check(p, c) \ | ||
| 450 | __rcu_dereference_index_check((p), (c)) | ||
| 451 | |||
| 452 | /** | ||
| 453 | * rcu_dereference_protected() - fetch RCU pointer when updates prevented | ||
| 454 | * @p: The pointer to read, prior to dereferencing | ||
| 455 | * @c: The conditions under which the dereference will take place | ||
| 246 | * | 456 | * |
| 247 | * Return the value of the specified RCU-protected pointer, but omit | 457 | * Return the value of the specified RCU-protected pointer, but omit |
| 248 | * both the smp_read_barrier_depends() and the ACCESS_ONCE(). This | 458 | * both the smp_read_barrier_depends() and the ACCESS_ONCE(). This |
| @@ -251,35 +461,61 @@ extern int rcu_my_thread_group_empty(void); | |||
| 251 | * prevent the compiler from repeating this reference or combining it | 461 | * prevent the compiler from repeating this reference or combining it |
| 252 | * with other references, so it should not be used without protection | 462 | * with other references, so it should not be used without protection |
| 253 | * of appropriate locks. | 463 | * of appropriate locks. |
| 464 | * | ||
| 465 | * This function is only for update-side use. Using this function | ||
| 466 | * when protected only by rcu_read_lock() will result in infrequent | ||
| 467 | * but very ugly failures. | ||
| 254 | */ | 468 | */ |
| 255 | #define rcu_dereference_protected(p, c) \ | 469 | #define rcu_dereference_protected(p, c) \ |
| 256 | ({ \ | 470 | __rcu_dereference_protected((p), (c), __rcu) |
| 257 | __do_rcu_dereference_check(c); \ | ||
| 258 | (p); \ | ||
| 259 | }) | ||
| 260 | 471 | ||
| 261 | #else /* #ifdef CONFIG_PROVE_RCU */ | 472 | /** |
| 473 | * rcu_dereference_bh_protected() - fetch RCU-bh pointer when updates prevented | ||
| 474 | * @p: The pointer to read, prior to dereferencing | ||
| 475 | * @c: The conditions under which the dereference will take place | ||
| 476 | * | ||
| 477 | * This is the RCU-bh counterpart to rcu_dereference_protected(). | ||
| 478 | */ | ||
| 479 | #define rcu_dereference_bh_protected(p, c) \ | ||
| 480 | __rcu_dereference_protected((p), (c), __rcu) | ||
| 262 | 481 | ||
| 263 | #define rcu_dereference_check(p, c) rcu_dereference_raw(p) | 482 | /** |
| 264 | #define rcu_dereference_protected(p, c) (p) | 483 | * rcu_dereference_sched_protected() - fetch RCU-sched pointer when updates prevented |
| 484 | * @p: The pointer to read, prior to dereferencing | ||
| 485 | * @c: The conditions under which the dereference will take place | ||
| 486 | * | ||
| 487 | * This is the RCU-sched counterpart to rcu_dereference_protected(). | ||
| 488 | */ | ||
| 489 | #define rcu_dereference_sched_protected(p, c) \ | ||
| 490 | __rcu_dereference_protected((p), (c), __rcu) | ||
| 265 | 491 | ||
| 266 | #endif /* #else #ifdef CONFIG_PROVE_RCU */ | ||
| 267 | 492 | ||
| 268 | /** | 493 | /** |
| 269 | * rcu_access_pointer - fetch RCU pointer with no dereferencing | 494 | * rcu_dereference() - fetch RCU-protected pointer for dereferencing |
| 495 | * @p: The pointer to read, prior to dereferencing | ||
| 270 | * | 496 | * |
| 271 | * Return the value of the specified RCU-protected pointer, but omit the | 497 | * This is a simple wrapper around rcu_dereference_check(). |
| 272 | * smp_read_barrier_depends() and keep the ACCESS_ONCE(). This is useful | 498 | */ |
| 273 | * when the value of this pointer is accessed, but the pointer is not | 499 | #define rcu_dereference(p) rcu_dereference_check(p, 0) |
| 274 | * dereferenced, for example, when testing an RCU-protected pointer against | 500 | |
| 275 | * NULL. This may also be used in cases where update-side locks prevent | 501 | /** |
| 276 | * the value of the pointer from changing, but rcu_dereference_protected() | 502 | * rcu_dereference_bh() - fetch an RCU-bh-protected pointer for dereferencing |
| 277 | * is a lighter-weight primitive for this use case. | 503 | * @p: The pointer to read, prior to dereferencing |
| 504 | * | ||
| 505 | * Makes rcu_dereference_check() do the dirty work. | ||
| 278 | */ | 506 | */ |
| 279 | #define rcu_access_pointer(p) ACCESS_ONCE(p) | 507 | #define rcu_dereference_bh(p) rcu_dereference_bh_check(p, 0) |
| 280 | 508 | ||
| 281 | /** | 509 | /** |
| 282 | * rcu_read_lock - mark the beginning of an RCU read-side critical section. | 510 | * rcu_dereference_sched() - fetch RCU-sched-protected pointer for dereferencing |
| 511 | * @p: The pointer to read, prior to dereferencing | ||
| 512 | * | ||
| 513 | * Makes rcu_dereference_check() do the dirty work. | ||
| 514 | */ | ||
| 515 | #define rcu_dereference_sched(p) rcu_dereference_sched_check(p, 0) | ||
| 516 | |||
| 517 | /** | ||
| 518 | * rcu_read_lock() - mark the beginning of an RCU read-side critical section | ||
| 283 | * | 519 | * |
| 284 | * When synchronize_rcu() is invoked on one CPU while other CPUs | 520 | * When synchronize_rcu() is invoked on one CPU while other CPUs |
| 285 | * are within RCU read-side critical sections, then the | 521 | * are within RCU read-side critical sections, then the |
| @@ -290,7 +526,7 @@ extern int rcu_my_thread_group_empty(void); | |||
| 290 | * until after the all the other CPUs exit their critical sections. | 526 | * until after the all the other CPUs exit their critical sections. |
| 291 | * | 527 | * |
| 292 | * Note, however, that RCU callbacks are permitted to run concurrently | 528 | * Note, however, that RCU callbacks are permitted to run concurrently |
| 293 | * with RCU read-side critical sections. One way that this can happen | 529 | * with new RCU read-side critical sections. One way that this can happen |
| 294 | * is via the following sequence of events: (1) CPU 0 enters an RCU | 530 | * is via the following sequence of events: (1) CPU 0 enters an RCU |
| 295 | * read-side critical section, (2) CPU 1 invokes call_rcu() to register | 531 | * read-side critical section, (2) CPU 1 invokes call_rcu() to register |
| 296 | * an RCU callback, (3) CPU 0 exits the RCU read-side critical section, | 532 | * an RCU callback, (3) CPU 0 exits the RCU read-side critical section, |
| @@ -305,7 +541,20 @@ extern int rcu_my_thread_group_empty(void); | |||
| 305 | * will be deferred until the outermost RCU read-side critical section | 541 | * will be deferred until the outermost RCU read-side critical section |
| 306 | * completes. | 542 | * completes. |
| 307 | * | 543 | * |
| 308 | * It is illegal to block while in an RCU read-side critical section. | 544 | * You can avoid reading and understanding the next paragraph by |
| 545 | * following this rule: don't put anything in an rcu_read_lock() RCU | ||
| 546 | * read-side critical section that would block in a !PREEMPT kernel. | ||
| 547 | * But if you want the full story, read on! | ||
| 548 | * | ||
| 549 | * In non-preemptible RCU implementations (TREE_RCU and TINY_RCU), it | ||
| 550 | * is illegal to block while in an RCU read-side critical section. In | ||
| 551 | * preemptible RCU implementations (TREE_PREEMPT_RCU and TINY_PREEMPT_RCU) | ||
| 552 | * in CONFIG_PREEMPT kernel builds, RCU read-side critical sections may | ||
| 553 | * be preempted, but explicit blocking is illegal. Finally, in preemptible | ||
| 554 | * RCU implementations in real-time (CONFIG_PREEMPT_RT) kernel builds, | ||
| 555 | * RCU read-side critical sections may be preempted and they may also | ||
| 556 | * block, but only when acquiring spinlocks that are subject to priority | ||
| 557 | * inheritance. | ||
| 309 | */ | 558 | */ |
| 310 | static inline void rcu_read_lock(void) | 559 | static inline void rcu_read_lock(void) |
| 311 | { | 560 | { |
| @@ -325,7 +574,7 @@ static inline void rcu_read_lock(void) | |||
| 325 | */ | 574 | */ |
| 326 | 575 | ||
| 327 | /** | 576 | /** |
| 328 | * rcu_read_unlock - marks the end of an RCU read-side critical section. | 577 | * rcu_read_unlock() - marks the end of an RCU read-side critical section. |
| 329 | * | 578 | * |
| 330 | * See rcu_read_lock() for more information. | 579 | * See rcu_read_lock() for more information. |
| 331 | */ | 580 | */ |
| @@ -337,15 +586,16 @@ static inline void rcu_read_unlock(void) | |||
| 337 | } | 586 | } |
| 338 | 587 | ||
| 339 | /** | 588 | /** |
| 340 | * rcu_read_lock_bh - mark the beginning of a softirq-only RCU critical section | 589 | * rcu_read_lock_bh() - mark the beginning of an RCU-bh critical section |
| 341 | * | 590 | * |
| 342 | * This is equivalent of rcu_read_lock(), but to be used when updates | 591 | * This is equivalent of rcu_read_lock(), but to be used when updates |
| 343 | * are being done using call_rcu_bh(). Since call_rcu_bh() callbacks | 592 | * are being done using call_rcu_bh() or synchronize_rcu_bh(). Since |
| 344 | * consider completion of a softirq handler to be a quiescent state, | 593 | * both call_rcu_bh() and synchronize_rcu_bh() consider completion of a |
| 345 | * a process in RCU read-side critical section must be protected by | 594 | * softirq handler to be a quiescent state, a process in RCU read-side |
| 346 | * disabling softirqs. Read-side critical sections in interrupt context | 595 | * critical section must be protected by disabling softirqs. Read-side |
| 347 | * can use just rcu_read_lock(). | 596 | * critical sections in interrupt context can use just rcu_read_lock(), |
| 348 | * | 597 | * though this should at least be commented to avoid confusing people |
| 598 | * reading the code. | ||
| 349 | */ | 599 | */ |
| 350 | static inline void rcu_read_lock_bh(void) | 600 | static inline void rcu_read_lock_bh(void) |
| 351 | { | 601 | { |
| @@ -367,13 +617,12 @@ static inline void rcu_read_unlock_bh(void) | |||
| 367 | } | 617 | } |
| 368 | 618 | ||
| 369 | /** | 619 | /** |
| 370 | * rcu_read_lock_sched - mark the beginning of a RCU-classic critical section | 620 | * rcu_read_lock_sched() - mark the beginning of a RCU-sched critical section |
| 371 | * | 621 | * |
| 372 | * Should be used with either | 622 | * This is equivalent of rcu_read_lock(), but to be used when updates |
| 373 | * - synchronize_sched() | 623 | * are being done using call_rcu_sched() or synchronize_rcu_sched(). |
| 374 | * or | 624 | * Read-side critical sections can also be introduced by anything that |
| 375 | * - call_rcu_sched() and rcu_barrier_sched() | 625 | * disables preemption, including local_irq_disable() and friends. |
| 376 | * on the write-side to insure proper synchronization. | ||
| 377 | */ | 626 | */ |
| 378 | static inline void rcu_read_lock_sched(void) | 627 | static inline void rcu_read_lock_sched(void) |
| 379 | { | 628 | { |
| @@ -408,54 +657,14 @@ static inline notrace void rcu_read_unlock_sched_notrace(void) | |||
| 408 | preempt_enable_notrace(); | 657 | preempt_enable_notrace(); |
| 409 | } | 658 | } |
| 410 | 659 | ||
| 411 | |||
| 412 | /** | ||
| 413 | * rcu_dereference_raw - fetch an RCU-protected pointer | ||
| 414 | * | ||
| 415 | * The caller must be within some flavor of RCU read-side critical | ||
| 416 | * section, or must be otherwise preventing the pointer from changing, | ||
| 417 | * for example, by holding an appropriate lock. This pointer may later | ||
| 418 | * be safely dereferenced. It is the caller's responsibility to have | ||
| 419 | * done the right thing, as this primitive does no checking of any kind. | ||
| 420 | * | ||
| 421 | * Inserts memory barriers on architectures that require them | ||
| 422 | * (currently only the Alpha), and, more importantly, documents | ||
| 423 | * exactly which pointers are protected by RCU. | ||
| 424 | */ | ||
| 425 | #define rcu_dereference_raw(p) ({ \ | ||
| 426 | typeof(p) _________p1 = ACCESS_ONCE(p); \ | ||
| 427 | smp_read_barrier_depends(); \ | ||
| 428 | (_________p1); \ | ||
| 429 | }) | ||
| 430 | |||
| 431 | /** | ||
| 432 | * rcu_dereference - fetch an RCU-protected pointer, checking for RCU | ||
| 433 | * | ||
| 434 | * Makes rcu_dereference_check() do the dirty work. | ||
| 435 | */ | ||
| 436 | #define rcu_dereference(p) \ | ||
| 437 | rcu_dereference_check(p, rcu_read_lock_held()) | ||
| 438 | |||
| 439 | /** | ||
| 440 | * rcu_dereference_bh - fetch an RCU-protected pointer, checking for RCU-bh | ||
| 441 | * | ||
| 442 | * Makes rcu_dereference_check() do the dirty work. | ||
| 443 | */ | ||
| 444 | #define rcu_dereference_bh(p) \ | ||
| 445 | rcu_dereference_check(p, rcu_read_lock_bh_held()) | ||
| 446 | |||
| 447 | /** | 660 | /** |
| 448 | * rcu_dereference_sched - fetch RCU-protected pointer, checking for RCU-sched | 661 | * rcu_assign_pointer() - assign to RCU-protected pointer |
| 662 | * @p: pointer to assign to | ||
| 663 | * @v: value to assign (publish) | ||
| 449 | * | 664 | * |
| 450 | * Makes rcu_dereference_check() do the dirty work. | 665 | * Assigns the specified value to the specified RCU-protected |
| 451 | */ | 666 | * pointer, ensuring that any concurrent RCU readers will see |
| 452 | #define rcu_dereference_sched(p) \ | 667 | * any prior initialization. Returns the value assigned. |
| 453 | rcu_dereference_check(p, rcu_read_lock_sched_held()) | ||
| 454 | |||
| 455 | /** | ||
| 456 | * rcu_assign_pointer - assign (publicize) a pointer to a newly | ||
| 457 | * initialized structure that will be dereferenced by RCU read-side | ||
| 458 | * critical sections. Returns the value assigned. | ||
| 459 | * | 668 | * |
| 460 | * Inserts memory barriers on architectures that require them | 669 | * Inserts memory barriers on architectures that require them |
| 461 | * (pretty much all of them other than x86), and also prevents | 670 | * (pretty much all of them other than x86), and also prevents |
| @@ -464,14 +673,17 @@ static inline notrace void rcu_read_unlock_sched_notrace(void) | |||
| 464 | * call documents which pointers will be dereferenced by RCU read-side | 673 | * call documents which pointers will be dereferenced by RCU read-side |
| 465 | * code. | 674 | * code. |
| 466 | */ | 675 | */ |
| 467 | |||
| 468 | #define rcu_assign_pointer(p, v) \ | 676 | #define rcu_assign_pointer(p, v) \ |
| 469 | ({ \ | 677 | __rcu_assign_pointer((p), (v), __rcu) |
| 470 | if (!__builtin_constant_p(v) || \ | 678 | |
| 471 | ((v) != NULL)) \ | 679 | /** |
| 472 | smp_wmb(); \ | 680 | * RCU_INIT_POINTER() - initialize an RCU protected pointer |
| 473 | (p) = (v); \ | 681 | * |
| 474 | }) | 682 | * Initialize an RCU-protected pointer in such a way to avoid RCU-lockdep |
| 683 | * splats. | ||
| 684 | */ | ||
| 685 | #define RCU_INIT_POINTER(p, v) \ | ||
| 686 | p = (typeof(*v) __force __rcu *)(v) | ||
| 475 | 687 | ||
| 476 | /* Infrastructure to implement the synchronize_() primitives. */ | 688 | /* Infrastructure to implement the synchronize_() primitives. */ |
| 477 | 689 | ||
| @@ -482,26 +694,37 @@ struct rcu_synchronize { | |||
| 482 | 694 | ||
| 483 | extern void wakeme_after_rcu(struct rcu_head *head); | 695 | extern void wakeme_after_rcu(struct rcu_head *head); |
| 484 | 696 | ||
| 697 | #ifdef CONFIG_PREEMPT_RCU | ||
| 698 | |||
| 485 | /** | 699 | /** |
| 486 | * call_rcu - Queue an RCU callback for invocation after a grace period. | 700 | * call_rcu() - Queue an RCU callback for invocation after a grace period. |
| 487 | * @head: structure to be used for queueing the RCU updates. | 701 | * @head: structure to be used for queueing the RCU updates. |
| 488 | * @func: actual update function to be invoked after the grace period | 702 | * @func: actual callback function to be invoked after the grace period |
| 489 | * | 703 | * |
| 490 | * The update function will be invoked some time after a full grace | 704 | * The callback function will be invoked some time after a full grace |
| 491 | * period elapses, in other words after all currently executing RCU | 705 | * period elapses, in other words after all pre-existing RCU read-side |
| 492 | * read-side critical sections have completed. RCU read-side critical | 706 | * critical sections have completed. However, the callback function |
| 707 | * might well execute concurrently with RCU read-side critical sections | ||
| 708 | * that started after call_rcu() was invoked. RCU read-side critical | ||
| 493 | * sections are delimited by rcu_read_lock() and rcu_read_unlock(), | 709 | * sections are delimited by rcu_read_lock() and rcu_read_unlock(), |
| 494 | * and may be nested. | 710 | * and may be nested. |
| 495 | */ | 711 | */ |
| 496 | extern void call_rcu(struct rcu_head *head, | 712 | extern void call_rcu(struct rcu_head *head, |
| 497 | void (*func)(struct rcu_head *head)); | 713 | void (*func)(struct rcu_head *head)); |
| 498 | 714 | ||
| 715 | #else /* #ifdef CONFIG_PREEMPT_RCU */ | ||
| 716 | |||
| 717 | /* In classic RCU, call_rcu() is just call_rcu_sched(). */ | ||
| 718 | #define call_rcu call_rcu_sched | ||
| 719 | |||
| 720 | #endif /* #else #ifdef CONFIG_PREEMPT_RCU */ | ||
| 721 | |||
| 499 | /** | 722 | /** |
| 500 | * call_rcu_bh - Queue an RCU for invocation after a quicker grace period. | 723 | * call_rcu_bh() - Queue an RCU for invocation after a quicker grace period. |
| 501 | * @head: structure to be used for queueing the RCU updates. | 724 | * @head: structure to be used for queueing the RCU updates. |
| 502 | * @func: actual update function to be invoked after the grace period | 725 | * @func: actual callback function to be invoked after the grace period |
| 503 | * | 726 | * |
| 504 | * The update function will be invoked some time after a full grace | 727 | * The callback function will be invoked some time after a full grace |
| 505 | * period elapses, in other words after all currently executing RCU | 728 | * period elapses, in other words after all currently executing RCU |
| 506 | * read-side critical sections have completed. call_rcu_bh() assumes | 729 | * read-side critical sections have completed. call_rcu_bh() assumes |
| 507 | * that the read-side critical sections end on completion of a softirq | 730 | * that the read-side critical sections end on completion of a softirq |
| @@ -517,4 +740,41 @@ extern void call_rcu(struct rcu_head *head, | |||
| 517 | extern void call_rcu_bh(struct rcu_head *head, | 740 | extern void call_rcu_bh(struct rcu_head *head, |
| 518 | void (*func)(struct rcu_head *head)); | 741 | void (*func)(struct rcu_head *head)); |
| 519 | 742 | ||
| 743 | /* | ||
| 744 | * debug_rcu_head_queue()/debug_rcu_head_unqueue() are used internally | ||
| 745 | * by call_rcu() and rcu callback execution, and are therefore not part of the | ||
| 746 | * RCU API. Leaving in rcupdate.h because they are used by all RCU flavors. | ||
| 747 | */ | ||
| 748 | |||
| 749 | #ifdef CONFIG_DEBUG_OBJECTS_RCU_HEAD | ||
| 750 | # define STATE_RCU_HEAD_READY 0 | ||
| 751 | # define STATE_RCU_HEAD_QUEUED 1 | ||
| 752 | |||
| 753 | extern struct debug_obj_descr rcuhead_debug_descr; | ||
| 754 | |||
| 755 | static inline void debug_rcu_head_queue(struct rcu_head *head) | ||
| 756 | { | ||
| 757 | debug_object_activate(head, &rcuhead_debug_descr); | ||
| 758 | debug_object_active_state(head, &rcuhead_debug_descr, | ||
| 759 | STATE_RCU_HEAD_READY, | ||
| 760 | STATE_RCU_HEAD_QUEUED); | ||
| 761 | } | ||
| 762 | |||
| 763 | static inline void debug_rcu_head_unqueue(struct rcu_head *head) | ||
| 764 | { | ||
| 765 | debug_object_active_state(head, &rcuhead_debug_descr, | ||
| 766 | STATE_RCU_HEAD_QUEUED, | ||
| 767 | STATE_RCU_HEAD_READY); | ||
| 768 | debug_object_deactivate(head, &rcuhead_debug_descr); | ||
| 769 | } | ||
| 770 | #else /* !CONFIG_DEBUG_OBJECTS_RCU_HEAD */ | ||
| 771 | static inline void debug_rcu_head_queue(struct rcu_head *head) | ||
| 772 | { | ||
| 773 | } | ||
| 774 | |||
| 775 | static inline void debug_rcu_head_unqueue(struct rcu_head *head) | ||
| 776 | { | ||
| 777 | } | ||
| 778 | #endif /* #else !CONFIG_DEBUG_OBJECTS_RCU_HEAD */ | ||
| 779 | |||
| 520 | #endif /* __LINUX_RCUPDATE_H */ | 780 | #endif /* __LINUX_RCUPDATE_H */ |
diff --git a/include/linux/rcutiny.h b/include/linux/rcutiny.h index e2e893144a84..13877cb93a60 100644 --- a/include/linux/rcutiny.h +++ b/include/linux/rcutiny.h | |||
| @@ -27,103 +27,101 @@ | |||
| 27 | 27 | ||
| 28 | #include <linux/cache.h> | 28 | #include <linux/cache.h> |
| 29 | 29 | ||
| 30 | void rcu_sched_qs(int cpu); | 30 | #define rcu_init_sched() do { } while (0) |
| 31 | void rcu_bh_qs(int cpu); | ||
| 32 | static inline void rcu_note_context_switch(int cpu) | ||
| 33 | { | ||
| 34 | rcu_sched_qs(cpu); | ||
| 35 | } | ||
| 36 | 31 | ||
| 37 | #define __rcu_read_lock() preempt_disable() | 32 | #ifdef CONFIG_TINY_RCU |
| 38 | #define __rcu_read_unlock() preempt_enable() | ||
| 39 | #define __rcu_read_lock_bh() local_bh_disable() | ||
| 40 | #define __rcu_read_unlock_bh() local_bh_enable() | ||
| 41 | #define call_rcu_sched call_rcu | ||
| 42 | 33 | ||
| 43 | #define rcu_init_sched() do { } while (0) | 34 | static inline void synchronize_rcu_expedited(void) |
| 44 | extern void rcu_check_callbacks(int cpu, int user); | 35 | { |
| 36 | synchronize_sched(); /* Only one CPU, so pretty fast anyway!!! */ | ||
| 37 | } | ||
| 45 | 38 | ||
| 46 | static inline int rcu_needs_cpu(int cpu) | 39 | static inline void rcu_barrier(void) |
| 47 | { | 40 | { |
| 48 | return 0; | 41 | rcu_barrier_sched(); /* Only one CPU, so only one list of callbacks! */ |
| 49 | } | 42 | } |
| 50 | 43 | ||
| 51 | /* | 44 | #else /* #ifdef CONFIG_TINY_RCU */ |
| 52 | * Return the number of grace periods. | 45 | |
| 53 | */ | 46 | void rcu_barrier(void); |
| 54 | static inline long rcu_batches_completed(void) | 47 | void synchronize_rcu_expedited(void); |
| 48 | |||
| 49 | #endif /* #else #ifdef CONFIG_TINY_RCU */ | ||
| 50 | |||
| 51 | static inline void synchronize_rcu_bh(void) | ||
| 55 | { | 52 | { |
| 56 | return 0; | 53 | synchronize_sched(); |
| 57 | } | 54 | } |
| 58 | 55 | ||
| 59 | /* | 56 | static inline void synchronize_rcu_bh_expedited(void) |
| 60 | * Return the number of bottom-half grace periods. | ||
| 61 | */ | ||
| 62 | static inline long rcu_batches_completed_bh(void) | ||
| 63 | { | 57 | { |
| 64 | return 0; | 58 | synchronize_sched(); |
| 65 | } | 59 | } |
| 66 | 60 | ||
| 67 | static inline void rcu_force_quiescent_state(void) | 61 | #ifdef CONFIG_TINY_RCU |
| 62 | |||
| 63 | static inline void rcu_preempt_note_context_switch(void) | ||
| 68 | { | 64 | { |
| 69 | } | 65 | } |
| 70 | 66 | ||
| 71 | static inline void rcu_bh_force_quiescent_state(void) | 67 | static inline void exit_rcu(void) |
| 72 | { | 68 | { |
| 73 | } | 69 | } |
| 74 | 70 | ||
| 75 | static inline void rcu_sched_force_quiescent_state(void) | 71 | static inline int rcu_needs_cpu(int cpu) |
| 76 | { | 72 | { |
| 73 | return 0; | ||
| 77 | } | 74 | } |
| 78 | 75 | ||
| 79 | extern void synchronize_sched(void); | 76 | #else /* #ifdef CONFIG_TINY_RCU */ |
| 77 | |||
| 78 | void rcu_preempt_note_context_switch(void); | ||
| 79 | extern void exit_rcu(void); | ||
| 80 | int rcu_preempt_needs_cpu(void); | ||
| 80 | 81 | ||
| 81 | static inline void synchronize_rcu(void) | 82 | static inline int rcu_needs_cpu(int cpu) |
| 82 | { | 83 | { |
| 83 | synchronize_sched(); | 84 | return rcu_preempt_needs_cpu(); |
| 84 | } | 85 | } |
| 85 | 86 | ||
| 86 | static inline void synchronize_rcu_bh(void) | 87 | #endif /* #else #ifdef CONFIG_TINY_RCU */ |
| 88 | |||
| 89 | static inline void rcu_note_context_switch(int cpu) | ||
| 87 | { | 90 | { |
| 88 | synchronize_sched(); | 91 | rcu_sched_qs(cpu); |
| 92 | rcu_preempt_note_context_switch(); | ||
| 89 | } | 93 | } |
| 90 | 94 | ||
| 91 | static inline void synchronize_rcu_expedited(void) | 95 | /* |
| 96 | * Return the number of grace periods. | ||
| 97 | */ | ||
| 98 | static inline long rcu_batches_completed(void) | ||
| 92 | { | 99 | { |
| 93 | synchronize_sched(); | 100 | return 0; |
| 94 | } | 101 | } |
| 95 | 102 | ||
| 96 | static inline void synchronize_rcu_bh_expedited(void) | 103 | /* |
| 104 | * Return the number of bottom-half grace periods. | ||
| 105 | */ | ||
| 106 | static inline long rcu_batches_completed_bh(void) | ||
| 97 | { | 107 | { |
| 98 | synchronize_sched(); | 108 | return 0; |
| 99 | } | 109 | } |
| 100 | 110 | ||
| 101 | struct notifier_block; | 111 | static inline void rcu_force_quiescent_state(void) |
| 102 | |||
| 103 | #ifdef CONFIG_NO_HZ | ||
| 104 | |||
| 105 | extern void rcu_enter_nohz(void); | ||
| 106 | extern void rcu_exit_nohz(void); | ||
| 107 | |||
| 108 | #else /* #ifdef CONFIG_NO_HZ */ | ||
| 109 | |||
| 110 | static inline void rcu_enter_nohz(void) | ||
| 111 | { | 112 | { |
| 112 | } | 113 | } |
| 113 | 114 | ||
| 114 | static inline void rcu_exit_nohz(void) | 115 | static inline void rcu_bh_force_quiescent_state(void) |
| 115 | { | 116 | { |
| 116 | } | 117 | } |
| 117 | 118 | ||
| 118 | #endif /* #else #ifdef CONFIG_NO_HZ */ | 119 | static inline void rcu_sched_force_quiescent_state(void) |
| 119 | |||
| 120 | static inline void exit_rcu(void) | ||
| 121 | { | 120 | { |
| 122 | } | 121 | } |
| 123 | 122 | ||
| 124 | static inline int rcu_preempt_depth(void) | 123 | static inline void rcu_cpu_stall_reset(void) |
| 125 | { | 124 | { |
| 126 | return 0; | ||
| 127 | } | 125 | } |
| 128 | 126 | ||
| 129 | #ifdef CONFIG_DEBUG_LOCK_ALLOC | 127 | #ifdef CONFIG_DEBUG_LOCK_ALLOC |
diff --git a/include/linux/rcutree.h b/include/linux/rcutree.h index c0ed1c056f29..95518e628794 100644 --- a/include/linux/rcutree.h +++ b/include/linux/rcutree.h | |||
| @@ -30,64 +30,23 @@ | |||
| 30 | #ifndef __LINUX_RCUTREE_H | 30 | #ifndef __LINUX_RCUTREE_H |
| 31 | #define __LINUX_RCUTREE_H | 31 | #define __LINUX_RCUTREE_H |
| 32 | 32 | ||
| 33 | struct notifier_block; | ||
| 34 | |||
| 35 | extern void rcu_sched_qs(int cpu); | ||
| 36 | extern void rcu_bh_qs(int cpu); | ||
| 37 | extern void rcu_note_context_switch(int cpu); | 33 | extern void rcu_note_context_switch(int cpu); |
| 38 | extern int rcu_needs_cpu(int cpu); | 34 | extern int rcu_needs_cpu(int cpu); |
| 35 | extern void rcu_cpu_stall_reset(void); | ||
| 39 | 36 | ||
| 40 | #ifdef CONFIG_TREE_PREEMPT_RCU | 37 | #ifdef CONFIG_TREE_PREEMPT_RCU |
| 41 | 38 | ||
| 42 | extern void __rcu_read_lock(void); | ||
| 43 | extern void __rcu_read_unlock(void); | ||
| 44 | extern void synchronize_rcu(void); | ||
| 45 | extern void exit_rcu(void); | 39 | extern void exit_rcu(void); |
| 46 | 40 | ||
| 47 | /* | ||
| 48 | * Defined as macro as it is a very low level header | ||
| 49 | * included from areas that don't even know about current | ||
| 50 | */ | ||
| 51 | #define rcu_preempt_depth() (current->rcu_read_lock_nesting) | ||
| 52 | |||
| 53 | #else /* #ifdef CONFIG_TREE_PREEMPT_RCU */ | 41 | #else /* #ifdef CONFIG_TREE_PREEMPT_RCU */ |
| 54 | 42 | ||
| 55 | static inline void __rcu_read_lock(void) | ||
| 56 | { | ||
| 57 | preempt_disable(); | ||
| 58 | } | ||
| 59 | |||
| 60 | static inline void __rcu_read_unlock(void) | ||
| 61 | { | ||
| 62 | preempt_enable(); | ||
| 63 | } | ||
| 64 | |||
| 65 | #define synchronize_rcu synchronize_sched | ||
| 66 | |||
| 67 | static inline void exit_rcu(void) | 43 | static inline void exit_rcu(void) |
| 68 | { | 44 | { |
| 69 | } | 45 | } |
| 70 | 46 | ||
| 71 | static inline int rcu_preempt_depth(void) | ||
| 72 | { | ||
| 73 | return 0; | ||
| 74 | } | ||
| 75 | |||
| 76 | #endif /* #else #ifdef CONFIG_TREE_PREEMPT_RCU */ | 47 | #endif /* #else #ifdef CONFIG_TREE_PREEMPT_RCU */ |
| 77 | 48 | ||
| 78 | static inline void __rcu_read_lock_bh(void) | ||
| 79 | { | ||
| 80 | local_bh_disable(); | ||
| 81 | } | ||
| 82 | static inline void __rcu_read_unlock_bh(void) | ||
| 83 | { | ||
| 84 | local_bh_enable(); | ||
| 85 | } | ||
| 86 | |||
| 87 | extern void call_rcu_sched(struct rcu_head *head, | ||
| 88 | void (*func)(struct rcu_head *rcu)); | ||
| 89 | extern void synchronize_rcu_bh(void); | 49 | extern void synchronize_rcu_bh(void); |
| 90 | extern void synchronize_sched(void); | ||
| 91 | extern void synchronize_rcu_expedited(void); | 50 | extern void synchronize_rcu_expedited(void); |
| 92 | 51 | ||
| 93 | static inline void synchronize_rcu_bh_expedited(void) | 52 | static inline void synchronize_rcu_bh_expedited(void) |
| @@ -95,7 +54,7 @@ static inline void synchronize_rcu_bh_expedited(void) | |||
| 95 | synchronize_sched_expedited(); | 54 | synchronize_sched_expedited(); |
| 96 | } | 55 | } |
| 97 | 56 | ||
| 98 | extern void rcu_check_callbacks(int cpu, int user); | 57 | extern void rcu_barrier(void); |
| 99 | 58 | ||
| 100 | extern long rcu_batches_completed(void); | 59 | extern long rcu_batches_completed(void); |
| 101 | extern long rcu_batches_completed_bh(void); | 60 | extern long rcu_batches_completed_bh(void); |
| @@ -104,18 +63,6 @@ extern void rcu_force_quiescent_state(void); | |||
| 104 | extern void rcu_bh_force_quiescent_state(void); | 63 | extern void rcu_bh_force_quiescent_state(void); |
| 105 | extern void rcu_sched_force_quiescent_state(void); | 64 | extern void rcu_sched_force_quiescent_state(void); |
| 106 | 65 | ||
| 107 | #ifdef CONFIG_NO_HZ | ||
| 108 | void rcu_enter_nohz(void); | ||
| 109 | void rcu_exit_nohz(void); | ||
| 110 | #else /* CONFIG_NO_HZ */ | ||
| 111 | static inline void rcu_enter_nohz(void) | ||
| 112 | { | ||
| 113 | } | ||
| 114 | static inline void rcu_exit_nohz(void) | ||
| 115 | { | ||
| 116 | } | ||
| 117 | #endif /* CONFIG_NO_HZ */ | ||
| 118 | |||
| 119 | /* A context switch is a grace period for RCU-sched and RCU-bh. */ | 66 | /* A context switch is a grace period for RCU-sched and RCU-bh. */ |
| 120 | static inline int rcu_blocking_is_gp(void) | 67 | static inline int rcu_blocking_is_gp(void) |
| 121 | { | 68 | { |
diff --git a/include/linux/rds.h b/include/linux/rds.h index cab4994c2f63..91950950aa59 100644 --- a/include/linux/rds.h +++ b/include/linux/rds.h | |||
| @@ -36,15 +36,6 @@ | |||
| 36 | 36 | ||
| 37 | #include <linux/types.h> | 37 | #include <linux/types.h> |
| 38 | 38 | ||
| 39 | /* These sparse annotated types shouldn't be in any user | ||
| 40 | * visible header file. We should clean this up rather | ||
| 41 | * than kludging around them. */ | ||
| 42 | #ifndef __KERNEL__ | ||
| 43 | #define __be16 u_int16_t | ||
| 44 | #define __be32 u_int32_t | ||
| 45 | #define __be64 u_int64_t | ||
| 46 | #endif | ||
| 47 | |||
| 48 | #define RDS_IB_ABI_VERSION 0x301 | 39 | #define RDS_IB_ABI_VERSION 0x301 |
| 49 | 40 | ||
| 50 | /* | 41 | /* |
| @@ -82,6 +73,10 @@ | |||
| 82 | #define RDS_CMSG_RDMA_MAP 3 | 73 | #define RDS_CMSG_RDMA_MAP 3 |
| 83 | #define RDS_CMSG_RDMA_STATUS 4 | 74 | #define RDS_CMSG_RDMA_STATUS 4 |
| 84 | #define RDS_CMSG_CONG_UPDATE 5 | 75 | #define RDS_CMSG_CONG_UPDATE 5 |
| 76 | #define RDS_CMSG_ATOMIC_FADD 6 | ||
| 77 | #define RDS_CMSG_ATOMIC_CSWP 7 | ||
| 78 | #define RDS_CMSG_MASKED_ATOMIC_FADD 8 | ||
| 79 | #define RDS_CMSG_MASKED_ATOMIC_CSWP 9 | ||
| 85 | 80 | ||
| 86 | #define RDS_INFO_FIRST 10000 | 81 | #define RDS_INFO_FIRST 10000 |
| 87 | #define RDS_INFO_COUNTERS 10000 | 82 | #define RDS_INFO_COUNTERS 10000 |
| @@ -98,8 +93,8 @@ | |||
| 98 | #define RDS_INFO_LAST 10010 | 93 | #define RDS_INFO_LAST 10010 |
| 99 | 94 | ||
| 100 | struct rds_info_counter { | 95 | struct rds_info_counter { |
| 101 | u_int8_t name[32]; | 96 | uint8_t name[32]; |
| 102 | u_int64_t value; | 97 | uint64_t value; |
| 103 | } __attribute__((packed)); | 98 | } __attribute__((packed)); |
| 104 | 99 | ||
| 105 | #define RDS_INFO_CONNECTION_FLAG_SENDING 0x01 | 100 | #define RDS_INFO_CONNECTION_FLAG_SENDING 0x01 |
| @@ -109,43 +104,35 @@ struct rds_info_counter { | |||
| 109 | #define TRANSNAMSIZ 16 | 104 | #define TRANSNAMSIZ 16 |
| 110 | 105 | ||
| 111 | struct rds_info_connection { | 106 | struct rds_info_connection { |
| 112 | u_int64_t next_tx_seq; | 107 | uint64_t next_tx_seq; |
| 113 | u_int64_t next_rx_seq; | 108 | uint64_t next_rx_seq; |
| 114 | __be32 laddr; | 109 | __be32 laddr; |
| 115 | __be32 faddr; | 110 | __be32 faddr; |
| 116 | u_int8_t transport[TRANSNAMSIZ]; /* null term ascii */ | 111 | uint8_t transport[TRANSNAMSIZ]; /* null term ascii */ |
| 117 | u_int8_t flags; | 112 | uint8_t flags; |
| 118 | } __attribute__((packed)); | ||
| 119 | |||
| 120 | struct rds_info_flow { | ||
| 121 | __be32 laddr; | ||
| 122 | __be32 faddr; | ||
| 123 | u_int32_t bytes; | ||
| 124 | __be16 lport; | ||
| 125 | __be16 fport; | ||
| 126 | } __attribute__((packed)); | 113 | } __attribute__((packed)); |
| 127 | 114 | ||
| 128 | #define RDS_INFO_MESSAGE_FLAG_ACK 0x01 | 115 | #define RDS_INFO_MESSAGE_FLAG_ACK 0x01 |
| 129 | #define RDS_INFO_MESSAGE_FLAG_FAST_ACK 0x02 | 116 | #define RDS_INFO_MESSAGE_FLAG_FAST_ACK 0x02 |
| 130 | 117 | ||
| 131 | struct rds_info_message { | 118 | struct rds_info_message { |
| 132 | u_int64_t seq; | 119 | uint64_t seq; |
| 133 | u_int32_t len; | 120 | uint32_t len; |
| 134 | __be32 laddr; | 121 | __be32 laddr; |
| 135 | __be32 faddr; | 122 | __be32 faddr; |
| 136 | __be16 lport; | 123 | __be16 lport; |
| 137 | __be16 fport; | 124 | __be16 fport; |
| 138 | u_int8_t flags; | 125 | uint8_t flags; |
| 139 | } __attribute__((packed)); | 126 | } __attribute__((packed)); |
| 140 | 127 | ||
| 141 | struct rds_info_socket { | 128 | struct rds_info_socket { |
| 142 | u_int32_t sndbuf; | 129 | uint32_t sndbuf; |
| 143 | __be32 bound_addr; | 130 | __be32 bound_addr; |
| 144 | __be32 connected_addr; | 131 | __be32 connected_addr; |
| 145 | __be16 bound_port; | 132 | __be16 bound_port; |
| 146 | __be16 connected_port; | 133 | __be16 connected_port; |
| 147 | u_int32_t rcvbuf; | 134 | uint32_t rcvbuf; |
| 148 | u_int64_t inum; | 135 | uint64_t inum; |
| 149 | } __attribute__((packed)); | 136 | } __attribute__((packed)); |
| 150 | 137 | ||
| 151 | struct rds_info_tcp_socket { | 138 | struct rds_info_tcp_socket { |
| @@ -153,11 +140,11 @@ struct rds_info_tcp_socket { | |||
| 153 | __be16 local_port; | 140 | __be16 local_port; |
| 154 | __be32 peer_addr; | 141 | __be32 peer_addr; |
| 155 | __be16 peer_port; | 142 | __be16 peer_port; |
| 156 | u_int64_t hdr_rem; | 143 | uint64_t hdr_rem; |
| 157 | u_int64_t data_rem; | 144 | uint64_t data_rem; |
| 158 | u_int32_t last_sent_nxt; | 145 | uint32_t last_sent_nxt; |
| 159 | u_int32_t last_expected_una; | 146 | uint32_t last_expected_una; |
| 160 | u_int32_t last_seen_una; | 147 | uint32_t last_seen_una; |
| 161 | } __attribute__((packed)); | 148 | } __attribute__((packed)); |
| 162 | 149 | ||
| 163 | #define RDS_IB_GID_LEN 16 | 150 | #define RDS_IB_GID_LEN 16 |
| @@ -212,42 +199,69 @@ struct rds_info_rdma_connection { | |||
| 212 | * (so that the application does not have to worry about | 199 | * (so that the application does not have to worry about |
| 213 | * alignment). | 200 | * alignment). |
| 214 | */ | 201 | */ |
| 215 | typedef u_int64_t rds_rdma_cookie_t; | 202 | typedef uint64_t rds_rdma_cookie_t; |
| 216 | 203 | ||
| 217 | struct rds_iovec { | 204 | struct rds_iovec { |
| 218 | u_int64_t addr; | 205 | uint64_t addr; |
| 219 | u_int64_t bytes; | 206 | uint64_t bytes; |
| 220 | }; | 207 | }; |
| 221 | 208 | ||
| 222 | struct rds_get_mr_args { | 209 | struct rds_get_mr_args { |
| 223 | struct rds_iovec vec; | 210 | struct rds_iovec vec; |
| 224 | u_int64_t cookie_addr; | 211 | uint64_t cookie_addr; |
| 225 | uint64_t flags; | 212 | uint64_t flags; |
| 226 | }; | 213 | }; |
| 227 | 214 | ||
| 228 | struct rds_get_mr_for_dest_args { | 215 | struct rds_get_mr_for_dest_args { |
| 229 | struct sockaddr_storage dest_addr; | 216 | struct sockaddr_storage dest_addr; |
| 230 | struct rds_iovec vec; | 217 | struct rds_iovec vec; |
| 231 | u_int64_t cookie_addr; | 218 | uint64_t cookie_addr; |
| 232 | uint64_t flags; | 219 | uint64_t flags; |
| 233 | }; | 220 | }; |
| 234 | 221 | ||
| 235 | struct rds_free_mr_args { | 222 | struct rds_free_mr_args { |
| 236 | rds_rdma_cookie_t cookie; | 223 | rds_rdma_cookie_t cookie; |
| 237 | u_int64_t flags; | 224 | uint64_t flags; |
| 238 | }; | 225 | }; |
| 239 | 226 | ||
| 240 | struct rds_rdma_args { | 227 | struct rds_rdma_args { |
| 241 | rds_rdma_cookie_t cookie; | 228 | rds_rdma_cookie_t cookie; |
| 242 | struct rds_iovec remote_vec; | 229 | struct rds_iovec remote_vec; |
| 243 | u_int64_t local_vec_addr; | 230 | uint64_t local_vec_addr; |
| 244 | u_int64_t nr_local; | 231 | uint64_t nr_local; |
| 245 | u_int64_t flags; | 232 | uint64_t flags; |
| 246 | u_int64_t user_token; | 233 | uint64_t user_token; |
| 234 | }; | ||
| 235 | |||
| 236 | struct rds_atomic_args { | ||
| 237 | rds_rdma_cookie_t cookie; | ||
| 238 | uint64_t local_addr; | ||
| 239 | uint64_t remote_addr; | ||
| 240 | union { | ||
| 241 | struct { | ||
| 242 | uint64_t compare; | ||
| 243 | uint64_t swap; | ||
| 244 | } cswp; | ||
| 245 | struct { | ||
| 246 | uint64_t add; | ||
| 247 | } fadd; | ||
| 248 | struct { | ||
| 249 | uint64_t compare; | ||
| 250 | uint64_t swap; | ||
| 251 | uint64_t compare_mask; | ||
| 252 | uint64_t swap_mask; | ||
| 253 | } m_cswp; | ||
| 254 | struct { | ||
| 255 | uint64_t add; | ||
| 256 | uint64_t nocarry_mask; | ||
| 257 | } m_fadd; | ||
| 258 | }; | ||
| 259 | uint64_t flags; | ||
| 260 | uint64_t user_token; | ||
| 247 | }; | 261 | }; |
| 248 | 262 | ||
| 249 | struct rds_rdma_notify { | 263 | struct rds_rdma_notify { |
| 250 | u_int64_t user_token; | 264 | uint64_t user_token; |
| 251 | int32_t status; | 265 | int32_t status; |
| 252 | }; | 266 | }; |
| 253 | 267 | ||
| @@ -266,5 +280,6 @@ struct rds_rdma_notify { | |||
| 266 | #define RDS_RDMA_USE_ONCE 0x0008 /* free MR after use */ | 280 | #define RDS_RDMA_USE_ONCE 0x0008 /* free MR after use */ |
| 267 | #define RDS_RDMA_DONTWAIT 0x0010 /* Don't wait in SET_BARRIER */ | 281 | #define RDS_RDMA_DONTWAIT 0x0010 /* Don't wait in SET_BARRIER */ |
| 268 | #define RDS_RDMA_NOTIFY_ME 0x0020 /* Notify when operation completes */ | 282 | #define RDS_RDMA_NOTIFY_ME 0x0020 /* Notify when operation completes */ |
| 283 | #define RDS_RDMA_SILENT 0x0040 /* Do not interrupt remote */ | ||
| 269 | 284 | ||
| 270 | #endif /* IB_RDS_H */ | 285 | #endif /* IB_RDS_H */ |
diff --git a/include/linux/regulator/ab8500.h b/include/linux/regulator/ab8500.h new file mode 100644 index 000000000000..f509877c2ed4 --- /dev/null +++ b/include/linux/regulator/ab8500.h | |||
| @@ -0,0 +1,25 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) ST-Ericsson SA 2010 | ||
| 3 | * | ||
| 4 | * License Terms: GNU General Public License v2 | ||
| 5 | * | ||
| 6 | * Author: Sundar Iyer <sundar.iyer@stericsson.com> for ST-Ericsson | ||
| 7 | * | ||
| 8 | */ | ||
| 9 | |||
| 10 | #ifndef __LINUX_MFD_AB8500_REGULATOR_H | ||
| 11 | #define __LINUX_MFD_AB8500_REGULATOR_H | ||
| 12 | |||
| 13 | /* AB8500 regulators */ | ||
| 14 | #define AB8500_LDO_AUX1 0 | ||
| 15 | #define AB8500_LDO_AUX2 1 | ||
| 16 | #define AB8500_LDO_AUX3 2 | ||
| 17 | #define AB8500_LDO_INTCORE 3 | ||
| 18 | #define AB8500_LDO_TVOUT 4 | ||
| 19 | #define AB8500_LDO_AUDIO 5 | ||
| 20 | #define AB8500_LDO_ANAMIC1 6 | ||
| 21 | #define AB8500_LDO_ANAMIC2 7 | ||
| 22 | #define AB8500_LDO_DMIC 8 | ||
| 23 | #define AB8500_LDO_ANA 9 | ||
| 24 | |||
| 25 | #endif | ||
diff --git a/include/linux/regulator/lp3972.h b/include/linux/regulator/lp3972.h new file mode 100644 index 000000000000..9bb7389b7a1e --- /dev/null +++ b/include/linux/regulator/lp3972.h | |||
| @@ -0,0 +1,48 @@ | |||
| 1 | /* | ||
| 2 | * National Semiconductors LP3972 PMIC chip client interface | ||
| 3 | * | ||
| 4 | * Based on lp3971.h | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify | ||
| 7 | * it under the terms of the GNU General Public License as published by | ||
| 8 | * the Free Software Foundation; either version 2 of the License, or | ||
| 9 | * (at your option) any later version. | ||
| 10 | * | ||
| 11 | * This program is distributed in the hope that it will be useful, | ||
| 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 14 | * GNU General Public License for more details. | ||
| 15 | * | ||
| 16 | * You should have received a copy of the GNU General Public License | ||
| 17 | * along with this program; if not, write to the Free Software | ||
| 18 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
| 19 | */ | ||
| 20 | |||
| 21 | #ifndef __LINUX_REGULATOR_LP3972_H | ||
| 22 | #define __LINUX_REGULATOR_LP3972_H | ||
| 23 | |||
| 24 | #include <linux/regulator/machine.h> | ||
| 25 | |||
| 26 | #define LP3972_LDO1 0 | ||
| 27 | #define LP3972_LDO2 1 | ||
| 28 | #define LP3972_LDO3 2 | ||
| 29 | #define LP3972_LDO4 3 | ||
| 30 | #define LP3972_LDO5 4 | ||
| 31 | |||
| 32 | #define LP3972_DCDC1 5 | ||
| 33 | #define LP3972_DCDC2 6 | ||
| 34 | #define LP3972_DCDC3 7 | ||
| 35 | |||
| 36 | #define LP3972_NUM_REGULATORS 8 | ||
| 37 | |||
| 38 | struct lp3972_regulator_subdev { | ||
| 39 | int id; | ||
| 40 | struct regulator_init_data *initdata; | ||
| 41 | }; | ||
| 42 | |||
| 43 | struct lp3972_platform_data { | ||
| 44 | int num_regulators; | ||
| 45 | struct lp3972_regulator_subdev *regulators; | ||
| 46 | }; | ||
| 47 | |||
| 48 | #endif | ||
diff --git a/include/linux/regulator/machine.h b/include/linux/regulator/machine.h index e2980287245e..761c745b9c24 100644 --- a/include/linux/regulator/machine.h +++ b/include/linux/regulator/machine.h | |||
| @@ -189,10 +189,15 @@ int regulator_suspend_prepare(suspend_state_t state); | |||
| 189 | 189 | ||
| 190 | #ifdef CONFIG_REGULATOR | 190 | #ifdef CONFIG_REGULATOR |
| 191 | void regulator_has_full_constraints(void); | 191 | void regulator_has_full_constraints(void); |
| 192 | void regulator_use_dummy_regulator(void); | ||
| 192 | #else | 193 | #else |
| 193 | static inline void regulator_has_full_constraints(void) | 194 | static inline void regulator_has_full_constraints(void) |
| 194 | { | 195 | { |
| 195 | } | 196 | } |
| 197 | |||
| 198 | static inline void regulator_use_dummy_regulator(void) | ||
| 199 | { | ||
| 200 | } | ||
| 196 | #endif | 201 | #endif |
| 197 | 202 | ||
| 198 | #endif | 203 | #endif |
diff --git a/include/linux/regulator/max8952.h b/include/linux/regulator/max8952.h new file mode 100644 index 000000000000..45e42855ad05 --- /dev/null +++ b/include/linux/regulator/max8952.h | |||
| @@ -0,0 +1,135 @@ | |||
| 1 | /* | ||
| 2 | * max8952.h - Voltage regulation for the Maxim 8952 | ||
| 3 | * | ||
| 4 | * Copyright (C) 2010 Samsung Electrnoics | ||
| 5 | * MyungJoo Ham <myungjoo.ham@samsung.com> | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License as published by | ||
| 9 | * the Free Software Foundation; either version 2 of the License, or | ||
| 10 | * (at your option) any later version. | ||
| 11 | * | ||
| 12 | * This program is distributed in the hope that it will be useful, | ||
| 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 15 | * GNU General Public License for more details. | ||
| 16 | * | ||
| 17 | * You should have received a copy of the GNU General Public License | ||
| 18 | * along with this program; if not, write to the Free Software | ||
| 19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 20 | */ | ||
| 21 | |||
| 22 | #ifndef REGULATOR_MAX8952 | ||
| 23 | #define REGULATOR_MAX8952 | ||
| 24 | |||
| 25 | #include <linux/regulator/machine.h> | ||
| 26 | |||
| 27 | enum { | ||
| 28 | MAX8952_DVS_MODE0, | ||
| 29 | MAX8952_DVS_MODE1, | ||
| 30 | MAX8952_DVS_MODE2, | ||
| 31 | MAX8952_DVS_MODE3, | ||
| 32 | }; | ||
| 33 | |||
| 34 | enum { | ||
| 35 | MAX8952_DVS_770mV = 0, | ||
| 36 | MAX8952_DVS_780mV, | ||
| 37 | MAX8952_DVS_790mV, | ||
| 38 | MAX8952_DVS_800mV, | ||
| 39 | MAX8952_DVS_810mV, | ||
| 40 | MAX8952_DVS_820mV, | ||
| 41 | MAX8952_DVS_830mV, | ||
| 42 | MAX8952_DVS_840mV, | ||
| 43 | MAX8952_DVS_850mV, | ||
| 44 | MAX8952_DVS_860mV, | ||
| 45 | MAX8952_DVS_870mV, | ||
| 46 | MAX8952_DVS_880mV, | ||
| 47 | MAX8952_DVS_890mV, | ||
| 48 | MAX8952_DVS_900mV, | ||
| 49 | MAX8952_DVS_910mV, | ||
| 50 | MAX8952_DVS_920mV, | ||
| 51 | MAX8952_DVS_930mV, | ||
| 52 | MAX8952_DVS_940mV, | ||
| 53 | MAX8952_DVS_950mV, | ||
| 54 | MAX8952_DVS_960mV, | ||
| 55 | MAX8952_DVS_970mV, | ||
| 56 | MAX8952_DVS_980mV, | ||
| 57 | MAX8952_DVS_990mV, | ||
| 58 | MAX8952_DVS_1000mV, | ||
| 59 | MAX8952_DVS_1010mV, | ||
| 60 | MAX8952_DVS_1020mV, | ||
| 61 | MAX8952_DVS_1030mV, | ||
| 62 | MAX8952_DVS_1040mV, | ||
| 63 | MAX8952_DVS_1050mV, | ||
| 64 | MAX8952_DVS_1060mV, | ||
| 65 | MAX8952_DVS_1070mV, | ||
| 66 | MAX8952_DVS_1080mV, | ||
| 67 | MAX8952_DVS_1090mV, | ||
| 68 | MAX8952_DVS_1100mV, | ||
| 69 | MAX8952_DVS_1110mV, | ||
| 70 | MAX8952_DVS_1120mV, | ||
| 71 | MAX8952_DVS_1130mV, | ||
| 72 | MAX8952_DVS_1140mV, | ||
| 73 | MAX8952_DVS_1150mV, | ||
| 74 | MAX8952_DVS_1160mV, | ||
| 75 | MAX8952_DVS_1170mV, | ||
| 76 | MAX8952_DVS_1180mV, | ||
| 77 | MAX8952_DVS_1190mV, | ||
| 78 | MAX8952_DVS_1200mV, | ||
| 79 | MAX8952_DVS_1210mV, | ||
| 80 | MAX8952_DVS_1220mV, | ||
| 81 | MAX8952_DVS_1230mV, | ||
| 82 | MAX8952_DVS_1240mV, | ||
| 83 | MAX8952_DVS_1250mV, | ||
| 84 | MAX8952_DVS_1260mV, | ||
| 85 | MAX8952_DVS_1270mV, | ||
| 86 | MAX8952_DVS_1280mV, | ||
| 87 | MAX8952_DVS_1290mV, | ||
| 88 | MAX8952_DVS_1300mV, | ||
| 89 | MAX8952_DVS_1310mV, | ||
| 90 | MAX8952_DVS_1320mV, | ||
| 91 | MAX8952_DVS_1330mV, | ||
| 92 | MAX8952_DVS_1340mV, | ||
| 93 | MAX8952_DVS_1350mV, | ||
| 94 | MAX8952_DVS_1360mV, | ||
| 95 | MAX8952_DVS_1370mV, | ||
| 96 | MAX8952_DVS_1380mV, | ||
| 97 | MAX8952_DVS_1390mV, | ||
| 98 | MAX8952_DVS_1400mV, | ||
| 99 | }; | ||
| 100 | |||
| 101 | enum { | ||
| 102 | MAX8952_SYNC_FREQ_26MHZ, /* Default */ | ||
| 103 | MAX8952_SYNC_FREQ_13MHZ, | ||
| 104 | MAX8952_SYNC_FREQ_19_2MHZ, | ||
| 105 | }; | ||
| 106 | |||
| 107 | enum { | ||
| 108 | MAX8952_RAMP_32mV_us = 0, /* Default */ | ||
| 109 | MAX8952_RAMP_16mV_us, | ||
| 110 | MAX8952_RAMP_8mV_us, | ||
| 111 | MAX8952_RAMP_4mV_us, | ||
| 112 | MAX8952_RAMP_2mV_us, | ||
| 113 | MAX8952_RAMP_1mV_us, | ||
| 114 | MAX8952_RAMP_0_5mV_us, | ||
| 115 | MAX8952_RAMP_0_25mV_us, | ||
| 116 | }; | ||
| 117 | |||
| 118 | #define MAX8952_NUM_DVS_MODE 4 | ||
| 119 | |||
| 120 | struct max8952_platform_data { | ||
| 121 | int gpio_vid0; | ||
| 122 | int gpio_vid1; | ||
| 123 | int gpio_en; | ||
| 124 | |||
| 125 | u8 default_mode; | ||
| 126 | u8 dvs_mode[MAX8952_NUM_DVS_MODE]; /* MAX8952_DVS_MODEx_XXXXmV */ | ||
| 127 | |||
| 128 | u8 sync_freq; | ||
| 129 | u8 ramp_speed; | ||
| 130 | |||
| 131 | struct regulator_init_data reg_data; | ||
| 132 | }; | ||
| 133 | |||
| 134 | |||
| 135 | #endif /* REGULATOR_MAX8952 */ | ||
diff --git a/include/linux/reiserfs_fs.h b/include/linux/reiserfs_fs.h index 3b603f474186..5ca47e59b727 100644 --- a/include/linux/reiserfs_fs.h +++ b/include/linux/reiserfs_fs.h | |||
| @@ -360,7 +360,7 @@ int is_reiserfs_jr(struct reiserfs_super_block *rs); | |||
| 360 | /* the spot for the super in versions 3.5 - 3.5.10 (inclusive) */ | 360 | /* the spot for the super in versions 3.5 - 3.5.10 (inclusive) */ |
| 361 | #define REISERFS_OLD_DISK_OFFSET_IN_BYTES (8 * 1024) | 361 | #define REISERFS_OLD_DISK_OFFSET_IN_BYTES (8 * 1024) |
| 362 | 362 | ||
| 363 | // reiserfs internal error code (used by search_by_key adn fix_nodes)) | 363 | /* reiserfs internal error code (used by search_by_key and fix_nodes)) */ |
| 364 | #define CARRY_ON 0 | 364 | #define CARRY_ON 0 |
| 365 | #define REPEAT_SEARCH -1 | 365 | #define REPEAT_SEARCH -1 |
| 366 | #define IO_ERROR -2 | 366 | #define IO_ERROR -2 |
| @@ -2033,7 +2033,7 @@ void reiserfs_read_locked_inode(struct inode *inode, | |||
| 2033 | struct reiserfs_iget_args *args); | 2033 | struct reiserfs_iget_args *args); |
| 2034 | int reiserfs_find_actor(struct inode *inode, void *p); | 2034 | int reiserfs_find_actor(struct inode *inode, void *p); |
| 2035 | int reiserfs_init_locked_inode(struct inode *inode, void *p); | 2035 | int reiserfs_init_locked_inode(struct inode *inode, void *p); |
| 2036 | void reiserfs_delete_inode(struct inode *inode); | 2036 | void reiserfs_evict_inode(struct inode *inode); |
| 2037 | int reiserfs_write_inode(struct inode *inode, struct writeback_control *wbc); | 2037 | int reiserfs_write_inode(struct inode *inode, struct writeback_control *wbc); |
| 2038 | int reiserfs_get_block(struct inode *inode, sector_t block, | 2038 | int reiserfs_get_block(struct inode *inode, sector_t block, |
| 2039 | struct buffer_head *bh_result, int create); | 2039 | struct buffer_head *bh_result, int create); |
| @@ -2072,6 +2072,8 @@ void sd_attrs_to_i_attrs(__u16 sd_attrs, struct inode *inode); | |||
| 2072 | void i_attrs_to_sd_attrs(struct inode *inode, __u16 * sd_attrs); | 2072 | void i_attrs_to_sd_attrs(struct inode *inode, __u16 * sd_attrs); |
| 2073 | int reiserfs_setattr(struct dentry *dentry, struct iattr *attr); | 2073 | int reiserfs_setattr(struct dentry *dentry, struct iattr *attr); |
| 2074 | 2074 | ||
| 2075 | int __reiserfs_write_begin(struct page *page, unsigned from, unsigned len); | ||
| 2076 | |||
| 2075 | /* namei.c */ | 2077 | /* namei.c */ |
| 2076 | void set_de_name_and_namelen(struct reiserfs_dir_entry *de); | 2078 | void set_de_name_and_namelen(struct reiserfs_dir_entry *de); |
| 2077 | int search_by_entry_key(struct super_block *sb, const struct cpu_key *key, | 2079 | int search_by_entry_key(struct super_block *sb, const struct cpu_key *key, |
diff --git a/include/linux/reiserfs_fs_i.h b/include/linux/reiserfs_fs_i.h index 89f4d3abbf5a..97959bdfe214 100644 --- a/include/linux/reiserfs_fs_i.h +++ b/include/linux/reiserfs_fs_i.h | |||
| @@ -25,7 +25,6 @@ typedef enum { | |||
| 25 | i_link_saved_truncate_mask = 0x0020, | 25 | i_link_saved_truncate_mask = 0x0020, |
| 26 | i_has_xattr_dir = 0x0040, | 26 | i_has_xattr_dir = 0x0040, |
| 27 | i_data_log = 0x0080, | 27 | i_data_log = 0x0080, |
| 28 | i_ever_mapped = 0x0100 | ||
| 29 | } reiserfs_inode_flags; | 28 | } reiserfs_inode_flags; |
| 30 | 29 | ||
| 31 | struct reiserfs_inode_info { | 30 | struct reiserfs_inode_info { |
| @@ -53,7 +52,8 @@ struct reiserfs_inode_info { | |||
| 53 | ** flushed */ | 52 | ** flushed */ |
| 54 | unsigned int i_trans_id; | 53 | unsigned int i_trans_id; |
| 55 | struct reiserfs_journal_list *i_jl; | 54 | struct reiserfs_journal_list *i_jl; |
| 56 | struct mutex i_mmap; | 55 | atomic_t openers; |
| 56 | struct mutex tailpack; | ||
| 57 | #ifdef CONFIG_REISERFS_FS_XATTR | 57 | #ifdef CONFIG_REISERFS_FS_XATTR |
| 58 | struct rw_semaphore i_xattr_sem; | 58 | struct rw_semaphore i_xattr_sem; |
| 59 | #endif | 59 | #endif |
diff --git a/include/linux/resource.h b/include/linux/resource.h index f1e914eefeab..88d36f9145ba 100644 --- a/include/linux/resource.h +++ b/include/linux/resource.h | |||
| @@ -43,6 +43,13 @@ struct rlimit { | |||
| 43 | unsigned long rlim_max; | 43 | unsigned long rlim_max; |
| 44 | }; | 44 | }; |
| 45 | 45 | ||
| 46 | #define RLIM64_INFINITY (~0ULL) | ||
| 47 | |||
| 48 | struct rlimit64 { | ||
| 49 | __u64 rlim_cur; | ||
| 50 | __u64 rlim_max; | ||
| 51 | }; | ||
| 52 | |||
| 46 | #define PRIO_MIN (-20) | 53 | #define PRIO_MIN (-20) |
| 47 | #define PRIO_MAX 20 | 54 | #define PRIO_MAX 20 |
| 48 | 55 | ||
| @@ -73,6 +80,8 @@ struct rlimit { | |||
| 73 | struct task_struct; | 80 | struct task_struct; |
| 74 | 81 | ||
| 75 | int getrusage(struct task_struct *p, int who, struct rusage __user *ru); | 82 | int getrusage(struct task_struct *p, int who, struct rusage __user *ru); |
| 83 | int do_prlimit(struct task_struct *tsk, unsigned int resource, | ||
| 84 | struct rlimit *new_rlim, struct rlimit *old_rlim); | ||
| 76 | 85 | ||
| 77 | #endif /* __KERNEL__ */ | 86 | #endif /* __KERNEL__ */ |
| 78 | 87 | ||
diff --git a/include/linux/resume-trace.h b/include/linux/resume-trace.h index bc8c3881c729..f31db2368782 100644 --- a/include/linux/resume-trace.h +++ b/include/linux/resume-trace.h | |||
| @@ -3,6 +3,7 @@ | |||
| 3 | 3 | ||
| 4 | #ifdef CONFIG_PM_TRACE | 4 | #ifdef CONFIG_PM_TRACE |
| 5 | #include <asm/resume-trace.h> | 5 | #include <asm/resume-trace.h> |
| 6 | #include <linux/types.h> | ||
| 6 | 7 | ||
| 7 | extern int pm_trace_enabled; | 8 | extern int pm_trace_enabled; |
| 8 | 9 | ||
| @@ -14,6 +15,7 @@ static inline int pm_trace_is_enabled(void) | |||
| 14 | struct device; | 15 | struct device; |
| 15 | extern void set_trace_device(struct device *); | 16 | extern void set_trace_device(struct device *); |
| 16 | extern void generate_resume_trace(const void *tracedata, unsigned int user); | 17 | extern void generate_resume_trace(const void *tracedata, unsigned int user); |
| 18 | extern int show_trace_dev_match(char *buf, size_t size); | ||
| 17 | 19 | ||
| 18 | #define TRACE_DEVICE(dev) do { \ | 20 | #define TRACE_DEVICE(dev) do { \ |
| 19 | if (pm_trace_enabled) \ | 21 | if (pm_trace_enabled) \ |
diff --git a/include/linux/rfkill.h b/include/linux/rfkill.h index 4f82326eb294..08c32e4f261a 100644 --- a/include/linux/rfkill.h +++ b/include/linux/rfkill.h | |||
| @@ -81,7 +81,7 @@ struct rfkill_event { | |||
| 81 | __u8 type; | 81 | __u8 type; |
| 82 | __u8 op; | 82 | __u8 op; |
| 83 | __u8 soft, hard; | 83 | __u8 soft, hard; |
| 84 | } __packed; | 84 | } __attribute__((packed)); |
| 85 | 85 | ||
| 86 | /* | 86 | /* |
| 87 | * We are planning to be backward and forward compatible with changes | 87 | * We are planning to be backward and forward compatible with changes |
diff --git a/include/linux/ring_buffer.h b/include/linux/ring_buffer.h index 25b4f686d918..8d3a2486544d 100644 --- a/include/linux/ring_buffer.h +++ b/include/linux/ring_buffer.h | |||
| @@ -62,18 +62,6 @@ enum ring_buffer_type { | |||
| 62 | unsigned ring_buffer_event_length(struct ring_buffer_event *event); | 62 | unsigned ring_buffer_event_length(struct ring_buffer_event *event); |
| 63 | void *ring_buffer_event_data(struct ring_buffer_event *event); | 63 | void *ring_buffer_event_data(struct ring_buffer_event *event); |
| 64 | 64 | ||
| 65 | /** | ||
| 66 | * ring_buffer_event_time_delta - return the delta timestamp of the event | ||
| 67 | * @event: the event to get the delta timestamp of | ||
| 68 | * | ||
| 69 | * The delta timestamp is the 27 bit timestamp since the last event. | ||
| 70 | */ | ||
| 71 | static inline unsigned | ||
| 72 | ring_buffer_event_time_delta(struct ring_buffer_event *event) | ||
| 73 | { | ||
| 74 | return event->time_delta; | ||
| 75 | } | ||
| 76 | |||
| 77 | /* | 65 | /* |
| 78 | * ring_buffer_discard_commit will remove an event that has not | 66 | * ring_buffer_discard_commit will remove an event that has not |
| 79 | * ben committed yet. If this is used, then ring_buffer_unlock_commit | 67 | * ben committed yet. If this is used, then ring_buffer_unlock_commit |
diff --git a/include/linux/rio.h b/include/linux/rio.h index bd6eb0ed34a7..0bed941f9b13 100644 --- a/include/linux/rio.h +++ b/include/linux/rio.h | |||
| @@ -67,6 +67,7 @@ | |||
| 67 | #define RIO_PW_MSG_SIZE 64 | 67 | #define RIO_PW_MSG_SIZE 64 |
| 68 | 68 | ||
| 69 | extern struct bus_type rio_bus_type; | 69 | extern struct bus_type rio_bus_type; |
| 70 | extern struct device rio_bus; | ||
| 70 | extern struct list_head rio_devices; /* list of all devices */ | 71 | extern struct list_head rio_devices; /* list of all devices */ |
| 71 | 72 | ||
| 72 | struct rio_mport; | 73 | struct rio_mport; |
| @@ -98,6 +99,7 @@ union rio_pw_msg; | |||
| 98 | * @riores: RIO resources this device owns | 99 | * @riores: RIO resources this device owns |
| 99 | * @pwcback: port-write callback function for this device | 100 | * @pwcback: port-write callback function for this device |
| 100 | * @destid: Network destination ID | 101 | * @destid: Network destination ID |
| 102 | * @prev: Previous RIO device connected to the current one | ||
| 101 | */ | 103 | */ |
| 102 | struct rio_dev { | 104 | struct rio_dev { |
| 103 | struct list_head global_list; /* node in list of all RIO devices */ | 105 | struct list_head global_list; /* node in list of all RIO devices */ |
| @@ -111,7 +113,7 @@ struct rio_dev { | |||
| 111 | u16 asm_rev; | 113 | u16 asm_rev; |
| 112 | u16 efptr; | 114 | u16 efptr; |
| 113 | u32 pef; | 115 | u32 pef; |
| 114 | u32 swpinfo; /* Only used for switches */ | 116 | u32 swpinfo; |
| 115 | u32 src_ops; | 117 | u32 src_ops; |
| 116 | u32 dst_ops; | 118 | u32 dst_ops; |
| 117 | u32 comp_tag; | 119 | u32 comp_tag; |
| @@ -124,6 +126,7 @@ struct rio_dev { | |||
| 124 | struct resource riores[RIO_MAX_DEV_RESOURCES]; | 126 | struct resource riores[RIO_MAX_DEV_RESOURCES]; |
| 125 | int (*pwcback) (struct rio_dev *rdev, union rio_pw_msg *msg, int step); | 127 | int (*pwcback) (struct rio_dev *rdev, union rio_pw_msg *msg, int step); |
| 126 | u16 destid; | 128 | u16 destid; |
| 129 | struct rio_dev *prev; | ||
| 127 | }; | 130 | }; |
| 128 | 131 | ||
| 129 | #define rio_dev_g(n) list_entry(n, struct rio_dev, global_list) | 132 | #define rio_dev_g(n) list_entry(n, struct rio_dev, global_list) |
| @@ -174,6 +177,7 @@ enum rio_phy_type { | |||
| 174 | * @index: Port index, unique among all port interfaces of the same type | 177 | * @index: Port index, unique among all port interfaces of the same type |
| 175 | * @sys_size: RapidIO common transport system size | 178 | * @sys_size: RapidIO common transport system size |
| 176 | * @phy_type: RapidIO phy type | 179 | * @phy_type: RapidIO phy type |
| 180 | * @phys_efptr: RIO port extended features pointer | ||
| 177 | * @name: Port name string | 181 | * @name: Port name string |
| 178 | * @priv: Master port private data | 182 | * @priv: Master port private data |
| 179 | */ | 183 | */ |
| @@ -195,6 +199,7 @@ struct rio_mport { | |||
| 195 | * 1 - Large size, 65536 devices. | 199 | * 1 - Large size, 65536 devices. |
| 196 | */ | 200 | */ |
| 197 | enum rio_phy_type phy_type; /* RapidIO phy type */ | 201 | enum rio_phy_type phy_type; /* RapidIO phy type */ |
| 202 | u32 phys_efptr; | ||
| 198 | unsigned char name[40]; | 203 | unsigned char name[40]; |
| 199 | void *priv; /* Master port private data */ | 204 | void *priv; /* Master port private data */ |
| 200 | }; | 205 | }; |
| @@ -215,9 +220,14 @@ struct rio_net { | |||
| 215 | unsigned char id; /* RIO network ID */ | 220 | unsigned char id; /* RIO network ID */ |
| 216 | }; | 221 | }; |
| 217 | 222 | ||
| 223 | /* Definitions used by switch sysfs initialization callback */ | ||
| 224 | #define RIO_SW_SYSFS_CREATE 1 /* Create switch attributes */ | ||
| 225 | #define RIO_SW_SYSFS_REMOVE 0 /* Remove switch attributes */ | ||
| 226 | |||
| 218 | /** | 227 | /** |
| 219 | * struct rio_switch - RIO switch info | 228 | * struct rio_switch - RIO switch info |
| 220 | * @node: Node in global list of switches | 229 | * @node: Node in global list of switches |
| 230 | * @rdev: Associated RIO device structure | ||
| 221 | * @switchid: Switch ID that is unique across a network | 231 | * @switchid: Switch ID that is unique across a network |
| 222 | * @hopcount: Hopcount to this switch | 232 | * @hopcount: Hopcount to this switch |
| 223 | * @destid: Associated destid in the path | 233 | * @destid: Associated destid in the path |
| @@ -230,9 +240,12 @@ struct rio_net { | |||
| 230 | * @get_domain: Callback for switch-specific domain get function | 240 | * @get_domain: Callback for switch-specific domain get function |
| 231 | * @em_init: Callback for switch-specific error management initialization function | 241 | * @em_init: Callback for switch-specific error management initialization function |
| 232 | * @em_handle: Callback for switch-specific error management handler function | 242 | * @em_handle: Callback for switch-specific error management handler function |
| 243 | * @sw_sysfs: Callback that initializes switch-specific sysfs attributes | ||
| 244 | * @nextdev: Array of per-port pointers to the next attached device | ||
| 233 | */ | 245 | */ |
| 234 | struct rio_switch { | 246 | struct rio_switch { |
| 235 | struct list_head node; | 247 | struct list_head node; |
| 248 | struct rio_dev *rdev; | ||
| 236 | u16 switchid; | 249 | u16 switchid; |
| 237 | u16 hopcount; | 250 | u16 hopcount; |
| 238 | u16 destid; | 251 | u16 destid; |
| @@ -250,6 +263,8 @@ struct rio_switch { | |||
| 250 | u8 *sw_domain); | 263 | u8 *sw_domain); |
| 251 | int (*em_init) (struct rio_dev *dev); | 264 | int (*em_init) (struct rio_dev *dev); |
| 252 | int (*em_handle) (struct rio_dev *dev, u8 swport); | 265 | int (*em_handle) (struct rio_dev *dev, u8 swport); |
| 266 | int (*sw_sysfs) (struct rio_dev *dev, int create); | ||
| 267 | struct rio_dev *nextdev[0]; | ||
| 253 | }; | 268 | }; |
| 254 | 269 | ||
| 255 | /* Low-level architecture-dependent routines */ | 270 | /* Low-level architecture-dependent routines */ |
diff --git a/include/linux/rio_ids.h b/include/linux/rio_ids.h index db50e1c288b7..ee7b6ada188f 100644 --- a/include/linux/rio_ids.h +++ b/include/linux/rio_ids.h | |||
| @@ -34,5 +34,7 @@ | |||
| 34 | #define RIO_DID_IDTCPS16 0x035b | 34 | #define RIO_DID_IDTCPS16 0x035b |
| 35 | #define RIO_DID_IDTCPS6Q 0x035f | 35 | #define RIO_DID_IDTCPS6Q 0x035f |
| 36 | #define RIO_DID_IDTCPS10Q 0x035e | 36 | #define RIO_DID_IDTCPS10Q 0x035e |
| 37 | #define RIO_DID_IDTCPS1848 0x0374 | ||
| 38 | #define RIO_DID_IDTCPS1616 0x0379 | ||
| 37 | 39 | ||
| 38 | #endif /* LINUX_RIO_IDS_H */ | 40 | #endif /* LINUX_RIO_IDS_H */ |
diff --git a/include/linux/rio_regs.h b/include/linux/rio_regs.h index aedee0489fb4..d63dcbaea169 100644 --- a/include/linux/rio_regs.h +++ b/include/linux/rio_regs.h | |||
| @@ -33,6 +33,7 @@ | |||
| 33 | #define RIO_PEF_MEMORY 0x40000000 /* [I] MMIO */ | 33 | #define RIO_PEF_MEMORY 0x40000000 /* [I] MMIO */ |
| 34 | #define RIO_PEF_PROCESSOR 0x20000000 /* [I] Processor */ | 34 | #define RIO_PEF_PROCESSOR 0x20000000 /* [I] Processor */ |
| 35 | #define RIO_PEF_SWITCH 0x10000000 /* [I] Switch */ | 35 | #define RIO_PEF_SWITCH 0x10000000 /* [I] Switch */ |
| 36 | #define RIO_PEF_MULTIPORT 0x08000000 /* [VI, 2.1] Multiport */ | ||
| 36 | #define RIO_PEF_INB_MBOX 0x00f00000 /* [II] Mailboxes */ | 37 | #define RIO_PEF_INB_MBOX 0x00f00000 /* [II] Mailboxes */ |
| 37 | #define RIO_PEF_INB_MBOX0 0x00800000 /* [II] Mailbox 0 */ | 38 | #define RIO_PEF_INB_MBOX0 0x00800000 /* [II] Mailbox 0 */ |
| 38 | #define RIO_PEF_INB_MBOX1 0x00400000 /* [II] Mailbox 1 */ | 39 | #define RIO_PEF_INB_MBOX1 0x00400000 /* [II] Mailbox 1 */ |
| @@ -51,6 +52,7 @@ | |||
| 51 | #define RIO_SWP_INFO_PORT_TOTAL_MASK 0x0000ff00 /* [I] Total number of ports */ | 52 | #define RIO_SWP_INFO_PORT_TOTAL_MASK 0x0000ff00 /* [I] Total number of ports */ |
| 52 | #define RIO_SWP_INFO_PORT_NUM_MASK 0x000000ff /* [I] Maintenance transaction port number */ | 53 | #define RIO_SWP_INFO_PORT_NUM_MASK 0x000000ff /* [I] Maintenance transaction port number */ |
| 53 | #define RIO_GET_TOTAL_PORTS(x) ((x & RIO_SWP_INFO_PORT_TOTAL_MASK) >> 8) | 54 | #define RIO_GET_TOTAL_PORTS(x) ((x & RIO_SWP_INFO_PORT_TOTAL_MASK) >> 8) |
| 55 | #define RIO_GET_PORT_NUM(x) (x & RIO_SWP_INFO_PORT_NUM_MASK) | ||
| 54 | 56 | ||
| 55 | #define RIO_SRC_OPS_CAR 0x18 /* [I] Source Operations CAR */ | 57 | #define RIO_SRC_OPS_CAR 0x18 /* [I] Source Operations CAR */ |
| 56 | #define RIO_SRC_OPS_READ 0x00008000 /* [I] Read op */ | 58 | #define RIO_SRC_OPS_READ 0x00008000 /* [I] Read op */ |
| @@ -159,6 +161,7 @@ | |||
| 159 | #define RIO_COMPONENT_TAG_CSR 0x6c /* [III] Component Tag CSR */ | 161 | #define RIO_COMPONENT_TAG_CSR 0x6c /* [III] Component Tag CSR */ |
| 160 | 162 | ||
| 161 | #define RIO_STD_RTE_CONF_DESTID_SEL_CSR 0x70 | 163 | #define RIO_STD_RTE_CONF_DESTID_SEL_CSR 0x70 |
| 164 | #define RIO_STD_RTE_CONF_EXTCFGEN 0x80000000 | ||
| 162 | #define RIO_STD_RTE_CONF_PORT_SEL_CSR 0x74 | 165 | #define RIO_STD_RTE_CONF_PORT_SEL_CSR 0x74 |
| 163 | #define RIO_STD_RTE_DEFAULT_PORT 0x78 | 166 | #define RIO_STD_RTE_DEFAULT_PORT 0x78 |
| 164 | 167 | ||
| @@ -222,15 +225,17 @@ | |||
| 222 | #define RIO_PORT_GEN_MASTER 0x40000000 | 225 | #define RIO_PORT_GEN_MASTER 0x40000000 |
| 223 | #define RIO_PORT_GEN_DISCOVERED 0x20000000 | 226 | #define RIO_PORT_GEN_DISCOVERED 0x20000000 |
| 224 | #define RIO_PORT_N_MNT_REQ_CSR(x) (0x0040 + x*0x20) /* 0x0002 */ | 227 | #define RIO_PORT_N_MNT_REQ_CSR(x) (0x0040 + x*0x20) /* 0x0002 */ |
| 228 | #define RIO_MNT_REQ_CMD_RD 0x03 /* Reset-device command */ | ||
| 229 | #define RIO_MNT_REQ_CMD_IS 0x04 /* Input-status command */ | ||
| 225 | #define RIO_PORT_N_MNT_RSP_CSR(x) (0x0044 + x*0x20) /* 0x0002 */ | 230 | #define RIO_PORT_N_MNT_RSP_CSR(x) (0x0044 + x*0x20) /* 0x0002 */ |
| 226 | #define RIO_PORT_N_MNT_RSP_RVAL 0x80000000 /* Response Valid */ | 231 | #define RIO_PORT_N_MNT_RSP_RVAL 0x80000000 /* Response Valid */ |
| 227 | #define RIO_PORT_N_MNT_RSP_ASTAT 0x000003e0 /* ackID Status */ | 232 | #define RIO_PORT_N_MNT_RSP_ASTAT 0x000007e0 /* ackID Status */ |
| 228 | #define RIO_PORT_N_MNT_RSP_LSTAT 0x0000001f /* Link Status */ | 233 | #define RIO_PORT_N_MNT_RSP_LSTAT 0x0000001f /* Link Status */ |
| 229 | #define RIO_PORT_N_ACK_STS_CSR(x) (0x0048 + x*0x20) /* 0x0002 */ | 234 | #define RIO_PORT_N_ACK_STS_CSR(x) (0x0048 + x*0x20) /* 0x0002 */ |
| 230 | #define RIO_PORT_N_ACK_CLEAR 0x80000000 | 235 | #define RIO_PORT_N_ACK_CLEAR 0x80000000 |
| 231 | #define RIO_PORT_N_ACK_INBOUND 0x1f000000 | 236 | #define RIO_PORT_N_ACK_INBOUND 0x3f000000 |
| 232 | #define RIO_PORT_N_ACK_OUTSTAND 0x00001f00 | 237 | #define RIO_PORT_N_ACK_OUTSTAND 0x00003f00 |
| 233 | #define RIO_PORT_N_ACK_OUTBOUND 0x0000001f | 238 | #define RIO_PORT_N_ACK_OUTBOUND 0x0000003f |
| 234 | #define RIO_PORT_N_ERR_STS_CSR(x) (0x0058 + x*0x20) | 239 | #define RIO_PORT_N_ERR_STS_CSR(x) (0x0058 + x*0x20) |
| 235 | #define RIO_PORT_N_ERR_STS_PW_OUT_ES 0x00010000 /* Output Error-stopped */ | 240 | #define RIO_PORT_N_ERR_STS_PW_OUT_ES 0x00010000 /* Output Error-stopped */ |
| 236 | #define RIO_PORT_N_ERR_STS_PW_INP_ES 0x00000100 /* Input Error-stopped */ | 241 | #define RIO_PORT_N_ERR_STS_PW_INP_ES 0x00000100 /* Input Error-stopped */ |
| @@ -238,7 +243,6 @@ | |||
| 238 | #define RIO_PORT_N_ERR_STS_PORT_ERR 0x00000004 | 243 | #define RIO_PORT_N_ERR_STS_PORT_ERR 0x00000004 |
| 239 | #define RIO_PORT_N_ERR_STS_PORT_OK 0x00000002 | 244 | #define RIO_PORT_N_ERR_STS_PORT_OK 0x00000002 |
| 240 | #define RIO_PORT_N_ERR_STS_PORT_UNINIT 0x00000001 | 245 | #define RIO_PORT_N_ERR_STS_PORT_UNINIT 0x00000001 |
| 241 | #define RIO_PORT_N_ERR_STS_CLR_MASK 0x07120204 | ||
| 242 | #define RIO_PORT_N_CTL_CSR(x) (0x005c + x*0x20) | 246 | #define RIO_PORT_N_CTL_CSR(x) (0x005c + x*0x20) |
| 243 | #define RIO_PORT_N_CTL_PWIDTH 0xc0000000 | 247 | #define RIO_PORT_N_CTL_PWIDTH 0xc0000000 |
| 244 | #define RIO_PORT_N_CTL_PWIDTH_1 0x00000000 | 248 | #define RIO_PORT_N_CTL_PWIDTH_1 0x00000000 |
| @@ -261,6 +265,10 @@ | |||
| 261 | #define RIO_EM_EFB_HEADER 0x000 /* Error Management Extensions Block Header */ | 265 | #define RIO_EM_EFB_HEADER 0x000 /* Error Management Extensions Block Header */ |
| 262 | #define RIO_EM_LTL_ERR_DETECT 0x008 /* Logical/Transport Layer Error Detect CSR */ | 266 | #define RIO_EM_LTL_ERR_DETECT 0x008 /* Logical/Transport Layer Error Detect CSR */ |
| 263 | #define RIO_EM_LTL_ERR_EN 0x00c /* Logical/Transport Layer Error Enable CSR */ | 267 | #define RIO_EM_LTL_ERR_EN 0x00c /* Logical/Transport Layer Error Enable CSR */ |
| 268 | #define REM_LTL_ERR_ILLTRAN 0x08000000 /* Illegal Transaction decode */ | ||
| 269 | #define REM_LTL_ERR_UNSOLR 0x00800000 /* Unsolicited Response */ | ||
| 270 | #define REM_LTL_ERR_UNSUPTR 0x00400000 /* Unsupported Transaction */ | ||
| 271 | #define REM_LTL_ERR_IMPSPEC 0x000000ff /* Implementation Specific */ | ||
| 264 | #define RIO_EM_LTL_HIADDR_CAP 0x010 /* Logical/Transport Layer High Address Capture CSR */ | 272 | #define RIO_EM_LTL_HIADDR_CAP 0x010 /* Logical/Transport Layer High Address Capture CSR */ |
| 265 | #define RIO_EM_LTL_ADDR_CAP 0x014 /* Logical/Transport Layer Address Capture CSR */ | 273 | #define RIO_EM_LTL_ADDR_CAP 0x014 /* Logical/Transport Layer Address Capture CSR */ |
| 266 | #define RIO_EM_LTL_DEVID_CAP 0x018 /* Logical/Transport Layer Device ID Capture CSR */ | 274 | #define RIO_EM_LTL_DEVID_CAP 0x018 /* Logical/Transport Layer Device ID Capture CSR */ |
diff --git a/include/linux/rmap.h b/include/linux/rmap.h index 77216742c178..bb83c0da2071 100644 --- a/include/linux/rmap.h +++ b/include/linux/rmap.h | |||
| @@ -25,6 +25,7 @@ | |||
| 25 | * pointing to this anon_vma once its vma list is empty. | 25 | * pointing to this anon_vma once its vma list is empty. |
| 26 | */ | 26 | */ |
| 27 | struct anon_vma { | 27 | struct anon_vma { |
| 28 | struct anon_vma *root; /* Root of this anon_vma tree */ | ||
| 28 | spinlock_t lock; /* Serialize access to vma list */ | 29 | spinlock_t lock; /* Serialize access to vma list */ |
| 29 | #if defined(CONFIG_KSM) || defined(CONFIG_MIGRATION) | 30 | #if defined(CONFIG_KSM) || defined(CONFIG_MIGRATION) |
| 30 | 31 | ||
| @@ -80,6 +81,13 @@ static inline int anonvma_external_refcount(struct anon_vma *anon_vma) | |||
| 80 | { | 81 | { |
| 81 | return atomic_read(&anon_vma->external_refcount); | 82 | return atomic_read(&anon_vma->external_refcount); |
| 82 | } | 83 | } |
| 84 | |||
| 85 | static inline void get_anon_vma(struct anon_vma *anon_vma) | ||
| 86 | { | ||
| 87 | atomic_inc(&anon_vma->external_refcount); | ||
| 88 | } | ||
| 89 | |||
| 90 | void drop_anon_vma(struct anon_vma *); | ||
| 83 | #else | 91 | #else |
| 84 | static inline void anonvma_external_refcount_init(struct anon_vma *anon_vma) | 92 | static inline void anonvma_external_refcount_init(struct anon_vma *anon_vma) |
| 85 | { | 93 | { |
| @@ -89,6 +97,14 @@ static inline int anonvma_external_refcount(struct anon_vma *anon_vma) | |||
| 89 | { | 97 | { |
| 90 | return 0; | 98 | return 0; |
| 91 | } | 99 | } |
| 100 | |||
| 101 | static inline void get_anon_vma(struct anon_vma *anon_vma) | ||
| 102 | { | ||
| 103 | } | ||
| 104 | |||
| 105 | static inline void drop_anon_vma(struct anon_vma *anon_vma) | ||
| 106 | { | ||
| 107 | } | ||
| 92 | #endif /* CONFIG_KSM */ | 108 | #endif /* CONFIG_KSM */ |
| 93 | 109 | ||
| 94 | static inline struct anon_vma *page_anon_vma(struct page *page) | 110 | static inline struct anon_vma *page_anon_vma(struct page *page) |
| @@ -99,18 +115,28 @@ static inline struct anon_vma *page_anon_vma(struct page *page) | |||
| 99 | return page_rmapping(page); | 115 | return page_rmapping(page); |
| 100 | } | 116 | } |
| 101 | 117 | ||
| 102 | static inline void anon_vma_lock(struct vm_area_struct *vma) | 118 | static inline void vma_lock_anon_vma(struct vm_area_struct *vma) |
| 103 | { | 119 | { |
| 104 | struct anon_vma *anon_vma = vma->anon_vma; | 120 | struct anon_vma *anon_vma = vma->anon_vma; |
| 105 | if (anon_vma) | 121 | if (anon_vma) |
| 106 | spin_lock(&anon_vma->lock); | 122 | spin_lock(&anon_vma->root->lock); |
| 107 | } | 123 | } |
| 108 | 124 | ||
| 109 | static inline void anon_vma_unlock(struct vm_area_struct *vma) | 125 | static inline void vma_unlock_anon_vma(struct vm_area_struct *vma) |
| 110 | { | 126 | { |
| 111 | struct anon_vma *anon_vma = vma->anon_vma; | 127 | struct anon_vma *anon_vma = vma->anon_vma; |
| 112 | if (anon_vma) | 128 | if (anon_vma) |
| 113 | spin_unlock(&anon_vma->lock); | 129 | spin_unlock(&anon_vma->root->lock); |
| 130 | } | ||
| 131 | |||
| 132 | static inline void anon_vma_lock(struct anon_vma *anon_vma) | ||
| 133 | { | ||
| 134 | spin_lock(&anon_vma->root->lock); | ||
| 135 | } | ||
| 136 | |||
| 137 | static inline void anon_vma_unlock(struct anon_vma *anon_vma) | ||
| 138 | { | ||
| 139 | spin_unlock(&anon_vma->root->lock); | ||
| 114 | } | 140 | } |
| 115 | 141 | ||
| 116 | /* | 142 | /* |
| @@ -136,10 +162,17 @@ static inline void anon_vma_merge(struct vm_area_struct *vma, | |||
| 136 | */ | 162 | */ |
| 137 | void page_move_anon_rmap(struct page *, struct vm_area_struct *, unsigned long); | 163 | void page_move_anon_rmap(struct page *, struct vm_area_struct *, unsigned long); |
| 138 | void page_add_anon_rmap(struct page *, struct vm_area_struct *, unsigned long); | 164 | void page_add_anon_rmap(struct page *, struct vm_area_struct *, unsigned long); |
| 165 | void do_page_add_anon_rmap(struct page *, struct vm_area_struct *, | ||
| 166 | unsigned long, int); | ||
| 139 | void page_add_new_anon_rmap(struct page *, struct vm_area_struct *, unsigned long); | 167 | void page_add_new_anon_rmap(struct page *, struct vm_area_struct *, unsigned long); |
| 140 | void page_add_file_rmap(struct page *); | 168 | void page_add_file_rmap(struct page *); |
| 141 | void page_remove_rmap(struct page *); | 169 | void page_remove_rmap(struct page *); |
| 142 | 170 | ||
| 171 | void hugepage_add_anon_rmap(struct page *, struct vm_area_struct *, | ||
| 172 | unsigned long); | ||
| 173 | void hugepage_add_new_anon_rmap(struct page *, struct vm_area_struct *, | ||
| 174 | unsigned long); | ||
| 175 | |||
| 143 | static inline void page_dup_rmap(struct page *page) | 176 | static inline void page_dup_rmap(struct page *page) |
| 144 | { | 177 | { |
| 145 | atomic_inc(&page->_mapcount); | 178 | atomic_inc(&page->_mapcount); |
| @@ -172,9 +205,20 @@ int try_to_unmap_one(struct page *, struct vm_area_struct *, | |||
| 172 | /* | 205 | /* |
| 173 | * Called from mm/filemap_xip.c to unmap empty zero page | 206 | * Called from mm/filemap_xip.c to unmap empty zero page |
| 174 | */ | 207 | */ |
| 175 | pte_t *page_check_address(struct page *, struct mm_struct *, | 208 | pte_t *__page_check_address(struct page *, struct mm_struct *, |
| 176 | unsigned long, spinlock_t **, int); | 209 | unsigned long, spinlock_t **, int); |
| 177 | 210 | ||
| 211 | static inline pte_t *page_check_address(struct page *page, struct mm_struct *mm, | ||
| 212 | unsigned long address, | ||
| 213 | spinlock_t **ptlp, int sync) | ||
| 214 | { | ||
| 215 | pte_t *ptep; | ||
| 216 | |||
| 217 | __cond_lock(*ptlp, ptep = __page_check_address(page, mm, address, | ||
| 218 | ptlp, sync)); | ||
| 219 | return ptep; | ||
| 220 | } | ||
| 221 | |||
| 178 | /* | 222 | /* |
| 179 | * Used by swapoff to help locate where page is expected in vma. | 223 | * Used by swapoff to help locate where page is expected in vma. |
| 180 | */ | 224 | */ |
| @@ -197,7 +241,20 @@ int try_to_munlock(struct page *); | |||
| 197 | /* | 241 | /* |
| 198 | * Called by memory-failure.c to kill processes. | 242 | * Called by memory-failure.c to kill processes. |
| 199 | */ | 243 | */ |
| 200 | struct anon_vma *page_lock_anon_vma(struct page *page); | 244 | struct anon_vma *__page_lock_anon_vma(struct page *page); |
| 245 | |||
| 246 | static inline struct anon_vma *page_lock_anon_vma(struct page *page) | ||
| 247 | { | ||
| 248 | struct anon_vma *anon_vma; | ||
| 249 | |||
| 250 | __cond_lock(RCU, anon_vma = __page_lock_anon_vma(page)); | ||
| 251 | |||
| 252 | /* (void) is needed to make gcc happy */ | ||
| 253 | (void) __cond_lock(&anon_vma->root->lock, anon_vma); | ||
| 254 | |||
| 255 | return anon_vma; | ||
| 256 | } | ||
| 257 | |||
| 201 | void page_unlock_anon_vma(struct anon_vma *anon_vma); | 258 | void page_unlock_anon_vma(struct anon_vma *anon_vma); |
| 202 | int page_mapped_in_vma(struct page *page, struct vm_area_struct *vma); | 259 | int page_mapped_in_vma(struct page *page, struct vm_area_struct *vma); |
| 203 | 260 | ||
diff --git a/include/linux/rtnetlink.h b/include/linux/rtnetlink.h index fbc8cb0d48c3..d42f274418b8 100644 --- a/include/linux/rtnetlink.h +++ b/include/linux/rtnetlink.h | |||
| @@ -6,6 +6,7 @@ | |||
| 6 | #include <linux/if_link.h> | 6 | #include <linux/if_link.h> |
| 7 | #include <linux/if_addr.h> | 7 | #include <linux/if_addr.h> |
| 8 | #include <linux/neighbour.h> | 8 | #include <linux/neighbour.h> |
| 9 | #include <linux/netdevice.h> | ||
| 9 | 10 | ||
| 10 | /* rtnetlink families. Values up to 127 are reserved for real address | 11 | /* rtnetlink families. Values up to 127 are reserved for real address |
| 11 | * families, values above 128 may be used arbitrarily. | 12 | * families, values above 128 may be used arbitrarily. |
| @@ -282,6 +283,7 @@ enum rtattr_type_t { | |||
| 282 | RTA_SESSION, /* no longer used */ | 283 | RTA_SESSION, /* no longer used */ |
| 283 | RTA_MP_ALGO, /* no longer used */ | 284 | RTA_MP_ALGO, /* no longer used */ |
| 284 | RTA_TABLE, | 285 | RTA_TABLE, |
| 286 | RTA_MARK, | ||
| 285 | __RTA_MAX | 287 | __RTA_MAX |
| 286 | }; | 288 | }; |
| 287 | 289 | ||
| @@ -748,6 +750,35 @@ extern int rtnl_is_locked(void); | |||
| 748 | extern int lockdep_rtnl_is_held(void); | 750 | extern int lockdep_rtnl_is_held(void); |
| 749 | #endif /* #ifdef CONFIG_PROVE_LOCKING */ | 751 | #endif /* #ifdef CONFIG_PROVE_LOCKING */ |
| 750 | 752 | ||
| 753 | /** | ||
| 754 | * rcu_dereference_rtnl - rcu_dereference with debug checking | ||
| 755 | * @p: The pointer to read, prior to dereferencing | ||
| 756 | * | ||
| 757 | * Do an rcu_dereference(p), but check caller either holds rcu_read_lock() | ||
| 758 | * or RTNL. Note : Please prefer rtnl_dereference() or rcu_dereference() | ||
| 759 | */ | ||
| 760 | #define rcu_dereference_rtnl(p) \ | ||
| 761 | rcu_dereference_check(p, rcu_read_lock_held() || \ | ||
| 762 | lockdep_rtnl_is_held()) | ||
| 763 | |||
| 764 | /** | ||
| 765 | * rtnl_dereference - fetch RCU pointer when updates are prevented by RTNL | ||
| 766 | * @p: The pointer to read, prior to dereferencing | ||
| 767 | * | ||
| 768 | * Return the value of the specified RCU-protected pointer, but omit | ||
| 769 | * both the smp_read_barrier_depends() and the ACCESS_ONCE(), because | ||
| 770 | * caller holds RTNL. | ||
| 771 | */ | ||
| 772 | #define rtnl_dereference(p) \ | ||
| 773 | rcu_dereference_protected(p, lockdep_rtnl_is_held()) | ||
| 774 | |||
| 775 | static inline struct netdev_queue *dev_ingress_queue(struct net_device *dev) | ||
| 776 | { | ||
| 777 | return rtnl_dereference(dev->ingress_queue); | ||
| 778 | } | ||
| 779 | |||
| 780 | extern struct netdev_queue *dev_ingress_queue_create(struct net_device *dev); | ||
| 781 | |||
| 751 | extern void rtnetlink_init(void); | 782 | extern void rtnetlink_init(void); |
| 752 | extern void __rtnl_unlock(void); | 783 | extern void __rtnl_unlock(void); |
| 753 | 784 | ||
diff --git a/include/linux/s3c_adc_battery.h b/include/linux/s3c_adc_battery.h new file mode 100644 index 000000000000..dbce22faa660 --- /dev/null +++ b/include/linux/s3c_adc_battery.h | |||
| @@ -0,0 +1,36 @@ | |||
| 1 | #ifndef _S3C_ADC_BATTERY_H | ||
| 2 | #define _S3C_ADC_BATTERY_H | ||
| 3 | |||
| 4 | struct s3c_adc_bat_thresh { | ||
| 5 | int volt; /* mV */ | ||
| 6 | int cur; /* mA */ | ||
| 7 | int level; /* percent */ | ||
| 8 | }; | ||
| 9 | |||
| 10 | struct s3c_adc_bat_pdata { | ||
| 11 | int (*init)(void); | ||
| 12 | void (*exit)(void); | ||
| 13 | void (*enable_charger)(void); | ||
| 14 | void (*disable_charger)(void); | ||
| 15 | |||
| 16 | int gpio_charge_finished; | ||
| 17 | |||
| 18 | const struct s3c_adc_bat_thresh *lut_noac; | ||
| 19 | unsigned int lut_noac_cnt; | ||
| 20 | const struct s3c_adc_bat_thresh *lut_acin; | ||
| 21 | unsigned int lut_acin_cnt; | ||
| 22 | |||
| 23 | const unsigned int volt_channel; | ||
| 24 | const unsigned int current_channel; | ||
| 25 | const unsigned int backup_volt_channel; | ||
| 26 | |||
| 27 | const unsigned int volt_mult; | ||
| 28 | const unsigned int current_mult; | ||
| 29 | const unsigned int backup_volt_mult; | ||
| 30 | const unsigned int internal_impedance; | ||
| 31 | |||
| 32 | const unsigned int backup_volt_max; | ||
| 33 | const unsigned int backup_volt_min; | ||
| 34 | }; | ||
| 35 | |||
| 36 | #endif | ||
diff --git a/include/linux/sched.h b/include/linux/sched.h index 0478888c6899..be7adb7588e5 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
| @@ -272,19 +272,10 @@ extern int runqueue_is_locked(int cpu); | |||
| 272 | 272 | ||
| 273 | extern cpumask_var_t nohz_cpu_mask; | 273 | extern cpumask_var_t nohz_cpu_mask; |
| 274 | #if defined(CONFIG_SMP) && defined(CONFIG_NO_HZ) | 274 | #if defined(CONFIG_SMP) && defined(CONFIG_NO_HZ) |
| 275 | extern int select_nohz_load_balancer(int cpu); | 275 | extern void select_nohz_load_balancer(int stop_tick); |
| 276 | extern int get_nohz_load_balancer(void); | 276 | extern int get_nohz_timer_target(void); |
| 277 | extern int nohz_ratelimit(int cpu); | ||
| 278 | #else | 277 | #else |
| 279 | static inline int select_nohz_load_balancer(int cpu) | 278 | static inline void select_nohz_load_balancer(int stop_tick) { } |
| 280 | { | ||
| 281 | return 0; | ||
| 282 | } | ||
| 283 | |||
| 284 | static inline int nohz_ratelimit(int cpu) | ||
| 285 | { | ||
| 286 | return 0; | ||
| 287 | } | ||
| 288 | #endif | 279 | #endif |
| 289 | 280 | ||
| 290 | /* | 281 | /* |
| @@ -316,20 +307,16 @@ extern void scheduler_tick(void); | |||
| 316 | 307 | ||
| 317 | extern void sched_show_task(struct task_struct *p); | 308 | extern void sched_show_task(struct task_struct *p); |
| 318 | 309 | ||
| 319 | #ifdef CONFIG_DETECT_SOFTLOCKUP | 310 | #ifdef CONFIG_LOCKUP_DETECTOR |
| 320 | extern void softlockup_tick(void); | ||
| 321 | extern void touch_softlockup_watchdog(void); | 311 | extern void touch_softlockup_watchdog(void); |
| 322 | extern void touch_softlockup_watchdog_sync(void); | 312 | extern void touch_softlockup_watchdog_sync(void); |
| 323 | extern void touch_all_softlockup_watchdogs(void); | 313 | extern void touch_all_softlockup_watchdogs(void); |
| 324 | extern int proc_dosoftlockup_thresh(struct ctl_table *table, int write, | 314 | extern int proc_dowatchdog_thresh(struct ctl_table *table, int write, |
| 325 | void __user *buffer, | 315 | void __user *buffer, |
| 326 | size_t *lenp, loff_t *ppos); | 316 | size_t *lenp, loff_t *ppos); |
| 327 | extern unsigned int softlockup_panic; | 317 | extern unsigned int softlockup_panic; |
| 328 | extern int softlockup_thresh; | 318 | extern int softlockup_thresh; |
| 329 | #else | 319 | #else |
| 330 | static inline void softlockup_tick(void) | ||
| 331 | { | ||
| 332 | } | ||
| 333 | static inline void touch_softlockup_watchdog(void) | 320 | static inline void touch_softlockup_watchdog(void) |
| 334 | { | 321 | { |
| 335 | } | 322 | } |
| @@ -349,6 +336,9 @@ extern unsigned long sysctl_hung_task_warnings; | |||
| 349 | extern int proc_dohung_task_timeout_secs(struct ctl_table *table, int write, | 336 | extern int proc_dohung_task_timeout_secs(struct ctl_table *table, int write, |
| 350 | void __user *buffer, | 337 | void __user *buffer, |
| 351 | size_t *lenp, loff_t *ppos); | 338 | size_t *lenp, loff_t *ppos); |
| 339 | #else | ||
| 340 | /* Avoid need for ifdefs elsewhere in the code */ | ||
| 341 | enum { sysctl_hung_task_timeout_secs = 0 }; | ||
| 352 | #endif | 342 | #endif |
| 353 | 343 | ||
| 354 | /* Attach to any functions which should be ignored in wchan output. */ | 344 | /* Attach to any functions which should be ignored in wchan output. */ |
| @@ -634,7 +624,12 @@ struct signal_struct { | |||
| 634 | struct tty_audit_buf *tty_audit_buf; | 624 | struct tty_audit_buf *tty_audit_buf; |
| 635 | #endif | 625 | #endif |
| 636 | 626 | ||
| 637 | int oom_adj; /* OOM kill score adjustment (bit shift) */ | 627 | int oom_adj; /* OOM kill score adjustment (bit shift) */ |
| 628 | int oom_score_adj; /* OOM kill score adjustment */ | ||
| 629 | |||
| 630 | struct mutex cred_guard_mutex; /* guard against foreign influences on | ||
| 631 | * credential calculations | ||
| 632 | * (notably. ptrace) */ | ||
| 638 | }; | 633 | }; |
| 639 | 634 | ||
| 640 | /* Context switch must be unlocked if interrupts are to be enabled */ | 635 | /* Context switch must be unlocked if interrupts are to be enabled */ |
| @@ -805,7 +800,7 @@ enum cpu_idle_type { | |||
| 805 | #define SD_POWERSAVINGS_BALANCE 0x0100 /* Balance for power savings */ | 800 | #define SD_POWERSAVINGS_BALANCE 0x0100 /* Balance for power savings */ |
| 806 | #define SD_SHARE_PKG_RESOURCES 0x0200 /* Domain members share cpu pkg resources */ | 801 | #define SD_SHARE_PKG_RESOURCES 0x0200 /* Domain members share cpu pkg resources */ |
| 807 | #define SD_SERIALIZE 0x0400 /* Only a single load balancing instance */ | 802 | #define SD_SERIALIZE 0x0400 /* Only a single load balancing instance */ |
| 808 | 803 | #define SD_ASYM_PACKING 0x0800 /* Place busy groups earlier in the domain */ | |
| 809 | #define SD_PREFER_SIBLING 0x1000 /* Prefer to place tasks in a sibling domain */ | 804 | #define SD_PREFER_SIBLING 0x1000 /* Prefer to place tasks in a sibling domain */ |
| 810 | 805 | ||
| 811 | enum powersavings_balance_level { | 806 | enum powersavings_balance_level { |
| @@ -840,6 +835,8 @@ static inline int sd_balance_for_package_power(void) | |||
| 840 | return SD_PREFER_SIBLING; | 835 | return SD_PREFER_SIBLING; |
| 841 | } | 836 | } |
| 842 | 837 | ||
| 838 | extern int __weak arch_sd_sibiling_asym_packing(void); | ||
| 839 | |||
| 843 | /* | 840 | /* |
| 844 | * Optimise SD flags for power savings: | 841 | * Optimise SD flags for power savings: |
| 845 | * SD_BALANCE_NEWIDLE helps agressive task consolidation and power savings. | 842 | * SD_BALANCE_NEWIDLE helps agressive task consolidation and power savings. |
| @@ -861,7 +858,7 @@ struct sched_group { | |||
| 861 | * CPU power of this group, SCHED_LOAD_SCALE being max power for a | 858 | * CPU power of this group, SCHED_LOAD_SCALE being max power for a |
| 862 | * single CPU. | 859 | * single CPU. |
| 863 | */ | 860 | */ |
| 864 | unsigned int cpu_power; | 861 | unsigned int cpu_power, cpu_power_orig; |
| 865 | 862 | ||
| 866 | /* | 863 | /* |
| 867 | * The CPUs this group covers. | 864 | * The CPUs this group covers. |
| @@ -885,6 +882,7 @@ enum sched_domain_level { | |||
| 885 | SD_LV_NONE = 0, | 882 | SD_LV_NONE = 0, |
| 886 | SD_LV_SIBLING, | 883 | SD_LV_SIBLING, |
| 887 | SD_LV_MC, | 884 | SD_LV_MC, |
| 885 | SD_LV_BOOK, | ||
| 888 | SD_LV_CPU, | 886 | SD_LV_CPU, |
| 889 | SD_LV_NODE, | 887 | SD_LV_NODE, |
| 890 | SD_LV_ALLNODES, | 888 | SD_LV_ALLNODES, |
| @@ -1170,6 +1168,13 @@ struct sched_rt_entity { | |||
| 1170 | 1168 | ||
| 1171 | struct rcu_node; | 1169 | struct rcu_node; |
| 1172 | 1170 | ||
| 1171 | enum perf_event_task_context { | ||
| 1172 | perf_invalid_context = -1, | ||
| 1173 | perf_hw_context = 0, | ||
| 1174 | perf_sw_context, | ||
| 1175 | perf_nr_task_contexts, | ||
| 1176 | }; | ||
| 1177 | |||
| 1173 | struct task_struct { | 1178 | struct task_struct { |
| 1174 | volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */ | 1179 | volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */ |
| 1175 | void *stack; | 1180 | void *stack; |
| @@ -1212,11 +1217,13 @@ struct task_struct { | |||
| 1212 | unsigned int policy; | 1217 | unsigned int policy; |
| 1213 | cpumask_t cpus_allowed; | 1218 | cpumask_t cpus_allowed; |
| 1214 | 1219 | ||
| 1215 | #ifdef CONFIG_TREE_PREEMPT_RCU | 1220 | #ifdef CONFIG_PREEMPT_RCU |
| 1216 | int rcu_read_lock_nesting; | 1221 | int rcu_read_lock_nesting; |
| 1217 | char rcu_read_unlock_special; | 1222 | char rcu_read_unlock_special; |
| 1218 | struct rcu_node *rcu_blocked_node; | ||
| 1219 | struct list_head rcu_node_entry; | 1223 | struct list_head rcu_node_entry; |
| 1224 | #endif /* #ifdef CONFIG_PREEMPT_RCU */ | ||
| 1225 | #ifdef CONFIG_TREE_PREEMPT_RCU | ||
| 1226 | struct rcu_node *rcu_blocked_node; | ||
| 1220 | #endif /* #ifdef CONFIG_TREE_PREEMPT_RCU */ | 1227 | #endif /* #ifdef CONFIG_TREE_PREEMPT_RCU */ |
| 1221 | 1228 | ||
| 1222 | #if defined(CONFIG_SCHEDSTATS) || defined(CONFIG_TASK_DELAY_ACCT) | 1229 | #if defined(CONFIG_SCHEDSTATS) || defined(CONFIG_TASK_DELAY_ACCT) |
| @@ -1298,13 +1305,10 @@ struct task_struct { | |||
| 1298 | struct list_head cpu_timers[3]; | 1305 | struct list_head cpu_timers[3]; |
| 1299 | 1306 | ||
| 1300 | /* process credentials */ | 1307 | /* process credentials */ |
| 1301 | const struct cred *real_cred; /* objective and real subjective task | 1308 | const struct cred __rcu *real_cred; /* objective and real subjective task |
| 1302 | * credentials (COW) */ | 1309 | * credentials (COW) */ |
| 1303 | const struct cred *cred; /* effective (overridable) subjective task | 1310 | const struct cred __rcu *cred; /* effective (overridable) subjective task |
| 1304 | * credentials (COW) */ | 1311 | * credentials (COW) */ |
| 1305 | struct mutex cred_guard_mutex; /* guard against foreign influences on | ||
| 1306 | * credential calculations | ||
| 1307 | * (notably. ptrace) */ | ||
| 1308 | struct cred *replacement_session_keyring; /* for KEYCTL_SESSION_TO_PARENT */ | 1312 | struct cred *replacement_session_keyring; /* for KEYCTL_SESSION_TO_PARENT */ |
| 1309 | 1313 | ||
| 1310 | char comm[TASK_COMM_LEN]; /* executable name excluding path | 1314 | char comm[TASK_COMM_LEN]; /* executable name excluding path |
| @@ -1428,7 +1432,7 @@ struct task_struct { | |||
| 1428 | #endif | 1432 | #endif |
| 1429 | #ifdef CONFIG_CGROUPS | 1433 | #ifdef CONFIG_CGROUPS |
| 1430 | /* Control Group info protected by css_set_lock */ | 1434 | /* Control Group info protected by css_set_lock */ |
| 1431 | struct css_set *cgroups; | 1435 | struct css_set __rcu *cgroups; |
| 1432 | /* cg_list protected by css_set_lock and tsk->alloc_lock */ | 1436 | /* cg_list protected by css_set_lock and tsk->alloc_lock */ |
| 1433 | struct list_head cg_list; | 1437 | struct list_head cg_list; |
| 1434 | #endif | 1438 | #endif |
| @@ -1441,7 +1445,7 @@ struct task_struct { | |||
| 1441 | struct futex_pi_state *pi_state_cache; | 1445 | struct futex_pi_state *pi_state_cache; |
| 1442 | #endif | 1446 | #endif |
| 1443 | #ifdef CONFIG_PERF_EVENTS | 1447 | #ifdef CONFIG_PERF_EVENTS |
| 1444 | struct perf_event_context *perf_event_ctxp; | 1448 | struct perf_event_context *perf_event_ctxp[perf_nr_task_contexts]; |
| 1445 | struct mutex perf_event_mutex; | 1449 | struct mutex perf_event_mutex; |
| 1446 | struct list_head perf_event_list; | 1450 | struct list_head perf_event_list; |
| 1447 | #endif | 1451 | #endif |
| @@ -1691,19 +1695,18 @@ extern void thread_group_times(struct task_struct *p, cputime_t *ut, cputime_t * | |||
| 1691 | /* | 1695 | /* |
| 1692 | * Per process flags | 1696 | * Per process flags |
| 1693 | */ | 1697 | */ |
| 1694 | #define PF_ALIGNWARN 0x00000001 /* Print alignment warning msgs */ | 1698 | #define PF_KSOFTIRQD 0x00000001 /* I am ksoftirqd */ |
| 1695 | /* Not implemented yet, only for 486*/ | ||
| 1696 | #define PF_STARTING 0x00000002 /* being created */ | 1699 | #define PF_STARTING 0x00000002 /* being created */ |
| 1697 | #define PF_EXITING 0x00000004 /* getting shut down */ | 1700 | #define PF_EXITING 0x00000004 /* getting shut down */ |
| 1698 | #define PF_EXITPIDONE 0x00000008 /* pi exit done on shut down */ | 1701 | #define PF_EXITPIDONE 0x00000008 /* pi exit done on shut down */ |
| 1699 | #define PF_VCPU 0x00000010 /* I'm a virtual CPU */ | 1702 | #define PF_VCPU 0x00000010 /* I'm a virtual CPU */ |
| 1703 | #define PF_WQ_WORKER 0x00000020 /* I'm a workqueue worker */ | ||
| 1700 | #define PF_FORKNOEXEC 0x00000040 /* forked but didn't exec */ | 1704 | #define PF_FORKNOEXEC 0x00000040 /* forked but didn't exec */ |
| 1701 | #define PF_MCE_PROCESS 0x00000080 /* process policy on mce errors */ | 1705 | #define PF_MCE_PROCESS 0x00000080 /* process policy on mce errors */ |
| 1702 | #define PF_SUPERPRIV 0x00000100 /* used super-user privileges */ | 1706 | #define PF_SUPERPRIV 0x00000100 /* used super-user privileges */ |
| 1703 | #define PF_DUMPCORE 0x00000200 /* dumped core */ | 1707 | #define PF_DUMPCORE 0x00000200 /* dumped core */ |
| 1704 | #define PF_SIGNALED 0x00000400 /* killed by a signal */ | 1708 | #define PF_SIGNALED 0x00000400 /* killed by a signal */ |
| 1705 | #define PF_MEMALLOC 0x00000800 /* Allocating memory */ | 1709 | #define PF_MEMALLOC 0x00000800 /* Allocating memory */ |
| 1706 | #define PF_FLUSHER 0x00001000 /* responsible for disk writeback */ | ||
| 1707 | #define PF_USED_MATH 0x00002000 /* if unset the fpu must be initialized before use */ | 1710 | #define PF_USED_MATH 0x00002000 /* if unset the fpu must be initialized before use */ |
| 1708 | #define PF_FREEZING 0x00004000 /* freeze in progress. do not account to load */ | 1711 | #define PF_FREEZING 0x00004000 /* freeze in progress. do not account to load */ |
| 1709 | #define PF_NOFREEZE 0x00008000 /* this thread should not be frozen */ | 1712 | #define PF_NOFREEZE 0x00008000 /* this thread should not be frozen */ |
| @@ -1749,7 +1752,7 @@ extern void thread_group_times(struct task_struct *p, cputime_t *ut, cputime_t * | |||
| 1749 | #define tsk_used_math(p) ((p)->flags & PF_USED_MATH) | 1752 | #define tsk_used_math(p) ((p)->flags & PF_USED_MATH) |
| 1750 | #define used_math() tsk_used_math(current) | 1753 | #define used_math() tsk_used_math(current) |
| 1751 | 1754 | ||
| 1752 | #ifdef CONFIG_TREE_PREEMPT_RCU | 1755 | #ifdef CONFIG_PREEMPT_RCU |
| 1753 | 1756 | ||
| 1754 | #define RCU_READ_UNLOCK_BLOCKED (1 << 0) /* blocked while in RCU read-side. */ | 1757 | #define RCU_READ_UNLOCK_BLOCKED (1 << 0) /* blocked while in RCU read-side. */ |
| 1755 | #define RCU_READ_UNLOCK_NEED_QS (1 << 1) /* RCU core needs CPU response. */ | 1758 | #define RCU_READ_UNLOCK_NEED_QS (1 << 1) /* RCU core needs CPU response. */ |
| @@ -1758,7 +1761,9 @@ static inline void rcu_copy_process(struct task_struct *p) | |||
| 1758 | { | 1761 | { |
| 1759 | p->rcu_read_lock_nesting = 0; | 1762 | p->rcu_read_lock_nesting = 0; |
| 1760 | p->rcu_read_unlock_special = 0; | 1763 | p->rcu_read_unlock_special = 0; |
| 1764 | #ifdef CONFIG_TREE_PREEMPT_RCU | ||
| 1761 | p->rcu_blocked_node = NULL; | 1765 | p->rcu_blocked_node = NULL; |
| 1766 | #endif | ||
| 1762 | INIT_LIST_HEAD(&p->rcu_node_entry); | 1767 | INIT_LIST_HEAD(&p->rcu_node_entry); |
| 1763 | } | 1768 | } |
| 1764 | 1769 | ||
| @@ -1791,20 +1796,23 @@ static inline int set_cpus_allowed(struct task_struct *p, cpumask_t new_mask) | |||
| 1791 | #endif | 1796 | #endif |
| 1792 | 1797 | ||
| 1793 | /* | 1798 | /* |
| 1794 | * Architectures can set this to 1 if they have specified | 1799 | * Do not use outside of architecture code which knows its limitations. |
| 1795 | * CONFIG_HAVE_UNSTABLE_SCHED_CLOCK in their arch Kconfig, | 1800 | * |
| 1796 | * but then during bootup it turns out that sched_clock() | 1801 | * sched_clock() has no promise of monotonicity or bounded drift between |
| 1797 | * is reliable after all: | 1802 | * CPUs, use (which you should not) requires disabling IRQs. |
| 1803 | * | ||
| 1804 | * Please use one of the three interfaces below. | ||
| 1798 | */ | 1805 | */ |
| 1799 | #ifdef CONFIG_HAVE_UNSTABLE_SCHED_CLOCK | ||
| 1800 | extern int sched_clock_stable; | ||
| 1801 | #endif | ||
| 1802 | |||
| 1803 | /* ftrace calls sched_clock() directly */ | ||
| 1804 | extern unsigned long long notrace sched_clock(void); | 1806 | extern unsigned long long notrace sched_clock(void); |
| 1807 | /* | ||
| 1808 | * See the comment in kernel/sched_clock.c | ||
| 1809 | */ | ||
| 1810 | extern u64 cpu_clock(int cpu); | ||
| 1811 | extern u64 local_clock(void); | ||
| 1812 | extern u64 sched_clock_cpu(int cpu); | ||
| 1813 | |||
| 1805 | 1814 | ||
| 1806 | extern void sched_clock_init(void); | 1815 | extern void sched_clock_init(void); |
| 1807 | extern u64 sched_clock_cpu(int cpu); | ||
| 1808 | 1816 | ||
| 1809 | #ifndef CONFIG_HAVE_UNSTABLE_SCHED_CLOCK | 1817 | #ifndef CONFIG_HAVE_UNSTABLE_SCHED_CLOCK |
| 1810 | static inline void sched_clock_tick(void) | 1818 | static inline void sched_clock_tick(void) |
| @@ -1819,16 +1827,31 @@ static inline void sched_clock_idle_wakeup_event(u64 delta_ns) | |||
| 1819 | { | 1827 | { |
| 1820 | } | 1828 | } |
| 1821 | #else | 1829 | #else |
| 1830 | /* | ||
| 1831 | * Architectures can set this to 1 if they have specified | ||
| 1832 | * CONFIG_HAVE_UNSTABLE_SCHED_CLOCK in their arch Kconfig, | ||
| 1833 | * but then during bootup it turns out that sched_clock() | ||
| 1834 | * is reliable after all: | ||
| 1835 | */ | ||
| 1836 | extern int sched_clock_stable; | ||
| 1837 | |||
| 1822 | extern void sched_clock_tick(void); | 1838 | extern void sched_clock_tick(void); |
| 1823 | extern void sched_clock_idle_sleep_event(void); | 1839 | extern void sched_clock_idle_sleep_event(void); |
| 1824 | extern void sched_clock_idle_wakeup_event(u64 delta_ns); | 1840 | extern void sched_clock_idle_wakeup_event(u64 delta_ns); |
| 1825 | #endif | 1841 | #endif |
| 1826 | 1842 | ||
| 1843 | #ifdef CONFIG_IRQ_TIME_ACCOUNTING | ||
| 1827 | /* | 1844 | /* |
| 1828 | * For kernel-internal use: high-speed (but slightly incorrect) per-cpu | 1845 | * An i/f to runtime opt-in for irq time accounting based off of sched_clock. |
| 1829 | * clock constructed from sched_clock(): | 1846 | * The reason for this explicit opt-in is not to have perf penalty with |
| 1847 | * slow sched_clocks. | ||
| 1830 | */ | 1848 | */ |
| 1831 | extern unsigned long long cpu_clock(int cpu); | 1849 | extern void enable_sched_clock_irqtime(void); |
| 1850 | extern void disable_sched_clock_irqtime(void); | ||
| 1851 | #else | ||
| 1852 | static inline void enable_sched_clock_irqtime(void) {} | ||
| 1853 | static inline void disable_sched_clock_irqtime(void) {} | ||
| 1854 | #endif | ||
| 1832 | 1855 | ||
| 1833 | extern unsigned long long | 1856 | extern unsigned long long |
| 1834 | task_sched_runtime(struct task_struct *task); | 1857 | task_sched_runtime(struct task_struct *task); |
| @@ -2113,7 +2136,9 @@ extern void daemonize(const char *, ...); | |||
| 2113 | extern int allow_signal(int); | 2136 | extern int allow_signal(int); |
| 2114 | extern int disallow_signal(int); | 2137 | extern int disallow_signal(int); |
| 2115 | 2138 | ||
| 2116 | extern int do_execve(char *, char __user * __user *, char __user * __user *, struct pt_regs *); | 2139 | extern int do_execve(const char *, |
| 2140 | const char __user * const __user *, | ||
| 2141 | const char __user * const __user *, struct pt_regs *); | ||
| 2117 | extern long do_fork(unsigned long, unsigned long, struct pt_regs *, unsigned long, int __user *, int __user *); | 2142 | extern long do_fork(unsigned long, unsigned long, struct pt_regs *, unsigned long, int __user *, int __user *); |
| 2118 | struct task_struct *fork_idle(int); | 2143 | struct task_struct *fork_idle(int); |
| 2119 | 2144 | ||
| @@ -2212,9 +2237,16 @@ static inline void task_unlock(struct task_struct *p) | |||
| 2212 | spin_unlock(&p->alloc_lock); | 2237 | spin_unlock(&p->alloc_lock); |
| 2213 | } | 2238 | } |
| 2214 | 2239 | ||
| 2215 | extern struct sighand_struct *lock_task_sighand(struct task_struct *tsk, | 2240 | extern struct sighand_struct *__lock_task_sighand(struct task_struct *tsk, |
| 2216 | unsigned long *flags); | 2241 | unsigned long *flags); |
| 2217 | 2242 | ||
| 2243 | #define lock_task_sighand(tsk, flags) \ | ||
| 2244 | ({ struct sighand_struct *__ss; \ | ||
| 2245 | __cond_lock(&(tsk)->sighand->siglock, \ | ||
| 2246 | (__ss = __lock_task_sighand(tsk, flags))); \ | ||
| 2247 | __ss; \ | ||
| 2248 | }) \ | ||
| 2249 | |||
| 2218 | static inline void unlock_task_sighand(struct task_struct *tsk, | 2250 | static inline void unlock_task_sighand(struct task_struct *tsk, |
| 2219 | unsigned long *flags) | 2251 | unsigned long *flags) |
| 2220 | { | 2252 | { |
| @@ -2369,9 +2401,9 @@ extern int __cond_resched_lock(spinlock_t *lock); | |||
| 2369 | 2401 | ||
| 2370 | extern int __cond_resched_softirq(void); | 2402 | extern int __cond_resched_softirq(void); |
| 2371 | 2403 | ||
| 2372 | #define cond_resched_softirq() ({ \ | 2404 | #define cond_resched_softirq() ({ \ |
| 2373 | __might_sleep(__FILE__, __LINE__, SOFTIRQ_OFFSET); \ | 2405 | __might_sleep(__FILE__, __LINE__, SOFTIRQ_DISABLE_OFFSET); \ |
| 2374 | __cond_resched_softirq(); \ | 2406 | __cond_resched_softirq(); \ |
| 2375 | }) | 2407 | }) |
| 2376 | 2408 | ||
| 2377 | /* | 2409 | /* |
| @@ -2435,18 +2467,6 @@ static inline void set_task_cpu(struct task_struct *p, unsigned int cpu) | |||
| 2435 | 2467 | ||
| 2436 | #endif /* CONFIG_SMP */ | 2468 | #endif /* CONFIG_SMP */ |
| 2437 | 2469 | ||
| 2438 | #ifdef CONFIG_TRACING | ||
| 2439 | extern void | ||
| 2440 | __trace_special(void *__tr, void *__data, | ||
| 2441 | unsigned long arg1, unsigned long arg2, unsigned long arg3); | ||
| 2442 | #else | ||
| 2443 | static inline void | ||
| 2444 | __trace_special(void *__tr, void *__data, | ||
| 2445 | unsigned long arg1, unsigned long arg2, unsigned long arg3) | ||
| 2446 | { | ||
| 2447 | } | ||
| 2448 | #endif | ||
| 2449 | |||
| 2450 | extern long sched_setaffinity(pid_t pid, const struct cpumask *new_mask); | 2470 | extern long sched_setaffinity(pid_t pid, const struct cpumask *new_mask); |
| 2451 | extern long sched_getaffinity(pid_t pid, struct cpumask *mask); | 2471 | extern long sched_getaffinity(pid_t pid, struct cpumask *mask); |
| 2452 | 2472 | ||
diff --git a/include/linux/sctp.h b/include/linux/sctp.h index c20d3ce673c0..c11a28706fa4 100644 --- a/include/linux/sctp.h +++ b/include/linux/sctp.h | |||
| @@ -61,7 +61,7 @@ typedef struct sctphdr { | |||
| 61 | __be16 dest; | 61 | __be16 dest; |
| 62 | __be32 vtag; | 62 | __be32 vtag; |
| 63 | __le32 checksum; | 63 | __le32 checksum; |
| 64 | } __attribute__((packed)) sctp_sctphdr_t; | 64 | } __packed sctp_sctphdr_t; |
| 65 | 65 | ||
| 66 | #ifdef __KERNEL__ | 66 | #ifdef __KERNEL__ |
| 67 | #include <linux/skbuff.h> | 67 | #include <linux/skbuff.h> |
| @@ -77,7 +77,7 @@ typedef struct sctp_chunkhdr { | |||
| 77 | __u8 type; | 77 | __u8 type; |
| 78 | __u8 flags; | 78 | __u8 flags; |
| 79 | __be16 length; | 79 | __be16 length; |
| 80 | } __attribute__((packed)) sctp_chunkhdr_t; | 80 | } __packed sctp_chunkhdr_t; |
| 81 | 81 | ||
| 82 | 82 | ||
| 83 | /* Section 3.2. Chunk Type Values. | 83 | /* Section 3.2. Chunk Type Values. |
| @@ -167,7 +167,7 @@ enum { SCTP_CHUNK_FLAG_T = 0x01 }; | |||
| 167 | typedef struct sctp_paramhdr { | 167 | typedef struct sctp_paramhdr { |
| 168 | __be16 type; | 168 | __be16 type; |
| 169 | __be16 length; | 169 | __be16 length; |
| 170 | } __attribute__((packed)) sctp_paramhdr_t; | 170 | } __packed sctp_paramhdr_t; |
| 171 | 171 | ||
| 172 | typedef enum { | 172 | typedef enum { |
| 173 | 173 | ||
| @@ -228,12 +228,12 @@ typedef struct sctp_datahdr { | |||
| 228 | __be16 ssn; | 228 | __be16 ssn; |
| 229 | __be32 ppid; | 229 | __be32 ppid; |
| 230 | __u8 payload[0]; | 230 | __u8 payload[0]; |
| 231 | } __attribute__((packed)) sctp_datahdr_t; | 231 | } __packed sctp_datahdr_t; |
| 232 | 232 | ||
| 233 | typedef struct sctp_data_chunk { | 233 | typedef struct sctp_data_chunk { |
| 234 | sctp_chunkhdr_t chunk_hdr; | 234 | sctp_chunkhdr_t chunk_hdr; |
| 235 | sctp_datahdr_t data_hdr; | 235 | sctp_datahdr_t data_hdr; |
| 236 | } __attribute__((packed)) sctp_data_chunk_t; | 236 | } __packed sctp_data_chunk_t; |
| 237 | 237 | ||
| 238 | /* DATA Chuck Specific Flags */ | 238 | /* DATA Chuck Specific Flags */ |
| 239 | enum { | 239 | enum { |
| @@ -259,78 +259,78 @@ typedef struct sctp_inithdr { | |||
| 259 | __be16 num_inbound_streams; | 259 | __be16 num_inbound_streams; |
| 260 | __be32 initial_tsn; | 260 | __be32 initial_tsn; |
| 261 | __u8 params[0]; | 261 | __u8 params[0]; |
| 262 | } __attribute__((packed)) sctp_inithdr_t; | 262 | } __packed sctp_inithdr_t; |
| 263 | 263 | ||
| 264 | typedef struct sctp_init_chunk { | 264 | typedef struct sctp_init_chunk { |
| 265 | sctp_chunkhdr_t chunk_hdr; | 265 | sctp_chunkhdr_t chunk_hdr; |
| 266 | sctp_inithdr_t init_hdr; | 266 | sctp_inithdr_t init_hdr; |
| 267 | } __attribute__((packed)) sctp_init_chunk_t; | 267 | } __packed sctp_init_chunk_t; |
| 268 | 268 | ||
| 269 | 269 | ||
| 270 | /* Section 3.3.2.1. IPv4 Address Parameter (5) */ | 270 | /* Section 3.3.2.1. IPv4 Address Parameter (5) */ |
| 271 | typedef struct sctp_ipv4addr_param { | 271 | typedef struct sctp_ipv4addr_param { |
| 272 | sctp_paramhdr_t param_hdr; | 272 | sctp_paramhdr_t param_hdr; |
| 273 | struct in_addr addr; | 273 | struct in_addr addr; |
| 274 | } __attribute__((packed)) sctp_ipv4addr_param_t; | 274 | } __packed sctp_ipv4addr_param_t; |
| 275 | 275 | ||
| 276 | /* Section 3.3.2.1. IPv6 Address Parameter (6) */ | 276 | /* Section 3.3.2.1. IPv6 Address Parameter (6) */ |
| 277 | typedef struct sctp_ipv6addr_param { | 277 | typedef struct sctp_ipv6addr_param { |
| 278 | sctp_paramhdr_t param_hdr; | 278 | sctp_paramhdr_t param_hdr; |
| 279 | struct in6_addr addr; | 279 | struct in6_addr addr; |
| 280 | } __attribute__((packed)) sctp_ipv6addr_param_t; | 280 | } __packed sctp_ipv6addr_param_t; |
| 281 | 281 | ||
| 282 | /* Section 3.3.2.1 Cookie Preservative (9) */ | 282 | /* Section 3.3.2.1 Cookie Preservative (9) */ |
| 283 | typedef struct sctp_cookie_preserve_param { | 283 | typedef struct sctp_cookie_preserve_param { |
| 284 | sctp_paramhdr_t param_hdr; | 284 | sctp_paramhdr_t param_hdr; |
| 285 | __be32 lifespan_increment; | 285 | __be32 lifespan_increment; |
| 286 | } __attribute__((packed)) sctp_cookie_preserve_param_t; | 286 | } __packed sctp_cookie_preserve_param_t; |
| 287 | 287 | ||
| 288 | /* Section 3.3.2.1 Host Name Address (11) */ | 288 | /* Section 3.3.2.1 Host Name Address (11) */ |
| 289 | typedef struct sctp_hostname_param { | 289 | typedef struct sctp_hostname_param { |
| 290 | sctp_paramhdr_t param_hdr; | 290 | sctp_paramhdr_t param_hdr; |
| 291 | uint8_t hostname[0]; | 291 | uint8_t hostname[0]; |
| 292 | } __attribute__((packed)) sctp_hostname_param_t; | 292 | } __packed sctp_hostname_param_t; |
| 293 | 293 | ||
| 294 | /* Section 3.3.2.1 Supported Address Types (12) */ | 294 | /* Section 3.3.2.1 Supported Address Types (12) */ |
| 295 | typedef struct sctp_supported_addrs_param { | 295 | typedef struct sctp_supported_addrs_param { |
| 296 | sctp_paramhdr_t param_hdr; | 296 | sctp_paramhdr_t param_hdr; |
| 297 | __be16 types[0]; | 297 | __be16 types[0]; |
| 298 | } __attribute__((packed)) sctp_supported_addrs_param_t; | 298 | } __packed sctp_supported_addrs_param_t; |
| 299 | 299 | ||
| 300 | /* Appendix A. ECN Capable (32768) */ | 300 | /* Appendix A. ECN Capable (32768) */ |
| 301 | typedef struct sctp_ecn_capable_param { | 301 | typedef struct sctp_ecn_capable_param { |
| 302 | sctp_paramhdr_t param_hdr; | 302 | sctp_paramhdr_t param_hdr; |
| 303 | } __attribute__((packed)) sctp_ecn_capable_param_t; | 303 | } __packed sctp_ecn_capable_param_t; |
| 304 | 304 | ||
| 305 | /* ADDIP Section 3.2.6 Adaptation Layer Indication */ | 305 | /* ADDIP Section 3.2.6 Adaptation Layer Indication */ |
| 306 | typedef struct sctp_adaptation_ind_param { | 306 | typedef struct sctp_adaptation_ind_param { |
| 307 | struct sctp_paramhdr param_hdr; | 307 | struct sctp_paramhdr param_hdr; |
| 308 | __be32 adaptation_ind; | 308 | __be32 adaptation_ind; |
| 309 | } __attribute__((packed)) sctp_adaptation_ind_param_t; | 309 | } __packed sctp_adaptation_ind_param_t; |
| 310 | 310 | ||
| 311 | /* ADDIP Section 4.2.7 Supported Extensions Parameter */ | 311 | /* ADDIP Section 4.2.7 Supported Extensions Parameter */ |
| 312 | typedef struct sctp_supported_ext_param { | 312 | typedef struct sctp_supported_ext_param { |
| 313 | struct sctp_paramhdr param_hdr; | 313 | struct sctp_paramhdr param_hdr; |
| 314 | __u8 chunks[0]; | 314 | __u8 chunks[0]; |
| 315 | } __attribute__((packed)) sctp_supported_ext_param_t; | 315 | } __packed sctp_supported_ext_param_t; |
| 316 | 316 | ||
| 317 | /* AUTH Section 3.1 Random */ | 317 | /* AUTH Section 3.1 Random */ |
| 318 | typedef struct sctp_random_param { | 318 | typedef struct sctp_random_param { |
| 319 | sctp_paramhdr_t param_hdr; | 319 | sctp_paramhdr_t param_hdr; |
| 320 | __u8 random_val[0]; | 320 | __u8 random_val[0]; |
| 321 | } __attribute__((packed)) sctp_random_param_t; | 321 | } __packed sctp_random_param_t; |
| 322 | 322 | ||
| 323 | /* AUTH Section 3.2 Chunk List */ | 323 | /* AUTH Section 3.2 Chunk List */ |
| 324 | typedef struct sctp_chunks_param { | 324 | typedef struct sctp_chunks_param { |
| 325 | sctp_paramhdr_t param_hdr; | 325 | sctp_paramhdr_t param_hdr; |
| 326 | __u8 chunks[0]; | 326 | __u8 chunks[0]; |
| 327 | } __attribute__((packed)) sctp_chunks_param_t; | 327 | } __packed sctp_chunks_param_t; |
| 328 | 328 | ||
| 329 | /* AUTH Section 3.3 HMAC Algorithm */ | 329 | /* AUTH Section 3.3 HMAC Algorithm */ |
| 330 | typedef struct sctp_hmac_algo_param { | 330 | typedef struct sctp_hmac_algo_param { |
| 331 | sctp_paramhdr_t param_hdr; | 331 | sctp_paramhdr_t param_hdr; |
| 332 | __be16 hmac_ids[0]; | 332 | __be16 hmac_ids[0]; |
| 333 | } __attribute__((packed)) sctp_hmac_algo_param_t; | 333 | } __packed sctp_hmac_algo_param_t; |
| 334 | 334 | ||
| 335 | /* RFC 2960. Section 3.3.3 Initiation Acknowledgement (INIT ACK) (2): | 335 | /* RFC 2960. Section 3.3.3 Initiation Acknowledgement (INIT ACK) (2): |
| 336 | * The INIT ACK chunk is used to acknowledge the initiation of an SCTP | 336 | * The INIT ACK chunk is used to acknowledge the initiation of an SCTP |
| @@ -342,13 +342,13 @@ typedef sctp_init_chunk_t sctp_initack_chunk_t; | |||
| 342 | typedef struct sctp_cookie_param { | 342 | typedef struct sctp_cookie_param { |
| 343 | sctp_paramhdr_t p; | 343 | sctp_paramhdr_t p; |
| 344 | __u8 body[0]; | 344 | __u8 body[0]; |
| 345 | } __attribute__((packed)) sctp_cookie_param_t; | 345 | } __packed sctp_cookie_param_t; |
| 346 | 346 | ||
| 347 | /* Section 3.3.3.1 Unrecognized Parameters (8) */ | 347 | /* Section 3.3.3.1 Unrecognized Parameters (8) */ |
| 348 | typedef struct sctp_unrecognized_param { | 348 | typedef struct sctp_unrecognized_param { |
| 349 | sctp_paramhdr_t param_hdr; | 349 | sctp_paramhdr_t param_hdr; |
| 350 | sctp_paramhdr_t unrecognized; | 350 | sctp_paramhdr_t unrecognized; |
| 351 | } __attribute__((packed)) sctp_unrecognized_param_t; | 351 | } __packed sctp_unrecognized_param_t; |
| 352 | 352 | ||
| 353 | 353 | ||
| 354 | 354 | ||
| @@ -363,7 +363,7 @@ typedef struct sctp_unrecognized_param { | |||
| 363 | typedef struct sctp_gap_ack_block { | 363 | typedef struct sctp_gap_ack_block { |
| 364 | __be16 start; | 364 | __be16 start; |
| 365 | __be16 end; | 365 | __be16 end; |
| 366 | } __attribute__((packed)) sctp_gap_ack_block_t; | 366 | } __packed sctp_gap_ack_block_t; |
| 367 | 367 | ||
| 368 | typedef __be32 sctp_dup_tsn_t; | 368 | typedef __be32 sctp_dup_tsn_t; |
| 369 | 369 | ||
| @@ -378,12 +378,12 @@ typedef struct sctp_sackhdr { | |||
| 378 | __be16 num_gap_ack_blocks; | 378 | __be16 num_gap_ack_blocks; |
| 379 | __be16 num_dup_tsns; | 379 | __be16 num_dup_tsns; |
| 380 | sctp_sack_variable_t variable[0]; | 380 | sctp_sack_variable_t variable[0]; |
| 381 | } __attribute__((packed)) sctp_sackhdr_t; | 381 | } __packed sctp_sackhdr_t; |
| 382 | 382 | ||
| 383 | typedef struct sctp_sack_chunk { | 383 | typedef struct sctp_sack_chunk { |
| 384 | sctp_chunkhdr_t chunk_hdr; | 384 | sctp_chunkhdr_t chunk_hdr; |
| 385 | sctp_sackhdr_t sack_hdr; | 385 | sctp_sackhdr_t sack_hdr; |
| 386 | } __attribute__((packed)) sctp_sack_chunk_t; | 386 | } __packed sctp_sack_chunk_t; |
| 387 | 387 | ||
| 388 | 388 | ||
| 389 | /* RFC 2960. Section 3.3.5 Heartbeat Request (HEARTBEAT) (4): | 389 | /* RFC 2960. Section 3.3.5 Heartbeat Request (HEARTBEAT) (4): |
| @@ -395,12 +395,12 @@ typedef struct sctp_sack_chunk { | |||
| 395 | 395 | ||
| 396 | typedef struct sctp_heartbeathdr { | 396 | typedef struct sctp_heartbeathdr { |
| 397 | sctp_paramhdr_t info; | 397 | sctp_paramhdr_t info; |
| 398 | } __attribute__((packed)) sctp_heartbeathdr_t; | 398 | } __packed sctp_heartbeathdr_t; |
| 399 | 399 | ||
| 400 | typedef struct sctp_heartbeat_chunk { | 400 | typedef struct sctp_heartbeat_chunk { |
| 401 | sctp_chunkhdr_t chunk_hdr; | 401 | sctp_chunkhdr_t chunk_hdr; |
| 402 | sctp_heartbeathdr_t hb_hdr; | 402 | sctp_heartbeathdr_t hb_hdr; |
| 403 | } __attribute__((packed)) sctp_heartbeat_chunk_t; | 403 | } __packed sctp_heartbeat_chunk_t; |
| 404 | 404 | ||
| 405 | 405 | ||
| 406 | /* For the abort and shutdown ACK we must carry the init tag in the | 406 | /* For the abort and shutdown ACK we must carry the init tag in the |
| @@ -409,7 +409,7 @@ typedef struct sctp_heartbeat_chunk { | |||
| 409 | */ | 409 | */ |
| 410 | typedef struct sctp_abort_chunk { | 410 | typedef struct sctp_abort_chunk { |
| 411 | sctp_chunkhdr_t uh; | 411 | sctp_chunkhdr_t uh; |
| 412 | } __attribute__((packed)) sctp_abort_chunk_t; | 412 | } __packed sctp_abort_chunk_t; |
| 413 | 413 | ||
| 414 | 414 | ||
| 415 | /* For the graceful shutdown we must carry the tag (in common header) | 415 | /* For the graceful shutdown we must carry the tag (in common header) |
| @@ -417,12 +417,12 @@ typedef struct sctp_abort_chunk { | |||
| 417 | */ | 417 | */ |
| 418 | typedef struct sctp_shutdownhdr { | 418 | typedef struct sctp_shutdownhdr { |
| 419 | __be32 cum_tsn_ack; | 419 | __be32 cum_tsn_ack; |
| 420 | } __attribute__((packed)) sctp_shutdownhdr_t; | 420 | } __packed sctp_shutdownhdr_t; |
| 421 | 421 | ||
| 422 | struct sctp_shutdown_chunk_t { | 422 | struct sctp_shutdown_chunk_t { |
| 423 | sctp_chunkhdr_t chunk_hdr; | 423 | sctp_chunkhdr_t chunk_hdr; |
| 424 | sctp_shutdownhdr_t shutdown_hdr; | 424 | sctp_shutdownhdr_t shutdown_hdr; |
| 425 | } __attribute__ ((packed)); | 425 | } __packed; |
| 426 | 426 | ||
| 427 | /* RFC 2960. Section 3.3.10 Operation Error (ERROR) (9) */ | 427 | /* RFC 2960. Section 3.3.10 Operation Error (ERROR) (9) */ |
| 428 | 428 | ||
| @@ -430,12 +430,12 @@ typedef struct sctp_errhdr { | |||
| 430 | __be16 cause; | 430 | __be16 cause; |
| 431 | __be16 length; | 431 | __be16 length; |
| 432 | __u8 variable[0]; | 432 | __u8 variable[0]; |
| 433 | } __attribute__((packed)) sctp_errhdr_t; | 433 | } __packed sctp_errhdr_t; |
| 434 | 434 | ||
| 435 | typedef struct sctp_operr_chunk { | 435 | typedef struct sctp_operr_chunk { |
| 436 | sctp_chunkhdr_t chunk_hdr; | 436 | sctp_chunkhdr_t chunk_hdr; |
| 437 | sctp_errhdr_t err_hdr; | 437 | sctp_errhdr_t err_hdr; |
| 438 | } __attribute__((packed)) sctp_operr_chunk_t; | 438 | } __packed sctp_operr_chunk_t; |
| 439 | 439 | ||
| 440 | /* RFC 2960 3.3.10 - Operation Error | 440 | /* RFC 2960 3.3.10 - Operation Error |
| 441 | * | 441 | * |
| @@ -525,7 +525,7 @@ typedef struct sctp_ecnehdr { | |||
| 525 | typedef struct sctp_ecne_chunk { | 525 | typedef struct sctp_ecne_chunk { |
| 526 | sctp_chunkhdr_t chunk_hdr; | 526 | sctp_chunkhdr_t chunk_hdr; |
| 527 | sctp_ecnehdr_t ence_hdr; | 527 | sctp_ecnehdr_t ence_hdr; |
| 528 | } __attribute__((packed)) sctp_ecne_chunk_t; | 528 | } __packed sctp_ecne_chunk_t; |
| 529 | 529 | ||
| 530 | /* RFC 2960. Appendix A. Explicit Congestion Notification. | 530 | /* RFC 2960. Appendix A. Explicit Congestion Notification. |
| 531 | * Congestion Window Reduced (CWR) (13) | 531 | * Congestion Window Reduced (CWR) (13) |
| @@ -537,7 +537,7 @@ typedef struct sctp_cwrhdr { | |||
| 537 | typedef struct sctp_cwr_chunk { | 537 | typedef struct sctp_cwr_chunk { |
| 538 | sctp_chunkhdr_t chunk_hdr; | 538 | sctp_chunkhdr_t chunk_hdr; |
| 539 | sctp_cwrhdr_t cwr_hdr; | 539 | sctp_cwrhdr_t cwr_hdr; |
| 540 | } __attribute__((packed)) sctp_cwr_chunk_t; | 540 | } __packed sctp_cwr_chunk_t; |
| 541 | 541 | ||
| 542 | /* PR-SCTP | 542 | /* PR-SCTP |
| 543 | * 3.2 Forward Cumulative TSN Chunk Definition (FORWARD TSN) | 543 | * 3.2 Forward Cumulative TSN Chunk Definition (FORWARD TSN) |
| @@ -588,17 +588,17 @@ typedef struct sctp_cwr_chunk { | |||
| 588 | struct sctp_fwdtsn_skip { | 588 | struct sctp_fwdtsn_skip { |
| 589 | __be16 stream; | 589 | __be16 stream; |
| 590 | __be16 ssn; | 590 | __be16 ssn; |
| 591 | } __attribute__((packed)); | 591 | } __packed; |
| 592 | 592 | ||
| 593 | struct sctp_fwdtsn_hdr { | 593 | struct sctp_fwdtsn_hdr { |
| 594 | __be32 new_cum_tsn; | 594 | __be32 new_cum_tsn; |
| 595 | struct sctp_fwdtsn_skip skip[0]; | 595 | struct sctp_fwdtsn_skip skip[0]; |
| 596 | } __attribute((packed)); | 596 | } __packed; |
| 597 | 597 | ||
| 598 | struct sctp_fwdtsn_chunk { | 598 | struct sctp_fwdtsn_chunk { |
| 599 | struct sctp_chunkhdr chunk_hdr; | 599 | struct sctp_chunkhdr chunk_hdr; |
| 600 | struct sctp_fwdtsn_hdr fwdtsn_hdr; | 600 | struct sctp_fwdtsn_hdr fwdtsn_hdr; |
| 601 | } __attribute((packed)); | 601 | } __packed; |
| 602 | 602 | ||
| 603 | 603 | ||
| 604 | /* ADDIP | 604 | /* ADDIP |
| @@ -636,17 +636,17 @@ struct sctp_fwdtsn_chunk { | |||
| 636 | typedef struct sctp_addip_param { | 636 | typedef struct sctp_addip_param { |
| 637 | sctp_paramhdr_t param_hdr; | 637 | sctp_paramhdr_t param_hdr; |
| 638 | __be32 crr_id; | 638 | __be32 crr_id; |
| 639 | } __attribute__((packed)) sctp_addip_param_t; | 639 | } __packed sctp_addip_param_t; |
| 640 | 640 | ||
| 641 | typedef struct sctp_addiphdr { | 641 | typedef struct sctp_addiphdr { |
| 642 | __be32 serial; | 642 | __be32 serial; |
| 643 | __u8 params[0]; | 643 | __u8 params[0]; |
| 644 | } __attribute__((packed)) sctp_addiphdr_t; | 644 | } __packed sctp_addiphdr_t; |
| 645 | 645 | ||
| 646 | typedef struct sctp_addip_chunk { | 646 | typedef struct sctp_addip_chunk { |
| 647 | sctp_chunkhdr_t chunk_hdr; | 647 | sctp_chunkhdr_t chunk_hdr; |
| 648 | sctp_addiphdr_t addip_hdr; | 648 | sctp_addiphdr_t addip_hdr; |
| 649 | } __attribute__((packed)) sctp_addip_chunk_t; | 649 | } __packed sctp_addip_chunk_t; |
| 650 | 650 | ||
| 651 | /* AUTH | 651 | /* AUTH |
| 652 | * Section 4.1 Authentication Chunk (AUTH) | 652 | * Section 4.1 Authentication Chunk (AUTH) |
| @@ -701,11 +701,11 @@ typedef struct sctp_authhdr { | |||
| 701 | __be16 shkey_id; | 701 | __be16 shkey_id; |
| 702 | __be16 hmac_id; | 702 | __be16 hmac_id; |
| 703 | __u8 hmac[0]; | 703 | __u8 hmac[0]; |
| 704 | } __attribute__((packed)) sctp_authhdr_t; | 704 | } __packed sctp_authhdr_t; |
| 705 | 705 | ||
| 706 | typedef struct sctp_auth_chunk { | 706 | typedef struct sctp_auth_chunk { |
| 707 | sctp_chunkhdr_t chunk_hdr; | 707 | sctp_chunkhdr_t chunk_hdr; |
| 708 | sctp_authhdr_t auth_hdr; | 708 | sctp_authhdr_t auth_hdr; |
| 709 | } __attribute__((packed)) sctp_auth_chunk_t; | 709 | } __packed sctp_auth_chunk_t; |
| 710 | 710 | ||
| 711 | #endif /* __LINUX_SCTP_H__ */ | 711 | #endif /* __LINUX_SCTP_H__ */ |
diff --git a/include/linux/security.h b/include/linux/security.h index 0c8819170463..b8246a8df7d2 100644 --- a/include/linux/security.h +++ b/include/linux/security.h | |||
| @@ -23,6 +23,7 @@ | |||
| 23 | #define __LINUX_SECURITY_H | 23 | #define __LINUX_SECURITY_H |
| 24 | 24 | ||
| 25 | #include <linux/fs.h> | 25 | #include <linux/fs.h> |
| 26 | #include <linux/fsnotify.h> | ||
| 26 | #include <linux/binfmts.h> | 27 | #include <linux/binfmts.h> |
| 27 | #include <linux/signal.h> | 28 | #include <linux/signal.h> |
| 28 | #include <linux/resource.h> | 29 | #include <linux/resource.h> |
| @@ -73,7 +74,7 @@ extern int cap_file_mmap(struct file *file, unsigned long reqprot, | |||
| 73 | extern int cap_task_fix_setuid(struct cred *new, const struct cred *old, int flags); | 74 | extern int cap_task_fix_setuid(struct cred *new, const struct cred *old, int flags); |
| 74 | extern int cap_task_prctl(int option, unsigned long arg2, unsigned long arg3, | 75 | extern int cap_task_prctl(int option, unsigned long arg2, unsigned long arg3, |
| 75 | unsigned long arg4, unsigned long arg5); | 76 | unsigned long arg4, unsigned long arg5); |
| 76 | extern int cap_task_setscheduler(struct task_struct *p, int policy, struct sched_param *lp); | 77 | extern int cap_task_setscheduler(struct task_struct *p); |
| 77 | extern int cap_task_setioprio(struct task_struct *p, int ioprio); | 78 | extern int cap_task_setioprio(struct task_struct *p, int ioprio); |
| 78 | extern int cap_task_setnice(struct task_struct *p, int nice); | 79 | extern int cap_task_setnice(struct task_struct *p, int nice); |
| 79 | extern int cap_syslog(int type, bool from_file); | 80 | extern int cap_syslog(int type, bool from_file); |
| @@ -470,8 +471,6 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts) | |||
| 470 | * @path_truncate: | 471 | * @path_truncate: |
| 471 | * Check permission before truncating a file. | 472 | * Check permission before truncating a file. |
| 472 | * @path contains the path structure for the file. | 473 | * @path contains the path structure for the file. |
| 473 | * @length is the new length of the file. | ||
| 474 | * @time_attrs is the flags passed to do_truncate(). | ||
| 475 | * Return 0 if permission is granted. | 474 | * Return 0 if permission is granted. |
| 476 | * @inode_getattr: | 475 | * @inode_getattr: |
| 477 | * Check permission before obtaining file attributes. | 476 | * Check permission before obtaining file attributes. |
| @@ -960,6 +959,12 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts) | |||
| 960 | * Sets the new child socket's sid to the openreq sid. | 959 | * Sets the new child socket's sid to the openreq sid. |
| 961 | * @inet_conn_established: | 960 | * @inet_conn_established: |
| 962 | * Sets the connection's peersid to the secmark on skb. | 961 | * Sets the connection's peersid to the secmark on skb. |
| 962 | * @secmark_relabel_packet: | ||
| 963 | * check if the process should be allowed to relabel packets to the given secid | ||
| 964 | * @security_secmark_refcount_inc | ||
| 965 | * tells the LSM to increment the number of secmark labeling rules loaded | ||
| 966 | * @security_secmark_refcount_dec | ||
| 967 | * tells the LSM to decrement the number of secmark labeling rules loaded | ||
| 963 | * @req_classify_flow: | 968 | * @req_classify_flow: |
| 964 | * Sets the flow's sid to the openreq sid. | 969 | * Sets the flow's sid to the openreq sid. |
| 965 | * @tun_dev_create: | 970 | * @tun_dev_create: |
| @@ -1280,9 +1285,13 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts) | |||
| 1280 | * Return 0 if permission is granted. | 1285 | * Return 0 if permission is granted. |
| 1281 | * | 1286 | * |
| 1282 | * @secid_to_secctx: | 1287 | * @secid_to_secctx: |
| 1283 | * Convert secid to security context. | 1288 | * Convert secid to security context. If secdata is NULL the length of |
| 1289 | * the result will be returned in seclen, but no secdata will be returned. | ||
| 1290 | * This does mean that the length could change between calls to check the | ||
| 1291 | * length and the next call which actually allocates and returns the secdata. | ||
| 1284 | * @secid contains the security ID. | 1292 | * @secid contains the security ID. |
| 1285 | * @secdata contains the pointer that stores the converted security context. | 1293 | * @secdata contains the pointer that stores the converted security context. |
| 1294 | * @seclen pointer which contains the length of the data | ||
| 1286 | * @secctx_to_secid: | 1295 | * @secctx_to_secid: |
| 1287 | * Convert security context to secid. | 1296 | * Convert security context to secid. |
| 1288 | * @secid contains the pointer to the generated security ID. | 1297 | * @secid contains the pointer to the generated security ID. |
| @@ -1412,8 +1421,7 @@ struct security_operations { | |||
| 1412 | int (*path_rmdir) (struct path *dir, struct dentry *dentry); | 1421 | int (*path_rmdir) (struct path *dir, struct dentry *dentry); |
| 1413 | int (*path_mknod) (struct path *dir, struct dentry *dentry, int mode, | 1422 | int (*path_mknod) (struct path *dir, struct dentry *dentry, int mode, |
| 1414 | unsigned int dev); | 1423 | unsigned int dev); |
| 1415 | int (*path_truncate) (struct path *path, loff_t length, | 1424 | int (*path_truncate) (struct path *path); |
| 1416 | unsigned int time_attrs); | ||
| 1417 | int (*path_symlink) (struct path *dir, struct dentry *dentry, | 1425 | int (*path_symlink) (struct path *dir, struct dentry *dentry, |
| 1418 | const char *old_name); | 1426 | const char *old_name); |
| 1419 | int (*path_link) (struct dentry *old_dentry, struct path *new_dir, | 1427 | int (*path_link) (struct dentry *old_dentry, struct path *new_dir, |
| @@ -1501,9 +1509,9 @@ struct security_operations { | |||
| 1501 | int (*task_setnice) (struct task_struct *p, int nice); | 1509 | int (*task_setnice) (struct task_struct *p, int nice); |
| 1502 | int (*task_setioprio) (struct task_struct *p, int ioprio); | 1510 | int (*task_setioprio) (struct task_struct *p, int ioprio); |
| 1503 | int (*task_getioprio) (struct task_struct *p); | 1511 | int (*task_getioprio) (struct task_struct *p); |
| 1504 | int (*task_setrlimit) (unsigned int resource, struct rlimit *new_rlim); | 1512 | int (*task_setrlimit) (struct task_struct *p, unsigned int resource, |
| 1505 | int (*task_setscheduler) (struct task_struct *p, int policy, | 1513 | struct rlimit *new_rlim); |
| 1506 | struct sched_param *lp); | 1514 | int (*task_setscheduler) (struct task_struct *p); |
| 1507 | int (*task_getscheduler) (struct task_struct *p); | 1515 | int (*task_getscheduler) (struct task_struct *p); |
| 1508 | int (*task_movememory) (struct task_struct *p); | 1516 | int (*task_movememory) (struct task_struct *p); |
| 1509 | int (*task_kill) (struct task_struct *p, | 1517 | int (*task_kill) (struct task_struct *p, |
| @@ -1595,6 +1603,9 @@ struct security_operations { | |||
| 1595 | struct request_sock *req); | 1603 | struct request_sock *req); |
| 1596 | void (*inet_csk_clone) (struct sock *newsk, const struct request_sock *req); | 1604 | void (*inet_csk_clone) (struct sock *newsk, const struct request_sock *req); |
| 1597 | void (*inet_conn_established) (struct sock *sk, struct sk_buff *skb); | 1605 | void (*inet_conn_established) (struct sock *sk, struct sk_buff *skb); |
| 1606 | int (*secmark_relabel_packet) (u32 secid); | ||
| 1607 | void (*secmark_refcount_inc) (void); | ||
| 1608 | void (*secmark_refcount_dec) (void); | ||
| 1598 | void (*req_classify_flow) (const struct request_sock *req, struct flowi *fl); | 1609 | void (*req_classify_flow) (const struct request_sock *req, struct flowi *fl); |
| 1599 | int (*tun_dev_create)(void); | 1610 | int (*tun_dev_create)(void); |
| 1600 | void (*tun_dev_post_create)(struct sock *sk); | 1611 | void (*tun_dev_post_create)(struct sock *sk); |
| @@ -1751,9 +1762,9 @@ void security_task_getsecid(struct task_struct *p, u32 *secid); | |||
| 1751 | int security_task_setnice(struct task_struct *p, int nice); | 1762 | int security_task_setnice(struct task_struct *p, int nice); |
| 1752 | int security_task_setioprio(struct task_struct *p, int ioprio); | 1763 | int security_task_setioprio(struct task_struct *p, int ioprio); |
| 1753 | int security_task_getioprio(struct task_struct *p); | 1764 | int security_task_getioprio(struct task_struct *p); |
| 1754 | int security_task_setrlimit(unsigned int resource, struct rlimit *new_rlim); | 1765 | int security_task_setrlimit(struct task_struct *p, unsigned int resource, |
| 1755 | int security_task_setscheduler(struct task_struct *p, | 1766 | struct rlimit *new_rlim); |
| 1756 | int policy, struct sched_param *lp); | 1767 | int security_task_setscheduler(struct task_struct *p); |
| 1757 | int security_task_getscheduler(struct task_struct *p); | 1768 | int security_task_getscheduler(struct task_struct *p); |
| 1758 | int security_task_movememory(struct task_struct *p); | 1769 | int security_task_movememory(struct task_struct *p); |
| 1759 | int security_task_kill(struct task_struct *p, struct siginfo *info, | 1770 | int security_task_kill(struct task_struct *p, struct siginfo *info, |
| @@ -2313,17 +2324,16 @@ static inline int security_task_getioprio(struct task_struct *p) | |||
| 2313 | return 0; | 2324 | return 0; |
| 2314 | } | 2325 | } |
| 2315 | 2326 | ||
| 2316 | static inline int security_task_setrlimit(unsigned int resource, | 2327 | static inline int security_task_setrlimit(struct task_struct *p, |
| 2328 | unsigned int resource, | ||
| 2317 | struct rlimit *new_rlim) | 2329 | struct rlimit *new_rlim) |
| 2318 | { | 2330 | { |
| 2319 | return 0; | 2331 | return 0; |
| 2320 | } | 2332 | } |
| 2321 | 2333 | ||
| 2322 | static inline int security_task_setscheduler(struct task_struct *p, | 2334 | static inline int security_task_setscheduler(struct task_struct *p) |
| 2323 | int policy, | ||
| 2324 | struct sched_param *lp) | ||
| 2325 | { | 2335 | { |
| 2326 | return cap_task_setscheduler(p, policy, lp); | 2336 | return cap_task_setscheduler(p); |
| 2327 | } | 2337 | } |
| 2328 | 2338 | ||
| 2329 | static inline int security_task_getscheduler(struct task_struct *p) | 2339 | static inline int security_task_getscheduler(struct task_struct *p) |
| @@ -2550,6 +2560,9 @@ void security_inet_csk_clone(struct sock *newsk, | |||
| 2550 | const struct request_sock *req); | 2560 | const struct request_sock *req); |
| 2551 | void security_inet_conn_established(struct sock *sk, | 2561 | void security_inet_conn_established(struct sock *sk, |
| 2552 | struct sk_buff *skb); | 2562 | struct sk_buff *skb); |
| 2563 | int security_secmark_relabel_packet(u32 secid); | ||
| 2564 | void security_secmark_refcount_inc(void); | ||
| 2565 | void security_secmark_refcount_dec(void); | ||
| 2553 | int security_tun_dev_create(void); | 2566 | int security_tun_dev_create(void); |
| 2554 | void security_tun_dev_post_create(struct sock *sk); | 2567 | void security_tun_dev_post_create(struct sock *sk); |
| 2555 | int security_tun_dev_attach(struct sock *sk); | 2568 | int security_tun_dev_attach(struct sock *sk); |
| @@ -2704,6 +2717,19 @@ static inline void security_inet_conn_established(struct sock *sk, | |||
| 2704 | { | 2717 | { |
| 2705 | } | 2718 | } |
| 2706 | 2719 | ||
| 2720 | static inline int security_secmark_relabel_packet(u32 secid) | ||
| 2721 | { | ||
| 2722 | return 0; | ||
| 2723 | } | ||
| 2724 | |||
| 2725 | static inline void security_secmark_refcount_inc(void) | ||
| 2726 | { | ||
| 2727 | } | ||
| 2728 | |||
| 2729 | static inline void security_secmark_refcount_dec(void) | ||
| 2730 | { | ||
| 2731 | } | ||
| 2732 | |||
| 2707 | static inline int security_tun_dev_create(void) | 2733 | static inline int security_tun_dev_create(void) |
| 2708 | { | 2734 | { |
| 2709 | return 0; | 2735 | return 0; |
| @@ -2806,8 +2832,7 @@ int security_path_mkdir(struct path *dir, struct dentry *dentry, int mode); | |||
| 2806 | int security_path_rmdir(struct path *dir, struct dentry *dentry); | 2832 | int security_path_rmdir(struct path *dir, struct dentry *dentry); |
| 2807 | int security_path_mknod(struct path *dir, struct dentry *dentry, int mode, | 2833 | int security_path_mknod(struct path *dir, struct dentry *dentry, int mode, |
| 2808 | unsigned int dev); | 2834 | unsigned int dev); |
| 2809 | int security_path_truncate(struct path *path, loff_t length, | 2835 | int security_path_truncate(struct path *path); |
| 2810 | unsigned int time_attrs); | ||
| 2811 | int security_path_symlink(struct path *dir, struct dentry *dentry, | 2836 | int security_path_symlink(struct path *dir, struct dentry *dentry, |
| 2812 | const char *old_name); | 2837 | const char *old_name); |
| 2813 | int security_path_link(struct dentry *old_dentry, struct path *new_dir, | 2838 | int security_path_link(struct dentry *old_dentry, struct path *new_dir, |
| @@ -2841,8 +2866,7 @@ static inline int security_path_mknod(struct path *dir, struct dentry *dentry, | |||
| 2841 | return 0; | 2866 | return 0; |
| 2842 | } | 2867 | } |
| 2843 | 2868 | ||
| 2844 | static inline int security_path_truncate(struct path *path, loff_t length, | 2869 | static inline int security_path_truncate(struct path *path) |
| 2845 | unsigned int time_attrs) | ||
| 2846 | { | 2870 | { |
| 2847 | return 0; | 2871 | return 0; |
| 2848 | } | 2872 | } |
diff --git a/include/linux/selection.h b/include/linux/selection.h index 8cdaa1151d2e..85193aa8c1e3 100644 --- a/include/linux/selection.h +++ b/include/linux/selection.h | |||
| @@ -39,5 +39,6 @@ extern void putconsxy(struct vc_data *vc, unsigned char *p); | |||
| 39 | 39 | ||
| 40 | extern u16 vcs_scr_readw(struct vc_data *vc, const u16 *org); | 40 | extern u16 vcs_scr_readw(struct vc_data *vc, const u16 *org); |
| 41 | extern void vcs_scr_writew(struct vc_data *vc, u16 val, u16 *org); | 41 | extern void vcs_scr_writew(struct vc_data *vc, u16 val, u16 *org); |
| 42 | extern void vcs_scr_updated(struct vc_data *vc); | ||
| 42 | 43 | ||
| 43 | #endif | 44 | #endif |
diff --git a/include/linux/selinux.h b/include/linux/selinux.h index 82e0f26a1299..44f459612690 100644 --- a/include/linux/selinux.h +++ b/include/linux/selinux.h | |||
| @@ -21,74 +21,11 @@ struct kern_ipc_perm; | |||
| 21 | #ifdef CONFIG_SECURITY_SELINUX | 21 | #ifdef CONFIG_SECURITY_SELINUX |
| 22 | 22 | ||
| 23 | /** | 23 | /** |
| 24 | * selinux_string_to_sid - map a security context string to a security ID | ||
| 25 | * @str: the security context string to be mapped | ||
| 26 | * @sid: ID value returned via this. | ||
| 27 | * | ||
| 28 | * Returns 0 if successful, with the SID stored in sid. A value | ||
| 29 | * of zero for sid indicates no SID could be determined (but no error | ||
| 30 | * occurred). | ||
| 31 | */ | ||
| 32 | int selinux_string_to_sid(char *str, u32 *sid); | ||
| 33 | |||
| 34 | /** | ||
| 35 | * selinux_secmark_relabel_packet_permission - secmark permission check | ||
| 36 | * @sid: SECMARK ID value to be applied to network packet | ||
| 37 | * | ||
| 38 | * Returns 0 if the current task is allowed to set the SECMARK label of | ||
| 39 | * packets with the supplied security ID. Note that it is implicit that | ||
| 40 | * the packet is always being relabeled from the default unlabeled value, | ||
| 41 | * and that the access control decision is made in the AVC. | ||
| 42 | */ | ||
| 43 | int selinux_secmark_relabel_packet_permission(u32 sid); | ||
| 44 | |||
| 45 | /** | ||
| 46 | * selinux_secmark_refcount_inc - increments the secmark use counter | ||
| 47 | * | ||
| 48 | * SELinux keeps track of the current SECMARK targets in use so it knows | ||
| 49 | * when to apply SECMARK label access checks to network packets. This | ||
| 50 | * function incements this reference count to indicate that a new SECMARK | ||
| 51 | * target has been configured. | ||
| 52 | */ | ||
| 53 | void selinux_secmark_refcount_inc(void); | ||
| 54 | |||
| 55 | /** | ||
| 56 | * selinux_secmark_refcount_dec - decrements the secmark use counter | ||
| 57 | * | ||
| 58 | * SELinux keeps track of the current SECMARK targets in use so it knows | ||
| 59 | * when to apply SECMARK label access checks to network packets. This | ||
| 60 | * function decements this reference count to indicate that one of the | ||
| 61 | * existing SECMARK targets has been removed/flushed. | ||
| 62 | */ | ||
| 63 | void selinux_secmark_refcount_dec(void); | ||
| 64 | |||
| 65 | /** | ||
| 66 | * selinux_is_enabled - is SELinux enabled? | 24 | * selinux_is_enabled - is SELinux enabled? |
| 67 | */ | 25 | */ |
| 68 | bool selinux_is_enabled(void); | 26 | bool selinux_is_enabled(void); |
| 69 | #else | 27 | #else |
| 70 | 28 | ||
| 71 | static inline int selinux_string_to_sid(const char *str, u32 *sid) | ||
| 72 | { | ||
| 73 | *sid = 0; | ||
| 74 | return 0; | ||
| 75 | } | ||
| 76 | |||
| 77 | static inline int selinux_secmark_relabel_packet_permission(u32 sid) | ||
| 78 | { | ||
| 79 | return 0; | ||
| 80 | } | ||
| 81 | |||
| 82 | static inline void selinux_secmark_refcount_inc(void) | ||
| 83 | { | ||
| 84 | return; | ||
| 85 | } | ||
| 86 | |||
| 87 | static inline void selinux_secmark_refcount_dec(void) | ||
| 88 | { | ||
| 89 | return; | ||
| 90 | } | ||
| 91 | |||
| 92 | static inline bool selinux_is_enabled(void) | 29 | static inline bool selinux_is_enabled(void) |
| 93 | { | 30 | { |
| 94 | return false; | 31 | return false; |
diff --git a/include/linux/semaphore.h b/include/linux/semaphore.h index 7415839ac890..5310d27abd2a 100644 --- a/include/linux/semaphore.h +++ b/include/linux/semaphore.h | |||
| @@ -26,6 +26,9 @@ struct semaphore { | |||
| 26 | .wait_list = LIST_HEAD_INIT((name).wait_list), \ | 26 | .wait_list = LIST_HEAD_INIT((name).wait_list), \ |
| 27 | } | 27 | } |
| 28 | 28 | ||
| 29 | #define DEFINE_SEMAPHORE(name) \ | ||
| 30 | struct semaphore name = __SEMAPHORE_INITIALIZER(name, 1) | ||
| 31 | |||
| 29 | #define DECLARE_MUTEX(name) \ | 32 | #define DECLARE_MUTEX(name) \ |
| 30 | struct semaphore name = __SEMAPHORE_INITIALIZER(name, 1) | 33 | struct semaphore name = __SEMAPHORE_INITIALIZER(name, 1) |
| 31 | 34 | ||
diff --git a/include/linux/serial.h b/include/linux/serial.h index c8613c3ff9d3..ef914061511e 100644 --- a/include/linux/serial.h +++ b/include/linux/serial.h | |||
| @@ -151,7 +151,7 @@ struct serial_uart_config { | |||
| 151 | #define ASYNC_BUGGY_UART (1U << ASYNCB_BUGGY_UART) | 151 | #define ASYNC_BUGGY_UART (1U << ASYNCB_BUGGY_UART) |
| 152 | #define ASYNC_AUTOPROBE (1U << ASYNCB_AUTOPROBE) | 152 | #define ASYNC_AUTOPROBE (1U << ASYNCB_AUTOPROBE) |
| 153 | 153 | ||
| 154 | #define ASYNC_FLAGS ((1U << ASYNCB_LAST_USER) - 1) | 154 | #define ASYNC_FLAGS ((1U << (ASYNCB_LAST_USER + 1)) - 1) |
| 155 | #define ASYNC_USR_MASK (ASYNC_SPD_HI|ASYNC_SPD_VHI| \ | 155 | #define ASYNC_USR_MASK (ASYNC_SPD_HI|ASYNC_SPD_VHI| \ |
| 156 | ASYNC_CALLOUT_NOHUP|ASYNC_SPD_SHI|ASYNC_LOW_LATENCY) | 156 | ASYNC_CALLOUT_NOHUP|ASYNC_SPD_SHI|ASYNC_LOW_LATENCY) |
| 157 | #define ASYNC_SPD_CUST (ASYNC_SPD_HI|ASYNC_SPD_VHI) | 157 | #define ASYNC_SPD_CUST (ASYNC_SPD_HI|ASYNC_SPD_VHI) |
| @@ -210,8 +210,10 @@ struct serial_rs485 { | |||
| 210 | #define SER_RS485_ENABLED (1 << 0) | 210 | #define SER_RS485_ENABLED (1 << 0) |
| 211 | #define SER_RS485_RTS_ON_SEND (1 << 1) | 211 | #define SER_RS485_RTS_ON_SEND (1 << 1) |
| 212 | #define SER_RS485_RTS_AFTER_SEND (1 << 2) | 212 | #define SER_RS485_RTS_AFTER_SEND (1 << 2) |
| 213 | #define SER_RS485_RTS_BEFORE_SEND (1 << 3) | ||
| 213 | __u32 delay_rts_before_send; /* Milliseconds */ | 214 | __u32 delay_rts_before_send; /* Milliseconds */ |
| 214 | __u32 padding[6]; /* Memory is cheap, new structs | 215 | __u32 delay_rts_after_send; /* Milliseconds */ |
| 216 | __u32 padding[5]; /* Memory is cheap, new structs | ||
| 215 | are a royal PITA .. */ | 217 | are a royal PITA .. */ |
| 216 | }; | 218 | }; |
| 217 | 219 | ||
diff --git a/include/linux/serial_8250.h b/include/linux/serial_8250.h index fb46aba11fb5..97f5b45bbc07 100644 --- a/include/linux/serial_8250.h +++ b/include/linux/serial_8250.h | |||
| @@ -32,6 +32,11 @@ struct plat_serial8250_port { | |||
| 32 | unsigned int type; /* If UPF_FIXED_TYPE */ | 32 | unsigned int type; /* If UPF_FIXED_TYPE */ |
| 33 | unsigned int (*serial_in)(struct uart_port *, int); | 33 | unsigned int (*serial_in)(struct uart_port *, int); |
| 34 | void (*serial_out)(struct uart_port *, int, int); | 34 | void (*serial_out)(struct uart_port *, int, int); |
| 35 | void (*set_termios)(struct uart_port *, | ||
| 36 | struct ktermios *new, | ||
| 37 | struct ktermios *old); | ||
| 38 | void (*pm)(struct uart_port *, unsigned int state, | ||
| 39 | unsigned old); | ||
| 35 | }; | 40 | }; |
| 36 | 41 | ||
| 37 | /* | 42 | /* |
| @@ -71,5 +76,13 @@ extern int early_serial_setup(struct uart_port *port); | |||
| 71 | extern int serial8250_find_port(struct uart_port *p); | 76 | extern int serial8250_find_port(struct uart_port *p); |
| 72 | extern int serial8250_find_port_for_earlycon(void); | 77 | extern int serial8250_find_port_for_earlycon(void); |
| 73 | extern int setup_early_serial8250_console(char *cmdline); | 78 | extern int setup_early_serial8250_console(char *cmdline); |
| 79 | extern void serial8250_do_set_termios(struct uart_port *port, | ||
| 80 | struct ktermios *termios, struct ktermios *old); | ||
| 81 | extern void serial8250_do_pm(struct uart_port *port, unsigned int state, | ||
| 82 | unsigned int oldstate); | ||
| 83 | |||
| 84 | extern void serial8250_set_isa_configurator(void (*v) | ||
| 85 | (int port, struct uart_port *up, | ||
| 86 | unsigned short *capabilities)); | ||
| 74 | 87 | ||
| 75 | #endif | 88 | #endif |
diff --git a/include/linux/serial_core.h b/include/linux/serial_core.h index f10db6e5f3b5..212eb4c67797 100644 --- a/include/linux/serial_core.h +++ b/include/linux/serial_core.h | |||
| @@ -44,7 +44,8 @@ | |||
| 44 | #define PORT_RM9000 16 /* PMC-Sierra RM9xxx internal UART */ | 44 | #define PORT_RM9000 16 /* PMC-Sierra RM9xxx internal UART */ |
| 45 | #define PORT_OCTEON 17 /* Cavium OCTEON internal UART */ | 45 | #define PORT_OCTEON 17 /* Cavium OCTEON internal UART */ |
| 46 | #define PORT_AR7 18 /* Texas Instruments AR7 internal UART */ | 46 | #define PORT_AR7 18 /* Texas Instruments AR7 internal UART */ |
| 47 | #define PORT_MAX_8250 18 /* max port ID */ | 47 | #define PORT_U6_16550A 19 /* ST-Ericsson U6xxx internal UART */ |
| 48 | #define PORT_MAX_8250 19 /* max port ID */ | ||
| 48 | 49 | ||
| 49 | /* | 50 | /* |
| 50 | * ARM specific type numbers. These are not currently guaranteed | 51 | * ARM specific type numbers. These are not currently guaranteed |
| @@ -186,6 +187,18 @@ | |||
| 186 | #define PORT_ALTERA_JTAGUART 91 | 187 | #define PORT_ALTERA_JTAGUART 91 |
| 187 | #define PORT_ALTERA_UART 92 | 188 | #define PORT_ALTERA_UART 92 |
| 188 | 189 | ||
| 190 | /* SH-SCI */ | ||
| 191 | #define PORT_SCIFB 93 | ||
| 192 | |||
| 193 | /* MAX3107 */ | ||
| 194 | #define PORT_MAX3107 94 | ||
| 195 | |||
| 196 | /* High Speed UART for Medfield */ | ||
| 197 | #define PORT_MFD 95 | ||
| 198 | |||
| 199 | /* TI OMAP-UART */ | ||
| 200 | #define PORT_OMAP 96 | ||
| 201 | |||
| 189 | #ifdef __KERNEL__ | 202 | #ifdef __KERNEL__ |
| 190 | 203 | ||
| 191 | #include <linux/compiler.h> | 204 | #include <linux/compiler.h> |
| @@ -220,7 +233,7 @@ struct uart_ops { | |||
| 220 | void (*flush_buffer)(struct uart_port *); | 233 | void (*flush_buffer)(struct uart_port *); |
| 221 | void (*set_termios)(struct uart_port *, struct ktermios *new, | 234 | void (*set_termios)(struct uart_port *, struct ktermios *new, |
| 222 | struct ktermios *old); | 235 | struct ktermios *old); |
| 223 | void (*set_ldisc)(struct uart_port *); | 236 | void (*set_ldisc)(struct uart_port *, int new); |
| 224 | void (*pm)(struct uart_port *, unsigned int state, | 237 | void (*pm)(struct uart_port *, unsigned int state, |
| 225 | unsigned int oldstate); | 238 | unsigned int oldstate); |
| 226 | int (*set_wake)(struct uart_port *, unsigned int state); | 239 | int (*set_wake)(struct uart_port *, unsigned int state); |
| @@ -276,6 +289,11 @@ struct uart_port { | |||
| 276 | unsigned char __iomem *membase; /* read/write[bwl] */ | 289 | unsigned char __iomem *membase; /* read/write[bwl] */ |
| 277 | unsigned int (*serial_in)(struct uart_port *, int); | 290 | unsigned int (*serial_in)(struct uart_port *, int); |
| 278 | void (*serial_out)(struct uart_port *, int, int); | 291 | void (*serial_out)(struct uart_port *, int, int); |
| 292 | void (*set_termios)(struct uart_port *, | ||
| 293 | struct ktermios *new, | ||
| 294 | struct ktermios *old); | ||
| 295 | void (*pm)(struct uart_port *, unsigned int state, | ||
| 296 | unsigned int old); | ||
| 279 | unsigned int irq; /* irq number */ | 297 | unsigned int irq; /* irq number */ |
| 280 | unsigned long irqflags; /* irq flags */ | 298 | unsigned long irqflags; /* irq flags */ |
| 281 | unsigned int uartclk; /* base uart clock */ | 299 | unsigned int uartclk; /* base uart clock */ |
| @@ -398,6 +416,14 @@ unsigned int uart_get_baud_rate(struct uart_port *port, struct ktermios *termios | |||
| 398 | unsigned int max); | 416 | unsigned int max); |
| 399 | unsigned int uart_get_divisor(struct uart_port *port, unsigned int baud); | 417 | unsigned int uart_get_divisor(struct uart_port *port, unsigned int baud); |
| 400 | 418 | ||
| 419 | /* Base timer interval for polling */ | ||
| 420 | static inline int uart_poll_timeout(struct uart_port *port) | ||
| 421 | { | ||
| 422 | int timeout = port->timeout; | ||
| 423 | |||
| 424 | return timeout > 6 ? (timeout / 2 - 2) : 1; | ||
| 425 | } | ||
| 426 | |||
| 401 | /* | 427 | /* |
| 402 | * Console helpers. | 428 | * Console helpers. |
| 403 | */ | 429 | */ |
| @@ -453,7 +479,7 @@ uart_handle_sysrq_char(struct uart_port *port, unsigned int ch) | |||
| 453 | #ifdef SUPPORT_SYSRQ | 479 | #ifdef SUPPORT_SYSRQ |
| 454 | if (port->sysrq) { | 480 | if (port->sysrq) { |
| 455 | if (ch && time_before(jiffies, port->sysrq)) { | 481 | if (ch && time_before(jiffies, port->sysrq)) { |
| 456 | handle_sysrq(ch, port->state->port.tty); | 482 | handle_sysrq(ch); |
| 457 | port->sysrq = 0; | 483 | port->sysrq = 0; |
| 458 | return 1; | 484 | return 1; |
| 459 | } | 485 | } |
diff --git a/include/linux/serial_mfd.h b/include/linux/serial_mfd.h new file mode 100644 index 000000000000..2b071e0b034d --- /dev/null +++ b/include/linux/serial_mfd.h | |||
| @@ -0,0 +1,47 @@ | |||
| 1 | #ifndef _SERIAL_MFD_H_ | ||
| 2 | #define _SERIAL_MFD_H_ | ||
| 3 | |||
| 4 | /* HW register offset definition */ | ||
| 5 | #define UART_FOR 0x08 | ||
| 6 | #define UART_PS 0x0C | ||
| 7 | #define UART_MUL 0x0D | ||
| 8 | #define UART_DIV 0x0E | ||
| 9 | |||
| 10 | #define HSU_GBL_IEN 0x0 | ||
| 11 | #define HSU_GBL_IST 0x4 | ||
| 12 | |||
| 13 | #define HSU_GBL_INT_BIT_PORT0 0x0 | ||
| 14 | #define HSU_GBL_INT_BIT_PORT1 0x1 | ||
| 15 | #define HSU_GBL_INT_BIT_PORT2 0x2 | ||
| 16 | #define HSU_GBL_INT_BIT_IRI 0x3 | ||
| 17 | #define HSU_GBL_INT_BIT_HDLC 0x4 | ||
| 18 | #define HSU_GBL_INT_BIT_DMA 0x5 | ||
| 19 | |||
| 20 | #define HSU_GBL_ISR 0x8 | ||
| 21 | #define HSU_GBL_DMASR 0x400 | ||
| 22 | #define HSU_GBL_DMAISR 0x404 | ||
| 23 | |||
| 24 | #define HSU_PORT_REG_OFFSET 0x80 | ||
| 25 | #define HSU_PORT0_REG_OFFSET 0x80 | ||
| 26 | #define HSU_PORT1_REG_OFFSET 0x100 | ||
| 27 | #define HSU_PORT2_REG_OFFSET 0x180 | ||
| 28 | #define HSU_PORT_REG_LENGTH 0x80 | ||
| 29 | |||
| 30 | #define HSU_DMA_CHANS_REG_OFFSET 0x500 | ||
| 31 | #define HSU_DMA_CHANS_REG_LENGTH 0x40 | ||
| 32 | |||
| 33 | #define HSU_CH_SR 0x0 /* channel status reg */ | ||
| 34 | #define HSU_CH_CR 0x4 /* control reg */ | ||
| 35 | #define HSU_CH_DCR 0x8 /* descriptor control reg */ | ||
| 36 | #define HSU_CH_BSR 0x10 /* max fifo buffer size reg */ | ||
| 37 | #define HSU_CH_MOTSR 0x14 /* minimum ocp transfer size */ | ||
| 38 | #define HSU_CH_D0SAR 0x20 /* desc 0 start addr */ | ||
| 39 | #define HSU_CH_D0TSR 0x24 /* desc 0 transfer size */ | ||
| 40 | #define HSU_CH_D1SAR 0x28 | ||
| 41 | #define HSU_CH_D1TSR 0x2C | ||
| 42 | #define HSU_CH_D2SAR 0x30 | ||
| 43 | #define HSU_CH_D2TSR 0x34 | ||
| 44 | #define HSU_CH_D3SAR 0x38 | ||
| 45 | #define HSU_CH_D3TSR 0x3C | ||
| 46 | |||
| 47 | #endif | ||
diff --git a/include/linux/serial_reg.h b/include/linux/serial_reg.h index cf9327c051ad..c7a0ce11cd47 100644 --- a/include/linux/serial_reg.h +++ b/include/linux/serial_reg.h | |||
| @@ -221,8 +221,24 @@ | |||
| 221 | #define UART_FCR_PXAR16 0x80 /* receive FIFO threshold = 16 */ | 221 | #define UART_FCR_PXAR16 0x80 /* receive FIFO threshold = 16 */ |
| 222 | #define UART_FCR_PXAR32 0xc0 /* receive FIFO threshold = 32 */ | 222 | #define UART_FCR_PXAR32 0xc0 /* receive FIFO threshold = 32 */ |
| 223 | 223 | ||
| 224 | /* | ||
| 225 | * Intel MID on-chip HSU (High Speed UART) defined bits | ||
| 226 | */ | ||
| 227 | #define UART_FCR_HSU_64_1B 0x00 /* receive FIFO treshold = 1 */ | ||
| 228 | #define UART_FCR_HSU_64_16B 0x40 /* receive FIFO treshold = 16 */ | ||
| 229 | #define UART_FCR_HSU_64_32B 0x80 /* receive FIFO treshold = 32 */ | ||
| 230 | #define UART_FCR_HSU_64_56B 0xc0 /* receive FIFO treshold = 56 */ | ||
| 231 | |||
| 232 | #define UART_FCR_HSU_16_1B 0x00 /* receive FIFO treshold = 1 */ | ||
| 233 | #define UART_FCR_HSU_16_4B 0x40 /* receive FIFO treshold = 4 */ | ||
| 234 | #define UART_FCR_HSU_16_8B 0x80 /* receive FIFO treshold = 8 */ | ||
| 235 | #define UART_FCR_HSU_16_14B 0xc0 /* receive FIFO treshold = 14 */ | ||
| 224 | 236 | ||
| 237 | #define UART_FCR_HSU_64B_FIFO 0x20 /* chose 64 bytes FIFO */ | ||
| 238 | #define UART_FCR_HSU_16B_FIFO 0x00 /* chose 16 bytes FIFO */ | ||
| 225 | 239 | ||
| 240 | #define UART_FCR_HALF_EMPT_TXI 0x00 /* trigger TX_EMPT IRQ for half empty */ | ||
| 241 | #define UART_FCR_FULL_EMPT_TXI 0x08 /* trigger TX_EMPT IRQ for full empty */ | ||
| 226 | 242 | ||
| 227 | /* | 243 | /* |
| 228 | * These register definitions are for the 16C950 | 244 | * These register definitions are for the 16C950 |
diff --git a/include/linux/serio.h b/include/linux/serio.h index b5552568178d..e26f4788845f 100644 --- a/include/linux/serio.h +++ b/include/linux/serio.h | |||
| @@ -41,7 +41,9 @@ struct serio { | |||
| 41 | int (*start)(struct serio *); | 41 | int (*start)(struct serio *); |
| 42 | void (*stop)(struct serio *); | 42 | void (*stop)(struct serio *); |
| 43 | 43 | ||
| 44 | struct serio *parent, *child; | 44 | struct serio *parent; |
| 45 | struct list_head child_node; /* Entry in parent->children list */ | ||
| 46 | struct list_head children; | ||
| 45 | unsigned int depth; /* level of nesting in serio hierarchy */ | 47 | unsigned int depth; /* level of nesting in serio hierarchy */ |
| 46 | 48 | ||
| 47 | struct serio_driver *drv; /* accessed from interrupt, must be protected by serio->lock and serio->sem */ | 49 | struct serio_driver *drv; /* accessed from interrupt, must be protected by serio->lock and serio->sem */ |
| @@ -54,10 +56,9 @@ struct serio { | |||
| 54 | #define to_serio_port(d) container_of(d, struct serio, dev) | 56 | #define to_serio_port(d) container_of(d, struct serio, dev) |
| 55 | 57 | ||
| 56 | struct serio_driver { | 58 | struct serio_driver { |
| 57 | void *private; | 59 | const char *description; |
| 58 | char *description; | ||
| 59 | 60 | ||
| 60 | struct serio_device_id *id_table; | 61 | const struct serio_device_id *id_table; |
| 61 | bool manual_bind; | 62 | bool manual_bind; |
| 62 | 63 | ||
| 63 | void (*write_wakeup)(struct serio *); | 64 | void (*write_wakeup)(struct serio *); |
| @@ -197,5 +198,6 @@ static inline void serio_continue_rx(struct serio *serio) | |||
| 197 | #define SERIO_W8001 0x39 | 198 | #define SERIO_W8001 0x39 |
| 198 | #define SERIO_DYNAPRO 0x3a | 199 | #define SERIO_DYNAPRO 0x3a |
| 199 | #define SERIO_HAMPSHIRE 0x3b | 200 | #define SERIO_HAMPSHIRE 0x3b |
| 201 | #define SERIO_PS2MULT 0x3c | ||
| 200 | 202 | ||
| 201 | #endif | 203 | #endif |
diff --git a/include/linux/sfi.h b/include/linux/sfi.h index 0299b4ce63db..7f770c638e99 100644 --- a/include/linux/sfi.h +++ b/include/linux/sfi.h | |||
| @@ -70,9 +70,6 @@ | |||
| 70 | #define SFI_SIG_APIC "APIC" | 70 | #define SFI_SIG_APIC "APIC" |
| 71 | #define SFI_SIG_XSDT "XSDT" | 71 | #define SFI_SIG_XSDT "XSDT" |
| 72 | #define SFI_SIG_WAKE "WAKE" | 72 | #define SFI_SIG_WAKE "WAKE" |
| 73 | #define SFI_SIG_SPIB "SPIB" | ||
| 74 | #define SFI_SIG_I2CB "I2CB" | ||
| 75 | #define SFI_SIG_GPEM "GPEM" | ||
| 76 | #define SFI_SIG_DEVS "DEVS" | 73 | #define SFI_SIG_DEVS "DEVS" |
| 77 | #define SFI_SIG_GPIO "GPIO" | 74 | #define SFI_SIG_GPIO "GPIO" |
| 78 | 75 | ||
| @@ -168,27 +165,6 @@ struct sfi_gpio_table_entry { | |||
| 168 | char pin_name[16]; | 165 | char pin_name[16]; |
| 169 | } __packed; | 166 | } __packed; |
| 170 | 167 | ||
| 171 | struct sfi_spi_table_entry { | ||
| 172 | u16 host_num; /* attached to host 0, 1...*/ | ||
| 173 | u16 cs; /* chip select */ | ||
| 174 | u16 irq_info; | ||
| 175 | char name[16]; | ||
| 176 | u8 dev_info[10]; | ||
| 177 | } __packed; | ||
| 178 | |||
| 179 | struct sfi_i2c_table_entry { | ||
| 180 | u16 host_num; | ||
| 181 | u16 addr; /* slave addr */ | ||
| 182 | u16 irq_info; | ||
| 183 | char name[16]; | ||
| 184 | u8 dev_info[10]; | ||
| 185 | } __packed; | ||
| 186 | |||
| 187 | struct sfi_gpe_table_entry { | ||
| 188 | u16 logical_id; /* logical id */ | ||
| 189 | u16 phys_id; /* physical GPE id */ | ||
| 190 | } __packed; | ||
| 191 | |||
| 192 | typedef int (*sfi_table_handler) (struct sfi_table_header *table); | 168 | typedef int (*sfi_table_handler) (struct sfi_table_header *table); |
| 193 | 169 | ||
| 194 | #ifdef CONFIG_SFI | 170 | #ifdef CONFIG_SFI |
diff --git a/include/linux/sh_clk.h b/include/linux/sh_clk.h index 1636d1e2a5f1..4dca992f3093 100644 --- a/include/linux/sh_clk.h +++ b/include/linux/sh_clk.h | |||
| @@ -4,11 +4,20 @@ | |||
| 4 | #include <linux/list.h> | 4 | #include <linux/list.h> |
| 5 | #include <linux/seq_file.h> | 5 | #include <linux/seq_file.h> |
| 6 | #include <linux/cpufreq.h> | 6 | #include <linux/cpufreq.h> |
| 7 | #include <linux/types.h> | ||
| 8 | #include <linux/kref.h> | ||
| 7 | #include <linux/clk.h> | 9 | #include <linux/clk.h> |
| 8 | #include <linux/err.h> | 10 | #include <linux/err.h> |
| 9 | 11 | ||
| 10 | struct clk; | 12 | struct clk; |
| 11 | 13 | ||
| 14 | struct clk_mapping { | ||
| 15 | phys_addr_t phys; | ||
| 16 | void __iomem *base; | ||
| 17 | unsigned long len; | ||
| 18 | struct kref ref; | ||
| 19 | }; | ||
| 20 | |||
| 12 | struct clk_ops { | 21 | struct clk_ops { |
| 13 | void (*init)(struct clk *clk); | 22 | void (*init)(struct clk *clk); |
| 14 | int (*enable)(struct clk *clk); | 23 | int (*enable)(struct clk *clk); |
| @@ -21,10 +30,11 @@ struct clk_ops { | |||
| 21 | 30 | ||
| 22 | struct clk { | 31 | struct clk { |
| 23 | struct list_head node; | 32 | struct list_head node; |
| 24 | const char *name; | ||
| 25 | int id; | ||
| 26 | |||
| 27 | struct clk *parent; | 33 | struct clk *parent; |
| 34 | struct clk **parent_table; /* list of parents to */ | ||
| 35 | unsigned short parent_num; /* choose between */ | ||
| 36 | unsigned char src_shift; /* source clock field in the */ | ||
| 37 | unsigned char src_width; /* configuration register */ | ||
| 28 | struct clk_ops *ops; | 38 | struct clk_ops *ops; |
| 29 | 39 | ||
| 30 | struct list_head children; | 40 | struct list_head children; |
| @@ -41,7 +51,9 @@ struct clk { | |||
| 41 | unsigned long arch_flags; | 51 | unsigned long arch_flags; |
| 42 | void *priv; | 52 | void *priv; |
| 43 | struct dentry *dentry; | 53 | struct dentry *dentry; |
| 54 | struct clk_mapping *mapping; | ||
| 44 | struct cpufreq_frequency_table *freq_table; | 55 | struct cpufreq_frequency_table *freq_table; |
| 56 | unsigned int nr_freqs; | ||
| 45 | }; | 57 | }; |
| 46 | 58 | ||
| 47 | #define CLK_ENABLE_ON_INIT (1 << 0) | 59 | #define CLK_ENABLE_ON_INIT (1 << 0) |
| @@ -107,6 +119,9 @@ int clk_rate_table_find(struct clk *clk, | |||
| 107 | struct cpufreq_frequency_table *freq_table, | 119 | struct cpufreq_frequency_table *freq_table, |
| 108 | unsigned long rate); | 120 | unsigned long rate); |
| 109 | 121 | ||
| 122 | long clk_rate_div_range_round(struct clk *clk, unsigned int div_min, | ||
| 123 | unsigned int div_max, unsigned long rate); | ||
| 124 | |||
| 110 | #define SH_CLK_MSTP32(_parent, _enable_reg, _enable_bit, _flags) \ | 125 | #define SH_CLK_MSTP32(_parent, _enable_reg, _enable_bit, _flags) \ |
| 111 | { \ | 126 | { \ |
| 112 | .parent = _parent, \ | 127 | .parent = _parent, \ |
| @@ -138,13 +153,22 @@ int sh_clk_div4_enable_register(struct clk *clks, int nr, | |||
| 138 | int sh_clk_div4_reparent_register(struct clk *clks, int nr, | 153 | int sh_clk_div4_reparent_register(struct clk *clks, int nr, |
| 139 | struct clk_div4_table *table); | 154 | struct clk_div4_table *table); |
| 140 | 155 | ||
| 141 | #define SH_CLK_DIV6(_parent, _reg, _flags) \ | 156 | #define SH_CLK_DIV6_EXT(_parent, _reg, _flags, _parents, \ |
| 142 | { \ | 157 | _num_parents, _src_shift, _src_width) \ |
| 143 | .parent = _parent, \ | 158 | { \ |
| 144 | .enable_reg = (void __iomem *)_reg, \ | 159 | .parent = _parent, \ |
| 145 | .flags = _flags, \ | 160 | .enable_reg = (void __iomem *)_reg, \ |
| 161 | .flags = _flags, \ | ||
| 162 | .parent_table = _parents, \ | ||
| 163 | .parent_num = _num_parents, \ | ||
| 164 | .src_shift = _src_shift, \ | ||
| 165 | .src_width = _src_width, \ | ||
| 146 | } | 166 | } |
| 147 | 167 | ||
| 168 | #define SH_CLK_DIV6(_parent, _reg, _flags) \ | ||
| 169 | SH_CLK_DIV6_EXT(_parent, _reg, _flags, NULL, 0, 0, 0) | ||
| 170 | |||
| 148 | int sh_clk_div6_register(struct clk *clks, int nr); | 171 | int sh_clk_div6_register(struct clk *clks, int nr); |
| 172 | int sh_clk_div6_reparent_register(struct clk *clks, int nr); | ||
| 149 | 173 | ||
| 150 | #endif /* __SH_CLOCK_H */ | 174 | #endif /* __SH_CLOCK_H */ |
diff --git a/include/linux/sh_intc.h b/include/linux/sh_intc.h index 0d6cd38e673d..f656d1a43dc0 100644 --- a/include/linux/sh_intc.h +++ b/include/linux/sh_intc.h | |||
| @@ -20,6 +20,12 @@ struct intc_group { | |||
| 20 | 20 | ||
| 21 | #define INTC_GROUP(enum_id, ids...) { enum_id, { ids } } | 21 | #define INTC_GROUP(enum_id, ids...) { enum_id, { ids } } |
| 22 | 22 | ||
| 23 | struct intc_subgroup { | ||
| 24 | unsigned long reg, reg_width; | ||
| 25 | intc_enum parent_id; | ||
| 26 | intc_enum enum_ids[32]; | ||
| 27 | }; | ||
| 28 | |||
| 23 | struct intc_mask_reg { | 29 | struct intc_mask_reg { |
| 24 | unsigned long set_reg, clr_reg, reg_width; | 30 | unsigned long set_reg, clr_reg, reg_width; |
| 25 | intc_enum enum_ids[32]; | 31 | intc_enum enum_ids[32]; |
| @@ -69,9 +75,12 @@ struct intc_hw_desc { | |||
| 69 | unsigned int nr_sense_regs; | 75 | unsigned int nr_sense_regs; |
| 70 | struct intc_mask_reg *ack_regs; | 76 | struct intc_mask_reg *ack_regs; |
| 71 | unsigned int nr_ack_regs; | 77 | unsigned int nr_ack_regs; |
| 78 | struct intc_subgroup *subgroups; | ||
| 79 | unsigned int nr_subgroups; | ||
| 72 | }; | 80 | }; |
| 73 | 81 | ||
| 74 | #define _INTC_ARRAY(a) a, sizeof(a)/sizeof(*a) | 82 | #define _INTC_ARRAY(a) a, a == NULL ? 0 : sizeof(a)/sizeof(*a) |
| 83 | |||
| 75 | #define INTC_HW_DESC(vectors, groups, mask_regs, \ | 84 | #define INTC_HW_DESC(vectors, groups, mask_regs, \ |
| 76 | prio_regs, sense_regs, ack_regs) \ | 85 | prio_regs, sense_regs, ack_regs) \ |
| 77 | { \ | 86 | { \ |
| @@ -105,8 +114,11 @@ struct intc_desc symbol __initdata = { \ | |||
| 105 | prio_regs, sense_regs, ack_regs), \ | 114 | prio_regs, sense_regs, ack_regs), \ |
| 106 | } | 115 | } |
| 107 | 116 | ||
| 108 | int __init register_intc_controller(struct intc_desc *desc); | 117 | int register_intc_controller(struct intc_desc *desc); |
| 118 | void reserve_intc_vectors(struct intc_vect *vectors, unsigned int nr_vecs); | ||
| 109 | int intc_set_priority(unsigned int irq, unsigned int prio); | 119 | int intc_set_priority(unsigned int irq, unsigned int prio); |
| 120 | int intc_irq_lookup(const char *chipname, intc_enum enum_id); | ||
| 121 | void intc_finalize(void); | ||
| 110 | 122 | ||
| 111 | #ifdef CONFIG_INTC_USERIMASK | 123 | #ifdef CONFIG_INTC_USERIMASK |
| 112 | int register_intc_userimask(unsigned long addr); | 124 | int register_intc_userimask(unsigned long addr); |
| @@ -117,7 +129,4 @@ static inline int register_intc_userimask(unsigned long addr) | |||
| 117 | } | 129 | } |
| 118 | #endif | 130 | #endif |
| 119 | 131 | ||
| 120 | int reserve_irq_vector(unsigned int irq); | ||
| 121 | void reserve_irq_legacy(void); | ||
| 122 | |||
| 123 | #endif /* __SH_INTC_H */ | 132 | #endif /* __SH_INTC_H */ |
diff --git a/include/linux/sh_pfc.h b/include/linux/sh_pfc.h index 07c08af9f8f6..30cae70874f4 100644 --- a/include/linux/sh_pfc.h +++ b/include/linux/sh_pfc.h | |||
| @@ -92,5 +92,6 @@ struct pinmux_info { | |||
| 92 | }; | 92 | }; |
| 93 | 93 | ||
| 94 | int register_pinmux(struct pinmux_info *pip); | 94 | int register_pinmux(struct pinmux_info *pip); |
| 95 | int unregister_pinmux(struct pinmux_info *pip); | ||
| 95 | 96 | ||
| 96 | #endif /* __SH_PFC_H */ | 97 | #endif /* __SH_PFC_H */ |
diff --git a/include/linux/shmem_fs.h b/include/linux/shmem_fs.h index e164291fb3e7..399be5ad2f99 100644 --- a/include/linux/shmem_fs.h +++ b/include/linux/shmem_fs.h | |||
| @@ -3,6 +3,7 @@ | |||
| 3 | 3 | ||
| 4 | #include <linux/swap.h> | 4 | #include <linux/swap.h> |
| 5 | #include <linux/mempolicy.h> | 5 | #include <linux/mempolicy.h> |
| 6 | #include <linux/percpu_counter.h> | ||
| 6 | 7 | ||
| 7 | /* inode in-kernel data */ | 8 | /* inode in-kernel data */ |
| 8 | 9 | ||
| @@ -23,7 +24,7 @@ struct shmem_inode_info { | |||
| 23 | 24 | ||
| 24 | struct shmem_sb_info { | 25 | struct shmem_sb_info { |
| 25 | unsigned long max_blocks; /* How many blocks are allowed */ | 26 | unsigned long max_blocks; /* How many blocks are allowed */ |
| 26 | unsigned long free_blocks; /* How many are left for allocation */ | 27 | struct percpu_counter used_blocks; /* How many are allocated */ |
| 27 | unsigned long max_inodes; /* How many inodes are allowed */ | 28 | unsigned long max_inodes; /* How many inodes are allowed */ |
| 28 | unsigned long free_inodes; /* How many are left for allocation */ | 29 | unsigned long free_inodes; /* How many are left for allocation */ |
| 29 | spinlock_t stat_lock; /* Serialize shmem_sb_info changes */ | 30 | spinlock_t stat_lock; /* Serialize shmem_sb_info changes */ |
diff --git a/include/linux/signalfd.h b/include/linux/signalfd.h index b363b916c909..3ff4961da9b5 100644 --- a/include/linux/signalfd.h +++ b/include/linux/signalfd.h | |||
| @@ -33,6 +33,7 @@ struct signalfd_siginfo { | |||
| 33 | __u64 ssi_utime; | 33 | __u64 ssi_utime; |
| 34 | __u64 ssi_stime; | 34 | __u64 ssi_stime; |
| 35 | __u64 ssi_addr; | 35 | __u64 ssi_addr; |
| 36 | __u16 ssi_addr_lsb; | ||
| 36 | 37 | ||
| 37 | /* | 38 | /* |
| 38 | * Pad strcture to 128 bytes. Remember to update the | 39 | * Pad strcture to 128 bytes. Remember to update the |
| @@ -43,7 +44,7 @@ struct signalfd_siginfo { | |||
| 43 | * comes out of a read(2) and we really don't want to have | 44 | * comes out of a read(2) and we really don't want to have |
| 44 | * a compat on read(2). | 45 | * a compat on read(2). |
| 45 | */ | 46 | */ |
| 46 | __u8 __pad[48]; | 47 | __u8 __pad[46]; |
| 47 | }; | 48 | }; |
| 48 | 49 | ||
| 49 | 50 | ||
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index f89e7fd59a4c..e6ba898de61c 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h | |||
| @@ -129,8 +129,13 @@ typedef struct skb_frag_struct skb_frag_t; | |||
| 129 | 129 | ||
| 130 | struct skb_frag_struct { | 130 | struct skb_frag_struct { |
| 131 | struct page *page; | 131 | struct page *page; |
| 132 | #if (BITS_PER_LONG > 32) || (PAGE_SIZE >= 65536) | ||
| 132 | __u32 page_offset; | 133 | __u32 page_offset; |
| 133 | __u32 size; | 134 | __u32 size; |
| 135 | #else | ||
| 136 | __u16 page_offset; | ||
| 137 | __u16 size; | ||
| 138 | #endif | ||
| 134 | }; | 139 | }; |
| 135 | 140 | ||
| 136 | #define HAVE_HW_TIME_STAMP | 141 | #define HAVE_HW_TIME_STAMP |
| @@ -163,24 +168,19 @@ struct skb_shared_hwtstamps { | |||
| 163 | ktime_t syststamp; | 168 | ktime_t syststamp; |
| 164 | }; | 169 | }; |
| 165 | 170 | ||
| 166 | /** | 171 | /* Definitions for tx_flags in struct skb_shared_info */ |
| 167 | * struct skb_shared_tx - instructions for time stamping of outgoing packets | 172 | enum { |
| 168 | * @hardware: generate hardware time stamp | 173 | /* generate hardware time stamp */ |
| 169 | * @software: generate software time stamp | 174 | SKBTX_HW_TSTAMP = 1 << 0, |
| 170 | * @in_progress: device driver is going to provide | 175 | |
| 171 | * hardware time stamp | 176 | /* generate software time stamp */ |
| 172 | * @flags: all shared_tx flags | 177 | SKBTX_SW_TSTAMP = 1 << 1, |
| 173 | * | 178 | |
| 174 | * These flags are attached to packets as part of the | 179 | /* device driver is going to provide hardware time stamp */ |
| 175 | * &skb_shared_info. Use skb_tx() to get a pointer. | 180 | SKBTX_IN_PROGRESS = 1 << 2, |
| 176 | */ | 181 | |
| 177 | union skb_shared_tx { | 182 | /* ensure the originating sk reference is available on driver level */ |
| 178 | struct { | 183 | SKBTX_DRV_NEEDS_SK_REF = 1 << 3, |
| 179 | __u8 hardware:1, | ||
| 180 | software:1, | ||
| 181 | in_progress:1; | ||
| 182 | }; | ||
| 183 | __u8 flags; | ||
| 184 | }; | 184 | }; |
| 185 | 185 | ||
| 186 | /* This data is invariant across clones and lives at | 186 | /* This data is invariant across clones and lives at |
| @@ -193,7 +193,7 @@ struct skb_shared_info { | |||
| 193 | unsigned short gso_segs; | 193 | unsigned short gso_segs; |
| 194 | unsigned short gso_type; | 194 | unsigned short gso_type; |
| 195 | __be32 ip6_frag_id; | 195 | __be32 ip6_frag_id; |
| 196 | union skb_shared_tx tx_flags; | 196 | __u8 tx_flags; |
| 197 | struct sk_buff *frag_list; | 197 | struct sk_buff *frag_list; |
| 198 | struct skb_shared_hwtstamps hwtstamps; | 198 | struct skb_shared_hwtstamps hwtstamps; |
| 199 | 199 | ||
| @@ -202,10 +202,11 @@ struct skb_shared_info { | |||
| 202 | */ | 202 | */ |
| 203 | atomic_t dataref; | 203 | atomic_t dataref; |
| 204 | 204 | ||
| 205 | skb_frag_t frags[MAX_SKB_FRAGS]; | ||
| 206 | /* Intermediate layers must ensure that destructor_arg | 205 | /* Intermediate layers must ensure that destructor_arg |
| 207 | * remains valid until skb destructor */ | 206 | * remains valid until skb destructor */ |
| 208 | void * destructor_arg; | 207 | void * destructor_arg; |
| 208 | /* must be last field, see pskb_expand_head() */ | ||
| 209 | skb_frag_t frags[MAX_SKB_FRAGS]; | ||
| 209 | }; | 210 | }; |
| 210 | 211 | ||
| 211 | /* We divide dataref into two halves. The higher 16 bits hold references | 212 | /* We divide dataref into two halves. The higher 16 bits hold references |
| @@ -459,19 +460,7 @@ static inline void skb_dst_set(struct sk_buff *skb, struct dst_entry *dst) | |||
| 459 | skb->_skb_refdst = (unsigned long)dst; | 460 | skb->_skb_refdst = (unsigned long)dst; |
| 460 | } | 461 | } |
| 461 | 462 | ||
| 462 | /** | 463 | extern void skb_dst_set_noref(struct sk_buff *skb, struct dst_entry *dst); |
| 463 | * skb_dst_set_noref - sets skb dst, without a reference | ||
| 464 | * @skb: buffer | ||
| 465 | * @dst: dst entry | ||
| 466 | * | ||
| 467 | * Sets skb dst, assuming a reference was not taken on dst | ||
| 468 | * skb_dst_drop() should not dst_release() this dst | ||
| 469 | */ | ||
| 470 | static inline void skb_dst_set_noref(struct sk_buff *skb, struct dst_entry *dst) | ||
| 471 | { | ||
| 472 | WARN_ON(!rcu_read_lock_held() && !rcu_read_lock_bh_held()); | ||
| 473 | skb->_skb_refdst = (unsigned long)dst | SKB_DST_NOREF; | ||
| 474 | } | ||
| 475 | 464 | ||
| 476 | /** | 465 | /** |
| 477 | * skb_dst_is_noref - Test if skb dst isnt refcounted | 466 | * skb_dst_is_noref - Test if skb dst isnt refcounted |
| @@ -495,13 +484,13 @@ extern struct sk_buff *__alloc_skb(unsigned int size, | |||
| 495 | static inline struct sk_buff *alloc_skb(unsigned int size, | 484 | static inline struct sk_buff *alloc_skb(unsigned int size, |
| 496 | gfp_t priority) | 485 | gfp_t priority) |
| 497 | { | 486 | { |
| 498 | return __alloc_skb(size, priority, 0, -1); | 487 | return __alloc_skb(size, priority, 0, NUMA_NO_NODE); |
| 499 | } | 488 | } |
| 500 | 489 | ||
| 501 | static inline struct sk_buff *alloc_skb_fclone(unsigned int size, | 490 | static inline struct sk_buff *alloc_skb_fclone(unsigned int size, |
| 502 | gfp_t priority) | 491 | gfp_t priority) |
| 503 | { | 492 | { |
| 504 | return __alloc_skb(size, priority, 1, -1); | 493 | return __alloc_skb(size, priority, 1, NUMA_NO_NODE); |
| 505 | } | 494 | } |
| 506 | 495 | ||
| 507 | extern bool skb_recycle_check(struct sk_buff *skb, int skb_size); | 496 | extern bool skb_recycle_check(struct sk_buff *skb, int skb_size); |
| @@ -555,6 +544,15 @@ extern unsigned int skb_find_text(struct sk_buff *skb, unsigned int from, | |||
| 555 | unsigned int to, struct ts_config *config, | 544 | unsigned int to, struct ts_config *config, |
| 556 | struct ts_state *state); | 545 | struct ts_state *state); |
| 557 | 546 | ||
| 547 | extern __u32 __skb_get_rxhash(struct sk_buff *skb); | ||
| 548 | static inline __u32 skb_get_rxhash(struct sk_buff *skb) | ||
| 549 | { | ||
| 550 | if (!skb->rxhash) | ||
| 551 | skb->rxhash = __skb_get_rxhash(skb); | ||
| 552 | |||
| 553 | return skb->rxhash; | ||
| 554 | } | ||
| 555 | |||
| 558 | #ifdef NET_SKBUFF_DATA_USES_OFFSET | 556 | #ifdef NET_SKBUFF_DATA_USES_OFFSET |
| 559 | static inline unsigned char *skb_end_pointer(const struct sk_buff *skb) | 557 | static inline unsigned char *skb_end_pointer(const struct sk_buff *skb) |
| 560 | { | 558 | { |
| @@ -575,11 +573,6 @@ static inline struct skb_shared_hwtstamps *skb_hwtstamps(struct sk_buff *skb) | |||
| 575 | return &skb_shinfo(skb)->hwtstamps; | 573 | return &skb_shinfo(skb)->hwtstamps; |
| 576 | } | 574 | } |
| 577 | 575 | ||
| 578 | static inline union skb_shared_tx *skb_tx(struct sk_buff *skb) | ||
| 579 | { | ||
| 580 | return &skb_shinfo(skb)->tx_flags; | ||
| 581 | } | ||
| 582 | |||
| 583 | /** | 576 | /** |
| 584 | * skb_queue_empty - check if a queue is empty | 577 | * skb_queue_empty - check if a queue is empty |
| 585 | * @list: queue head | 578 | * @list: queue head |
| @@ -601,7 +594,7 @@ static inline int skb_queue_empty(const struct sk_buff_head *list) | |||
| 601 | static inline bool skb_queue_is_last(const struct sk_buff_head *list, | 594 | static inline bool skb_queue_is_last(const struct sk_buff_head *list, |
| 602 | const struct sk_buff *skb) | 595 | const struct sk_buff *skb) |
| 603 | { | 596 | { |
| 604 | return (skb->next == (struct sk_buff *) list); | 597 | return skb->next == (struct sk_buff *)list; |
| 605 | } | 598 | } |
| 606 | 599 | ||
| 607 | /** | 600 | /** |
| @@ -614,7 +607,7 @@ static inline bool skb_queue_is_last(const struct sk_buff_head *list, | |||
| 614 | static inline bool skb_queue_is_first(const struct sk_buff_head *list, | 607 | static inline bool skb_queue_is_first(const struct sk_buff_head *list, |
| 615 | const struct sk_buff *skb) | 608 | const struct sk_buff *skb) |
| 616 | { | 609 | { |
| 617 | return (skb->prev == (struct sk_buff *) list); | 610 | return skb->prev == (struct sk_buff *)list; |
| 618 | } | 611 | } |
| 619 | 612 | ||
| 620 | /** | 613 | /** |
| @@ -1120,7 +1113,7 @@ extern void skb_add_rx_frag(struct sk_buff *skb, int i, struct page *page, | |||
| 1120 | int off, int size); | 1113 | int off, int size); |
| 1121 | 1114 | ||
| 1122 | #define SKB_PAGE_ASSERT(skb) BUG_ON(skb_shinfo(skb)->nr_frags) | 1115 | #define SKB_PAGE_ASSERT(skb) BUG_ON(skb_shinfo(skb)->nr_frags) |
| 1123 | #define SKB_FRAG_ASSERT(skb) BUG_ON(skb_has_frags(skb)) | 1116 | #define SKB_FRAG_ASSERT(skb) BUG_ON(skb_has_frag_list(skb)) |
| 1124 | #define SKB_LINEAR_ASSERT(skb) BUG_ON(skb_is_nonlinear(skb)) | 1117 | #define SKB_LINEAR_ASSERT(skb) BUG_ON(skb_is_nonlinear(skb)) |
| 1125 | 1118 | ||
| 1126 | #ifdef NET_SKBUFF_DATA_USES_OFFSET | 1119 | #ifdef NET_SKBUFF_DATA_USES_OFFSET |
| @@ -1376,6 +1369,11 @@ static inline int skb_network_offset(const struct sk_buff *skb) | |||
| 1376 | return skb_network_header(skb) - skb->data; | 1369 | return skb_network_header(skb) - skb->data; |
| 1377 | } | 1370 | } |
| 1378 | 1371 | ||
| 1372 | static inline int pskb_network_may_pull(struct sk_buff *skb, unsigned int len) | ||
| 1373 | { | ||
| 1374 | return pskb_may_pull(skb, skb_network_offset(skb) + len); | ||
| 1375 | } | ||
| 1376 | |||
| 1379 | /* | 1377 | /* |
| 1380 | * CPUs often take a performance hit when accessing unaligned memory | 1378 | * CPUs often take a performance hit when accessing unaligned memory |
| 1381 | * locations. The actual performance hit varies, it can be small if the | 1379 | * locations. The actual performance hit varies, it can be small if the |
| @@ -1414,12 +1412,14 @@ static inline int skb_network_offset(const struct sk_buff *skb) | |||
| 1414 | * | 1412 | * |
| 1415 | * Various parts of the networking layer expect at least 32 bytes of | 1413 | * Various parts of the networking layer expect at least 32 bytes of |
| 1416 | * headroom, you should not reduce this. | 1414 | * headroom, you should not reduce this. |
| 1417 | * With RPS, we raised NET_SKB_PAD to 64 so that get_rps_cpus() fetches span | 1415 | * |
| 1418 | * a 64 bytes aligned block to fit modern (>= 64 bytes) cache line sizes | 1416 | * Using max(32, L1_CACHE_BYTES) makes sense (especially with RPS) |
| 1417 | * to reduce average number of cache lines per packet. | ||
| 1418 | * get_rps_cpus() for example only access one 64 bytes aligned block : | ||
| 1419 | * NET_IP_ALIGN(2) + ethernet_header(14) + IP_header(20/40) + ports(8) | 1419 | * NET_IP_ALIGN(2) + ethernet_header(14) + IP_header(20/40) + ports(8) |
| 1420 | */ | 1420 | */ |
| 1421 | #ifndef NET_SKB_PAD | 1421 | #ifndef NET_SKB_PAD |
| 1422 | #define NET_SKB_PAD 64 | 1422 | #define NET_SKB_PAD max(32, L1_CACHE_BYTES) |
| 1423 | #endif | 1423 | #endif |
| 1424 | 1424 | ||
| 1425 | extern int ___pskb_trim(struct sk_buff *skb, unsigned int len); | 1425 | extern int ___pskb_trim(struct sk_buff *skb, unsigned int len); |
| @@ -1551,13 +1551,25 @@ static inline struct sk_buff *netdev_alloc_skb_ip_align(struct net_device *dev, | |||
| 1551 | return skb; | 1551 | return skb; |
| 1552 | } | 1552 | } |
| 1553 | 1553 | ||
| 1554 | extern struct page *__netdev_alloc_page(struct net_device *dev, gfp_t gfp_mask); | 1554 | /** |
| 1555 | * __netdev_alloc_page - allocate a page for ps-rx on a specific device | ||
| 1556 | * @dev: network device to receive on | ||
| 1557 | * @gfp_mask: alloc_pages_node mask | ||
| 1558 | * | ||
| 1559 | * Allocate a new page. dev currently unused. | ||
| 1560 | * | ||
| 1561 | * %NULL is returned if there is no free memory. | ||
| 1562 | */ | ||
| 1563 | static inline struct page *__netdev_alloc_page(struct net_device *dev, gfp_t gfp_mask) | ||
| 1564 | { | ||
| 1565 | return alloc_pages_node(NUMA_NO_NODE, gfp_mask, 0); | ||
| 1566 | } | ||
| 1555 | 1567 | ||
| 1556 | /** | 1568 | /** |
| 1557 | * netdev_alloc_page - allocate a page for ps-rx on a specific device | 1569 | * netdev_alloc_page - allocate a page for ps-rx on a specific device |
| 1558 | * @dev: network device to receive on | 1570 | * @dev: network device to receive on |
| 1559 | * | 1571 | * |
| 1560 | * Allocate a new page node local to the specified device. | 1572 | * Allocate a new page. dev currently unused. |
| 1561 | * | 1573 | * |
| 1562 | * %NULL is returned if there is no free memory. | 1574 | * %NULL is returned if there is no free memory. |
| 1563 | */ | 1575 | */ |
| @@ -1777,7 +1789,7 @@ static inline int pskb_trim_rcsum(struct sk_buff *skb, unsigned int len) | |||
| 1777 | skb = skb->prev) | 1789 | skb = skb->prev) |
| 1778 | 1790 | ||
| 1779 | 1791 | ||
| 1780 | static inline bool skb_has_frags(const struct sk_buff *skb) | 1792 | static inline bool skb_has_frag_list(const struct sk_buff *skb) |
| 1781 | { | 1793 | { |
| 1782 | return skb_shinfo(skb)->frag_list != NULL; | 1794 | return skb_shinfo(skb)->frag_list != NULL; |
| 1783 | } | 1795 | } |
| @@ -1931,6 +1943,36 @@ static inline ktime_t net_invalid_timestamp(void) | |||
| 1931 | return ktime_set(0, 0); | 1943 | return ktime_set(0, 0); |
| 1932 | } | 1944 | } |
| 1933 | 1945 | ||
| 1946 | extern void skb_timestamping_init(void); | ||
| 1947 | |||
| 1948 | #ifdef CONFIG_NETWORK_PHY_TIMESTAMPING | ||
| 1949 | |||
| 1950 | extern void skb_clone_tx_timestamp(struct sk_buff *skb); | ||
| 1951 | extern bool skb_defer_rx_timestamp(struct sk_buff *skb); | ||
| 1952 | |||
| 1953 | #else /* CONFIG_NETWORK_PHY_TIMESTAMPING */ | ||
| 1954 | |||
| 1955 | static inline void skb_clone_tx_timestamp(struct sk_buff *skb) | ||
| 1956 | { | ||
| 1957 | } | ||
| 1958 | |||
| 1959 | static inline bool skb_defer_rx_timestamp(struct sk_buff *skb) | ||
| 1960 | { | ||
| 1961 | return false; | ||
| 1962 | } | ||
| 1963 | |||
| 1964 | #endif /* !CONFIG_NETWORK_PHY_TIMESTAMPING */ | ||
| 1965 | |||
| 1966 | /** | ||
| 1967 | * skb_complete_tx_timestamp() - deliver cloned skb with tx timestamps | ||
| 1968 | * | ||
| 1969 | * @skb: clone of the the original outgoing packet | ||
| 1970 | * @hwtstamps: hardware time stamps | ||
| 1971 | * | ||
| 1972 | */ | ||
| 1973 | void skb_complete_tx_timestamp(struct sk_buff *skb, | ||
| 1974 | struct skb_shared_hwtstamps *hwtstamps); | ||
| 1975 | |||
| 1934 | /** | 1976 | /** |
| 1935 | * skb_tstamp_tx - queue clone of skb with send time stamps | 1977 | * skb_tstamp_tx - queue clone of skb with send time stamps |
| 1936 | * @orig_skb: the original outgoing packet | 1978 | * @orig_skb: the original outgoing packet |
| @@ -1945,6 +1987,28 @@ static inline ktime_t net_invalid_timestamp(void) | |||
| 1945 | extern void skb_tstamp_tx(struct sk_buff *orig_skb, | 1987 | extern void skb_tstamp_tx(struct sk_buff *orig_skb, |
| 1946 | struct skb_shared_hwtstamps *hwtstamps); | 1988 | struct skb_shared_hwtstamps *hwtstamps); |
| 1947 | 1989 | ||
| 1990 | static inline void sw_tx_timestamp(struct sk_buff *skb) | ||
| 1991 | { | ||
| 1992 | if (skb_shinfo(skb)->tx_flags & SKBTX_SW_TSTAMP && | ||
| 1993 | !(skb_shinfo(skb)->tx_flags & SKBTX_IN_PROGRESS)) | ||
| 1994 | skb_tstamp_tx(skb, NULL); | ||
| 1995 | } | ||
| 1996 | |||
| 1997 | /** | ||
| 1998 | * skb_tx_timestamp() - Driver hook for transmit timestamping | ||
| 1999 | * | ||
| 2000 | * Ethernet MAC Drivers should call this function in their hard_xmit() | ||
| 2001 | * function as soon as possible after giving the sk_buff to the MAC | ||
| 2002 | * hardware, but before freeing the sk_buff. | ||
| 2003 | * | ||
| 2004 | * @skb: A socket buffer. | ||
| 2005 | */ | ||
| 2006 | static inline void skb_tx_timestamp(struct sk_buff *skb) | ||
| 2007 | { | ||
| 2008 | skb_clone_tx_timestamp(skb); | ||
| 2009 | sw_tx_timestamp(skb); | ||
| 2010 | } | ||
| 2011 | |||
| 1948 | extern __sum16 __skb_checksum_complete_head(struct sk_buff *skb, int len); | 2012 | extern __sum16 __skb_checksum_complete_head(struct sk_buff *skb, int len); |
| 1949 | extern __sum16 __skb_checksum_complete(struct sk_buff *skb); | 2013 | extern __sum16 __skb_checksum_complete(struct sk_buff *skb); |
| 1950 | 2014 | ||
| @@ -2097,7 +2161,7 @@ static inline u16 skb_get_rx_queue(const struct sk_buff *skb) | |||
| 2097 | 2161 | ||
| 2098 | static inline bool skb_rx_queue_recorded(const struct sk_buff *skb) | 2162 | static inline bool skb_rx_queue_recorded(const struct sk_buff *skb) |
| 2099 | { | 2163 | { |
| 2100 | return (skb->queue_mapping != 0); | 2164 | return skb->queue_mapping != 0; |
| 2101 | } | 2165 | } |
| 2102 | 2166 | ||
| 2103 | extern u16 skb_tx_hash(const struct net_device *dev, | 2167 | extern u16 skb_tx_hash(const struct net_device *dev, |
| @@ -2132,7 +2196,8 @@ static inline bool skb_warn_if_lro(const struct sk_buff *skb) | |||
| 2132 | /* LRO sets gso_size but not gso_type, whereas if GSO is really | 2196 | /* LRO sets gso_size but not gso_type, whereas if GSO is really |
| 2133 | * wanted then gso_type will be set. */ | 2197 | * wanted then gso_type will be set. */ |
| 2134 | struct skb_shared_info *shinfo = skb_shinfo(skb); | 2198 | struct skb_shared_info *shinfo = skb_shinfo(skb); |
| 2135 | if (shinfo->gso_size != 0 && unlikely(shinfo->gso_type == 0)) { | 2199 | if (skb_is_nonlinear(skb) && shinfo->gso_size != 0 && |
| 2200 | unlikely(shinfo->gso_type == 0)) { | ||
| 2136 | __skb_warn_lro_forwarding(skb); | 2201 | __skb_warn_lro_forwarding(skb); |
| 2137 | return true; | 2202 | return true; |
| 2138 | } | 2203 | } |
| @@ -2146,6 +2211,21 @@ static inline void skb_forward_csum(struct sk_buff *skb) | |||
| 2146 | skb->ip_summed = CHECKSUM_NONE; | 2211 | skb->ip_summed = CHECKSUM_NONE; |
| 2147 | } | 2212 | } |
| 2148 | 2213 | ||
| 2214 | /** | ||
| 2215 | * skb_checksum_none_assert - make sure skb ip_summed is CHECKSUM_NONE | ||
| 2216 | * @skb: skb to check | ||
| 2217 | * | ||
| 2218 | * fresh skbs have their ip_summed set to CHECKSUM_NONE. | ||
| 2219 | * Instead of forcing ip_summed to CHECKSUM_NONE, we can | ||
| 2220 | * use this helper, to document places where we make this assertion. | ||
| 2221 | */ | ||
| 2222 | static inline void skb_checksum_none_assert(struct sk_buff *skb) | ||
| 2223 | { | ||
| 2224 | #ifdef DEBUG | ||
| 2225 | BUG_ON(skb->ip_summed != CHECKSUM_NONE); | ||
| 2226 | #endif | ||
| 2227 | } | ||
| 2228 | |||
| 2149 | bool skb_partial_csum_set(struct sk_buff *skb, u16 start, u16 off); | 2229 | bool skb_partial_csum_set(struct sk_buff *skb, u16 start, u16 off); |
| 2150 | #endif /* __KERNEL__ */ | 2230 | #endif /* __KERNEL__ */ |
| 2151 | #endif /* _LINUX_SKBUFF_H */ | 2231 | #endif /* _LINUX_SKBUFF_H */ |
diff --git a/include/linux/slab.h b/include/linux/slab.h index 49d1247cd6d9..59260e21bdf5 100644 --- a/include/linux/slab.h +++ b/include/linux/slab.h | |||
| @@ -268,7 +268,8 @@ static inline void *kmem_cache_alloc_node(struct kmem_cache *cachep, | |||
| 268 | * allocator where we care about the real place the memory allocation | 268 | * allocator where we care about the real place the memory allocation |
| 269 | * request comes from. | 269 | * request comes from. |
| 270 | */ | 270 | */ |
| 271 | #if defined(CONFIG_DEBUG_SLAB) || defined(CONFIG_SLUB) | 271 | #if defined(CONFIG_DEBUG_SLAB) || defined(CONFIG_SLUB) || \ |
| 272 | (defined(CONFIG_SLAB) && defined(CONFIG_TRACING)) | ||
| 272 | extern void *__kmalloc_track_caller(size_t, gfp_t, unsigned long); | 273 | extern void *__kmalloc_track_caller(size_t, gfp_t, unsigned long); |
| 273 | #define kmalloc_track_caller(size, flags) \ | 274 | #define kmalloc_track_caller(size, flags) \ |
| 274 | __kmalloc_track_caller(size, flags, _RET_IP_) | 275 | __kmalloc_track_caller(size, flags, _RET_IP_) |
| @@ -286,7 +287,8 @@ extern void *__kmalloc_track_caller(size_t, gfp_t, unsigned long); | |||
| 286 | * standard allocator where we care about the real place the memory | 287 | * standard allocator where we care about the real place the memory |
| 287 | * allocation request comes from. | 288 | * allocation request comes from. |
| 288 | */ | 289 | */ |
| 289 | #if defined(CONFIG_DEBUG_SLAB) || defined(CONFIG_SLUB) | 290 | #if defined(CONFIG_DEBUG_SLAB) || defined(CONFIG_SLUB) || \ |
| 291 | (defined(CONFIG_SLAB) && defined(CONFIG_TRACING)) | ||
| 290 | extern void *__kmalloc_node_track_caller(size_t, gfp_t, int, unsigned long); | 292 | extern void *__kmalloc_node_track_caller(size_t, gfp_t, int, unsigned long); |
| 291 | #define kmalloc_node_track_caller(size, flags, node) \ | 293 | #define kmalloc_node_track_caller(size, flags, node) \ |
| 292 | __kmalloc_node_track_caller(size, flags, node, \ | 294 | __kmalloc_node_track_caller(size, flags, node, \ |
diff --git a/include/linux/slab_def.h b/include/linux/slab_def.h index 1812dac8c496..791a502f6906 100644 --- a/include/linux/slab_def.h +++ b/include/linux/slab_def.h | |||
| @@ -14,9 +14,9 @@ | |||
| 14 | #include <asm/page.h> /* kmalloc_sizes.h needs PAGE_SIZE */ | 14 | #include <asm/page.h> /* kmalloc_sizes.h needs PAGE_SIZE */ |
| 15 | #include <asm/cache.h> /* kmalloc_sizes.h needs L1_CACHE_BYTES */ | 15 | #include <asm/cache.h> /* kmalloc_sizes.h needs L1_CACHE_BYTES */ |
| 16 | #include <linux/compiler.h> | 16 | #include <linux/compiler.h> |
| 17 | #include <linux/kmemtrace.h> | ||
| 18 | 17 | ||
| 19 | #ifndef ARCH_KMALLOC_MINALIGN | 18 | #include <trace/events/kmem.h> |
| 19 | |||
| 20 | /* | 20 | /* |
| 21 | * Enforce a minimum alignment for the kmalloc caches. | 21 | * Enforce a minimum alignment for the kmalloc caches. |
| 22 | * Usually, the kmalloc caches are cache_line_size() aligned, except when | 22 | * Usually, the kmalloc caches are cache_line_size() aligned, except when |
| @@ -26,6 +26,9 @@ | |||
| 26 | * ARCH_KMALLOC_MINALIGN allows that. | 26 | * ARCH_KMALLOC_MINALIGN allows that. |
| 27 | * Note that increasing this value may disable some debug features. | 27 | * Note that increasing this value may disable some debug features. |
| 28 | */ | 28 | */ |
| 29 | #ifdef ARCH_DMA_MINALIGN | ||
| 30 | #define ARCH_KMALLOC_MINALIGN ARCH_DMA_MINALIGN | ||
| 31 | #else | ||
| 29 | #define ARCH_KMALLOC_MINALIGN __alignof__(unsigned long long) | 32 | #define ARCH_KMALLOC_MINALIGN __alignof__(unsigned long long) |
| 30 | #endif | 33 | #endif |
| 31 | 34 | ||
diff --git a/include/linux/slob_def.h b/include/linux/slob_def.h index 62667f72c2ef..4382db09df4f 100644 --- a/include/linux/slob_def.h +++ b/include/linux/slob_def.h | |||
| @@ -1,7 +1,9 @@ | |||
| 1 | #ifndef __LINUX_SLOB_DEF_H | 1 | #ifndef __LINUX_SLOB_DEF_H |
| 2 | #define __LINUX_SLOB_DEF_H | 2 | #define __LINUX_SLOB_DEF_H |
| 3 | 3 | ||
| 4 | #ifndef ARCH_KMALLOC_MINALIGN | 4 | #ifdef ARCH_DMA_MINALIGN |
| 5 | #define ARCH_KMALLOC_MINALIGN ARCH_DMA_MINALIGN | ||
| 6 | #else | ||
| 5 | #define ARCH_KMALLOC_MINALIGN __alignof__(unsigned long) | 7 | #define ARCH_KMALLOC_MINALIGN __alignof__(unsigned long) |
| 6 | #endif | 8 | #endif |
| 7 | 9 | ||
diff --git a/include/linux/slow-work.h b/include/linux/slow-work.h deleted file mode 100644 index 13337bf6c3f5..000000000000 --- a/include/linux/slow-work.h +++ /dev/null | |||
| @@ -1,163 +0,0 @@ | |||
| 1 | /* Worker thread pool for slow items, such as filesystem lookups or mkdirs | ||
| 2 | * | ||
| 3 | * Copyright (C) 2008 Red Hat, Inc. All Rights Reserved. | ||
| 4 | * Written by David Howells (dhowells@redhat.com) | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or | ||
| 7 | * modify it under the terms of the GNU General Public Licence | ||
| 8 | * as published by the Free Software Foundation; either version | ||
| 9 | * 2 of the Licence, or (at your option) any later version. | ||
| 10 | * | ||
| 11 | * See Documentation/slow-work.txt | ||
| 12 | */ | ||
| 13 | |||
| 14 | #ifndef _LINUX_SLOW_WORK_H | ||
| 15 | #define _LINUX_SLOW_WORK_H | ||
| 16 | |||
| 17 | #ifdef CONFIG_SLOW_WORK | ||
| 18 | |||
| 19 | #include <linux/sysctl.h> | ||
| 20 | #include <linux/timer.h> | ||
| 21 | |||
| 22 | struct slow_work; | ||
| 23 | #ifdef CONFIG_SLOW_WORK_DEBUG | ||
| 24 | struct seq_file; | ||
| 25 | #endif | ||
| 26 | |||
| 27 | /* | ||
| 28 | * The operations used to support slow work items | ||
| 29 | */ | ||
| 30 | struct slow_work_ops { | ||
| 31 | /* owner */ | ||
| 32 | struct module *owner; | ||
| 33 | |||
| 34 | /* get a ref on a work item | ||
| 35 | * - return 0 if successful, -ve if not | ||
| 36 | */ | ||
| 37 | int (*get_ref)(struct slow_work *work); | ||
| 38 | |||
| 39 | /* discard a ref to a work item */ | ||
| 40 | void (*put_ref)(struct slow_work *work); | ||
| 41 | |||
| 42 | /* execute a work item */ | ||
| 43 | void (*execute)(struct slow_work *work); | ||
| 44 | |||
| 45 | #ifdef CONFIG_SLOW_WORK_DEBUG | ||
| 46 | /* describe a work item for debugfs */ | ||
| 47 | void (*desc)(struct slow_work *work, struct seq_file *m); | ||
| 48 | #endif | ||
| 49 | }; | ||
| 50 | |||
| 51 | /* | ||
| 52 | * A slow work item | ||
| 53 | * - A reference is held on the parent object by the thread pool when it is | ||
| 54 | * queued | ||
| 55 | */ | ||
| 56 | struct slow_work { | ||
| 57 | struct module *owner; /* the owning module */ | ||
| 58 | unsigned long flags; | ||
| 59 | #define SLOW_WORK_PENDING 0 /* item pending (further) execution */ | ||
| 60 | #define SLOW_WORK_EXECUTING 1 /* item currently executing */ | ||
| 61 | #define SLOW_WORK_ENQ_DEFERRED 2 /* item enqueue deferred */ | ||
| 62 | #define SLOW_WORK_VERY_SLOW 3 /* item is very slow */ | ||
| 63 | #define SLOW_WORK_CANCELLING 4 /* item is being cancelled, don't enqueue */ | ||
| 64 | #define SLOW_WORK_DELAYED 5 /* item is struct delayed_slow_work with active timer */ | ||
| 65 | const struct slow_work_ops *ops; /* operations table for this item */ | ||
| 66 | struct list_head link; /* link in queue */ | ||
| 67 | #ifdef CONFIG_SLOW_WORK_DEBUG | ||
| 68 | struct timespec mark; /* jiffies at which queued or exec begun */ | ||
| 69 | #endif | ||
| 70 | }; | ||
| 71 | |||
| 72 | struct delayed_slow_work { | ||
| 73 | struct slow_work work; | ||
| 74 | struct timer_list timer; | ||
| 75 | }; | ||
| 76 | |||
| 77 | /** | ||
| 78 | * slow_work_init - Initialise a slow work item | ||
| 79 | * @work: The work item to initialise | ||
| 80 | * @ops: The operations to use to handle the slow work item | ||
| 81 | * | ||
| 82 | * Initialise a slow work item. | ||
| 83 | */ | ||
| 84 | static inline void slow_work_init(struct slow_work *work, | ||
| 85 | const struct slow_work_ops *ops) | ||
| 86 | { | ||
| 87 | work->flags = 0; | ||
| 88 | work->ops = ops; | ||
| 89 | INIT_LIST_HEAD(&work->link); | ||
| 90 | } | ||
| 91 | |||
| 92 | /** | ||
| 93 | * slow_work_init - Initialise a delayed slow work item | ||
| 94 | * @work: The work item to initialise | ||
| 95 | * @ops: The operations to use to handle the slow work item | ||
| 96 | * | ||
| 97 | * Initialise a delayed slow work item. | ||
| 98 | */ | ||
| 99 | static inline void delayed_slow_work_init(struct delayed_slow_work *dwork, | ||
| 100 | const struct slow_work_ops *ops) | ||
| 101 | { | ||
| 102 | init_timer(&dwork->timer); | ||
| 103 | slow_work_init(&dwork->work, ops); | ||
| 104 | } | ||
| 105 | |||
| 106 | /** | ||
| 107 | * vslow_work_init - Initialise a very slow work item | ||
| 108 | * @work: The work item to initialise | ||
| 109 | * @ops: The operations to use to handle the slow work item | ||
| 110 | * | ||
| 111 | * Initialise a very slow work item. This item will be restricted such that | ||
| 112 | * only a certain number of the pool threads will be able to execute items of | ||
| 113 | * this type. | ||
| 114 | */ | ||
| 115 | static inline void vslow_work_init(struct slow_work *work, | ||
| 116 | const struct slow_work_ops *ops) | ||
| 117 | { | ||
| 118 | work->flags = 1 << SLOW_WORK_VERY_SLOW; | ||
| 119 | work->ops = ops; | ||
| 120 | INIT_LIST_HEAD(&work->link); | ||
| 121 | } | ||
| 122 | |||
| 123 | /** | ||
| 124 | * slow_work_is_queued - Determine if a slow work item is on the work queue | ||
| 125 | * work: The work item to test | ||
| 126 | * | ||
| 127 | * Determine if the specified slow-work item is on the work queue. This | ||
| 128 | * returns true if it is actually on the queue. | ||
| 129 | * | ||
| 130 | * If the item is executing and has been marked for requeue when execution | ||
| 131 | * finishes, then false will be returned. | ||
| 132 | * | ||
| 133 | * Anyone wishing to wait for completion of execution can wait on the | ||
| 134 | * SLOW_WORK_EXECUTING bit. | ||
| 135 | */ | ||
| 136 | static inline bool slow_work_is_queued(struct slow_work *work) | ||
| 137 | { | ||
| 138 | unsigned long flags = work->flags; | ||
| 139 | return flags & SLOW_WORK_PENDING && !(flags & SLOW_WORK_EXECUTING); | ||
| 140 | } | ||
| 141 | |||
| 142 | extern int slow_work_enqueue(struct slow_work *work); | ||
| 143 | extern void slow_work_cancel(struct slow_work *work); | ||
| 144 | extern int slow_work_register_user(struct module *owner); | ||
| 145 | extern void slow_work_unregister_user(struct module *owner); | ||
| 146 | |||
| 147 | extern int delayed_slow_work_enqueue(struct delayed_slow_work *dwork, | ||
| 148 | unsigned long delay); | ||
| 149 | |||
| 150 | static inline void delayed_slow_work_cancel(struct delayed_slow_work *dwork) | ||
| 151 | { | ||
| 152 | slow_work_cancel(&dwork->work); | ||
| 153 | } | ||
| 154 | |||
| 155 | extern bool slow_work_sleep_till_thread_needed(struct slow_work *work, | ||
| 156 | signed long *_timeout); | ||
| 157 | |||
| 158 | #ifdef CONFIG_SYSCTL | ||
| 159 | extern ctl_table slow_work_sysctls[]; | ||
| 160 | #endif | ||
| 161 | |||
| 162 | #endif /* CONFIG_SLOW_WORK */ | ||
| 163 | #endif /* _LINUX_SLOW_WORK_H */ | ||
diff --git a/include/linux/slub_def.h b/include/linux/slub_def.h index 4ba59cfc1f75..e4f5ed180b9b 100644 --- a/include/linux/slub_def.h +++ b/include/linux/slub_def.h | |||
| @@ -10,9 +10,10 @@ | |||
| 10 | #include <linux/gfp.h> | 10 | #include <linux/gfp.h> |
| 11 | #include <linux/workqueue.h> | 11 | #include <linux/workqueue.h> |
| 12 | #include <linux/kobject.h> | 12 | #include <linux/kobject.h> |
| 13 | #include <linux/kmemtrace.h> | ||
| 14 | #include <linux/kmemleak.h> | 13 | #include <linux/kmemleak.h> |
| 15 | 14 | ||
| 15 | #include <trace/events/kmem.h> | ||
| 16 | |||
| 16 | enum stat_item { | 17 | enum stat_item { |
| 17 | ALLOC_FASTPATH, /* Allocation from cpu slab */ | 18 | ALLOC_FASTPATH, /* Allocation from cpu slab */ |
| 18 | ALLOC_SLOWPATH, /* Allocation by getting a new cpu slab */ | 19 | ALLOC_SLOWPATH, /* Allocation by getting a new cpu slab */ |
| @@ -67,7 +68,7 @@ struct kmem_cache_order_objects { | |||
| 67 | * Slab cache management. | 68 | * Slab cache management. |
| 68 | */ | 69 | */ |
| 69 | struct kmem_cache { | 70 | struct kmem_cache { |
| 70 | struct kmem_cache_cpu *cpu_slab; | 71 | struct kmem_cache_cpu __percpu *cpu_slab; |
| 71 | /* Used for retriving partial slabs etc */ | 72 | /* Used for retriving partial slabs etc */ |
| 72 | unsigned long flags; | 73 | unsigned long flags; |
| 73 | int size; /* The size of an object including meta data */ | 74 | int size; /* The size of an object including meta data */ |
| @@ -86,7 +87,7 @@ struct kmem_cache { | |||
| 86 | unsigned long min_partial; | 87 | unsigned long min_partial; |
| 87 | const char *name; /* Name (only for display!) */ | 88 | const char *name; /* Name (only for display!) */ |
| 88 | struct list_head list; /* List of slab caches */ | 89 | struct list_head list; /* List of slab caches */ |
| 89 | #ifdef CONFIG_SLUB_DEBUG | 90 | #ifdef CONFIG_SYSFS |
| 90 | struct kobject kobj; /* For sysfs */ | 91 | struct kobject kobj; /* For sysfs */ |
| 91 | #endif | 92 | #endif |
| 92 | 93 | ||
| @@ -95,25 +96,24 @@ struct kmem_cache { | |||
| 95 | * Defragmentation by allocating from a remote node. | 96 | * Defragmentation by allocating from a remote node. |
| 96 | */ | 97 | */ |
| 97 | int remote_node_defrag_ratio; | 98 | int remote_node_defrag_ratio; |
| 98 | struct kmem_cache_node *node[MAX_NUMNODES]; | ||
| 99 | #else | ||
| 100 | /* Avoid an extra cache line for UP */ | ||
| 101 | struct kmem_cache_node local_node; | ||
| 102 | #endif | 99 | #endif |
| 100 | struct kmem_cache_node *node[MAX_NUMNODES]; | ||
| 103 | }; | 101 | }; |
| 104 | 102 | ||
| 105 | /* | 103 | /* |
| 106 | * Kmalloc subsystem. | 104 | * Kmalloc subsystem. |
| 107 | */ | 105 | */ |
| 108 | #if defined(ARCH_KMALLOC_MINALIGN) && ARCH_KMALLOC_MINALIGN > 8 | 106 | #if defined(ARCH_DMA_MINALIGN) && ARCH_DMA_MINALIGN > 8 |
| 109 | #define KMALLOC_MIN_SIZE ARCH_KMALLOC_MINALIGN | 107 | #define KMALLOC_MIN_SIZE ARCH_DMA_MINALIGN |
| 110 | #else | 108 | #else |
| 111 | #define KMALLOC_MIN_SIZE 8 | 109 | #define KMALLOC_MIN_SIZE 8 |
| 112 | #endif | 110 | #endif |
| 113 | 111 | ||
| 114 | #define KMALLOC_SHIFT_LOW ilog2(KMALLOC_MIN_SIZE) | 112 | #define KMALLOC_SHIFT_LOW ilog2(KMALLOC_MIN_SIZE) |
| 115 | 113 | ||
| 116 | #ifndef ARCH_KMALLOC_MINALIGN | 114 | #ifdef ARCH_DMA_MINALIGN |
| 115 | #define ARCH_KMALLOC_MINALIGN ARCH_DMA_MINALIGN | ||
| 116 | #else | ||
| 117 | #define ARCH_KMALLOC_MINALIGN __alignof__(unsigned long long) | 117 | #define ARCH_KMALLOC_MINALIGN __alignof__(unsigned long long) |
| 118 | #endif | 118 | #endif |
| 119 | 119 | ||
| @@ -136,19 +136,16 @@ struct kmem_cache { | |||
| 136 | 136 | ||
| 137 | #ifdef CONFIG_ZONE_DMA | 137 | #ifdef CONFIG_ZONE_DMA |
| 138 | #define SLUB_DMA __GFP_DMA | 138 | #define SLUB_DMA __GFP_DMA |
| 139 | /* Reserve extra caches for potential DMA use */ | ||
| 140 | #define KMALLOC_CACHES (2 * SLUB_PAGE_SHIFT) | ||
| 141 | #else | 139 | #else |
| 142 | /* Disable DMA functionality */ | 140 | /* Disable DMA functionality */ |
| 143 | #define SLUB_DMA (__force gfp_t)0 | 141 | #define SLUB_DMA (__force gfp_t)0 |
| 144 | #define KMALLOC_CACHES SLUB_PAGE_SHIFT | ||
| 145 | #endif | 142 | #endif |
| 146 | 143 | ||
| 147 | /* | 144 | /* |
| 148 | * We keep the general caches in an array of slab caches that are used for | 145 | * We keep the general caches in an array of slab caches that are used for |
| 149 | * 2^x bytes of allocations. | 146 | * 2^x bytes of allocations. |
| 150 | */ | 147 | */ |
| 151 | extern struct kmem_cache kmalloc_caches[KMALLOC_CACHES]; | 148 | extern struct kmem_cache *kmalloc_caches[SLUB_PAGE_SHIFT]; |
| 152 | 149 | ||
| 153 | /* | 150 | /* |
| 154 | * Sorry that the following has to be that ugly but some versions of GCC | 151 | * Sorry that the following has to be that ugly but some versions of GCC |
| @@ -213,7 +210,7 @@ static __always_inline struct kmem_cache *kmalloc_slab(size_t size) | |||
| 213 | if (index == 0) | 210 | if (index == 0) |
| 214 | return NULL; | 211 | return NULL; |
| 215 | 212 | ||
| 216 | return &kmalloc_caches[index]; | 213 | return kmalloc_caches[index]; |
| 217 | } | 214 | } |
| 218 | 215 | ||
| 219 | void *kmem_cache_alloc(struct kmem_cache *, gfp_t); | 216 | void *kmem_cache_alloc(struct kmem_cache *, gfp_t); |
diff --git a/include/linux/smb.h b/include/linux/smb.h deleted file mode 100644 index 82fefddc5987..000000000000 --- a/include/linux/smb.h +++ /dev/null | |||
| @@ -1,118 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * smb.h | ||
| 3 | * | ||
| 4 | * Copyright (C) 1995, 1996 by Paal-Kr. Engstad and Volker Lendecke | ||
| 5 | * Copyright (C) 1997 by Volker Lendecke | ||
| 6 | * | ||
| 7 | */ | ||
| 8 | |||
| 9 | #ifndef _LINUX_SMB_H | ||
| 10 | #define _LINUX_SMB_H | ||
| 11 | |||
| 12 | #include <linux/types.h> | ||
| 13 | #include <linux/magic.h> | ||
| 14 | #ifdef __KERNEL__ | ||
| 15 | #include <linux/time.h> | ||
| 16 | #endif | ||
| 17 | |||
| 18 | enum smb_protocol { | ||
| 19 | SMB_PROTOCOL_NONE, | ||
| 20 | SMB_PROTOCOL_CORE, | ||
| 21 | SMB_PROTOCOL_COREPLUS, | ||
| 22 | SMB_PROTOCOL_LANMAN1, | ||
| 23 | SMB_PROTOCOL_LANMAN2, | ||
| 24 | SMB_PROTOCOL_NT1 | ||
| 25 | }; | ||
| 26 | |||
| 27 | enum smb_case_hndl { | ||
| 28 | SMB_CASE_DEFAULT, | ||
| 29 | SMB_CASE_LOWER, | ||
| 30 | SMB_CASE_UPPER | ||
| 31 | }; | ||
| 32 | |||
| 33 | struct smb_dskattr { | ||
| 34 | __u16 total; | ||
| 35 | __u16 allocblocks; | ||
| 36 | __u16 blocksize; | ||
| 37 | __u16 free; | ||
| 38 | }; | ||
| 39 | |||
| 40 | struct smb_conn_opt { | ||
| 41 | |||
| 42 | /* The socket */ | ||
| 43 | unsigned int fd; | ||
| 44 | |||
| 45 | enum smb_protocol protocol; | ||
| 46 | enum smb_case_hndl case_handling; | ||
| 47 | |||
| 48 | /* Connection-Options */ | ||
| 49 | |||
| 50 | __u32 max_xmit; | ||
| 51 | __u16 server_uid; | ||
| 52 | __u16 tid; | ||
| 53 | |||
| 54 | /* The following are LANMAN 1.0 options */ | ||
| 55 | __u16 secmode; | ||
| 56 | __u16 maxmux; | ||
| 57 | __u16 maxvcs; | ||
| 58 | __u16 rawmode; | ||
| 59 | __u32 sesskey; | ||
| 60 | |||
| 61 | /* The following are NT LM 0.12 options */ | ||
| 62 | __u32 maxraw; | ||
| 63 | __u32 capabilities; | ||
| 64 | __s16 serverzone; | ||
| 65 | }; | ||
| 66 | |||
| 67 | #ifdef __KERNEL__ | ||
| 68 | |||
| 69 | #define SMB_NLS_MAXNAMELEN 20 | ||
| 70 | struct smb_nls_codepage { | ||
| 71 | char local_name[SMB_NLS_MAXNAMELEN]; | ||
| 72 | char remote_name[SMB_NLS_MAXNAMELEN]; | ||
| 73 | }; | ||
| 74 | |||
| 75 | |||
| 76 | #define SMB_MAXNAMELEN 255 | ||
| 77 | #define SMB_MAXPATHLEN 1024 | ||
| 78 | |||
| 79 | /* | ||
| 80 | * Contains all relevant data on a SMB networked file. | ||
| 81 | */ | ||
| 82 | struct smb_fattr { | ||
| 83 | __u16 attr; | ||
| 84 | |||
| 85 | unsigned long f_ino; | ||
| 86 | umode_t f_mode; | ||
| 87 | nlink_t f_nlink; | ||
| 88 | uid_t f_uid; | ||
| 89 | gid_t f_gid; | ||
| 90 | dev_t f_rdev; | ||
| 91 | loff_t f_size; | ||
| 92 | struct timespec f_atime; | ||
| 93 | struct timespec f_mtime; | ||
| 94 | struct timespec f_ctime; | ||
| 95 | unsigned long f_blocks; | ||
| 96 | int f_unix; | ||
| 97 | }; | ||
| 98 | |||
| 99 | enum smb_conn_state { | ||
| 100 | CONN_VALID, /* everything's fine */ | ||
| 101 | CONN_INVALID, /* Something went wrong, but did not | ||
| 102 | try to reconnect yet. */ | ||
| 103 | CONN_RETRIED, /* Tried a reconnection, but was refused */ | ||
| 104 | CONN_RETRYING /* Currently trying to reconnect */ | ||
| 105 | }; | ||
| 106 | |||
| 107 | #define SMB_HEADER_LEN 37 /* includes everything up to, but not | ||
| 108 | * including smb_bcc */ | ||
| 109 | |||
| 110 | #define SMB_INITIAL_PACKET_SIZE 4000 | ||
| 111 | #define SMB_MAX_PACKET_SIZE 32768 | ||
| 112 | |||
| 113 | /* reserve this much space for trans2 parameters. Shouldn't have to be more | ||
| 114 | than 10 or so, but OS/2 seems happier like this. */ | ||
| 115 | #define SMB_TRANS2_MAX_PARAM 64 | ||
| 116 | |||
| 117 | #endif | ||
| 118 | #endif | ||
diff --git a/include/linux/smb_fs.h b/include/linux/smb_fs.h deleted file mode 100644 index 923cd8a247b1..000000000000 --- a/include/linux/smb_fs.h +++ /dev/null | |||
| @@ -1,153 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * smb_fs.h | ||
| 3 | * | ||
| 4 | * Copyright (C) 1995 by Paal-Kr. Engstad and Volker Lendecke | ||
| 5 | * Copyright (C) 1997 by Volker Lendecke | ||
| 6 | * | ||
| 7 | */ | ||
| 8 | |||
| 9 | #ifndef _LINUX_SMB_FS_H | ||
| 10 | #define _LINUX_SMB_FS_H | ||
| 11 | |||
| 12 | #include <linux/smb.h> | ||
| 13 | |||
| 14 | /* | ||
| 15 | * ioctl commands | ||
| 16 | */ | ||
| 17 | #define SMB_IOC_GETMOUNTUID _IOR('u', 1, __kernel_old_uid_t) | ||
| 18 | #define SMB_IOC_NEWCONN _IOW('u', 2, struct smb_conn_opt) | ||
| 19 | |||
| 20 | /* __kernel_uid_t can never change, so we have to use __kernel_uid32_t */ | ||
| 21 | #define SMB_IOC_GETMOUNTUID32 _IOR('u', 3, __kernel_uid32_t) | ||
| 22 | |||
| 23 | |||
| 24 | #ifdef __KERNEL__ | ||
| 25 | #include <linux/smb_fs_i.h> | ||
| 26 | #include <linux/smb_fs_sb.h> | ||
| 27 | |||
| 28 | #include <linux/fs.h> | ||
| 29 | #include <linux/pagemap.h> | ||
| 30 | #include <linux/vmalloc.h> | ||
| 31 | #include <linux/smb_mount.h> | ||
| 32 | #include <linux/jiffies.h> | ||
| 33 | #include <asm/unaligned.h> | ||
| 34 | |||
| 35 | static inline struct smb_sb_info *SMB_SB(struct super_block *sb) | ||
| 36 | { | ||
| 37 | return sb->s_fs_info; | ||
| 38 | } | ||
| 39 | |||
| 40 | static inline struct smb_inode_info *SMB_I(struct inode *inode) | ||
| 41 | { | ||
| 42 | return container_of(inode, struct smb_inode_info, vfs_inode); | ||
| 43 | } | ||
| 44 | |||
| 45 | /* macro names are short for word, double-word, long value (?) */ | ||
| 46 | #define WVAL(buf, pos) (get_unaligned_le16((u8 *)(buf) + (pos))) | ||
| 47 | #define DVAL(buf, pos) (get_unaligned_le32((u8 *)(buf) + (pos))) | ||
| 48 | #define LVAL(buf, pos) (get_unaligned_le64((u8 *)(buf) + (pos))) | ||
| 49 | |||
| 50 | #define WSET(buf, pos, val) put_unaligned_le16((val), (u8 *)(buf) + (pos)) | ||
| 51 | #define DSET(buf, pos, val) put_unaligned_le32((val), (u8 *)(buf) + (pos)) | ||
| 52 | #define LSET(buf, pos, val) put_unaligned_le64((val), (u8 *)(buf) + (pos)) | ||
| 53 | |||
| 54 | /* where to find the base of the SMB packet proper */ | ||
| 55 | #define smb_base(buf) ((u8 *)(((u8 *)(buf))+4)) | ||
| 56 | |||
| 57 | /* | ||
| 58 | * Flags for the in-memory inode | ||
| 59 | */ | ||
| 60 | #define SMB_F_LOCALWRITE 0x02 /* file modified locally */ | ||
| 61 | |||
| 62 | |||
| 63 | /* NT1 protocol capability bits */ | ||
| 64 | #define SMB_CAP_RAW_MODE 0x00000001 | ||
| 65 | #define SMB_CAP_MPX_MODE 0x00000002 | ||
| 66 | #define SMB_CAP_UNICODE 0x00000004 | ||
| 67 | #define SMB_CAP_LARGE_FILES 0x00000008 | ||
| 68 | #define SMB_CAP_NT_SMBS 0x00000010 | ||
| 69 | #define SMB_CAP_RPC_REMOTE_APIS 0x00000020 | ||
| 70 | #define SMB_CAP_STATUS32 0x00000040 | ||
| 71 | #define SMB_CAP_LEVEL_II_OPLOCKS 0x00000080 | ||
| 72 | #define SMB_CAP_LOCK_AND_READ 0x00000100 | ||
| 73 | #define SMB_CAP_NT_FIND 0x00000200 | ||
| 74 | #define SMB_CAP_DFS 0x00001000 | ||
| 75 | #define SMB_CAP_LARGE_READX 0x00004000 | ||
| 76 | #define SMB_CAP_LARGE_WRITEX 0x00008000 | ||
| 77 | #define SMB_CAP_UNIX 0x00800000 /* unofficial ... */ | ||
| 78 | |||
| 79 | |||
| 80 | /* | ||
| 81 | * This is the time we allow an inode, dentry or dir cache to live. It is bad | ||
| 82 | * for performance to have shorter ttl on an inode than on the cache. It can | ||
| 83 | * cause refresh on each inode for a dir listing ... one-by-one | ||
| 84 | */ | ||
| 85 | #define SMB_MAX_AGE(server) (((server)->mnt->ttl * HZ) / 1000) | ||
| 86 | |||
| 87 | static inline void | ||
| 88 | smb_age_dentry(struct smb_sb_info *server, struct dentry *dentry) | ||
| 89 | { | ||
| 90 | dentry->d_time = jiffies - SMB_MAX_AGE(server); | ||
| 91 | } | ||
| 92 | |||
| 93 | struct smb_cache_head { | ||
| 94 | time_t mtime; /* unused */ | ||
| 95 | unsigned long time; /* cache age */ | ||
| 96 | unsigned long end; /* last valid fpos in cache */ | ||
| 97 | int eof; | ||
| 98 | }; | ||
| 99 | |||
| 100 | #define SMB_DIRCACHE_SIZE ((int)(PAGE_CACHE_SIZE/sizeof(struct dentry *))) | ||
| 101 | union smb_dir_cache { | ||
| 102 | struct smb_cache_head head; | ||
| 103 | struct dentry *dentry[SMB_DIRCACHE_SIZE]; | ||
| 104 | }; | ||
| 105 | |||
| 106 | #define SMB_FIRSTCACHE_SIZE ((int)((SMB_DIRCACHE_SIZE * \ | ||
| 107 | sizeof(struct dentry *) - sizeof(struct smb_cache_head)) / \ | ||
| 108 | sizeof(struct dentry *))) | ||
| 109 | |||
| 110 | #define SMB_DIRCACHE_START (SMB_DIRCACHE_SIZE - SMB_FIRSTCACHE_SIZE) | ||
| 111 | |||
| 112 | struct smb_cache_control { | ||
| 113 | struct smb_cache_head head; | ||
| 114 | struct page *page; | ||
| 115 | union smb_dir_cache *cache; | ||
| 116 | unsigned long fpos, ofs; | ||
| 117 | int filled, valid, idx; | ||
| 118 | }; | ||
| 119 | |||
| 120 | #define SMB_OPS_NUM_STATIC 5 | ||
| 121 | struct smb_ops { | ||
| 122 | int (*read)(struct inode *inode, loff_t offset, int count, | ||
| 123 | char *data); | ||
| 124 | int (*write)(struct inode *inode, loff_t offset, int count, const | ||
| 125 | char *data); | ||
| 126 | int (*readdir)(struct file *filp, void *dirent, filldir_t filldir, | ||
| 127 | struct smb_cache_control *ctl); | ||
| 128 | |||
| 129 | int (*getattr)(struct smb_sb_info *server, struct dentry *dir, | ||
| 130 | struct smb_fattr *fattr); | ||
| 131 | /* int (*setattr)(...); */ /* setattr is really icky! */ | ||
| 132 | |||
| 133 | int (*truncate)(struct inode *inode, loff_t length); | ||
| 134 | |||
| 135 | |||
| 136 | /* --- --- --- end of "static" entries --- --- --- */ | ||
| 137 | |||
| 138 | int (*convert)(unsigned char *output, int olen, | ||
| 139 | const unsigned char *input, int ilen, | ||
| 140 | struct nls_table *nls_from, | ||
| 141 | struct nls_table *nls_to); | ||
| 142 | }; | ||
| 143 | |||
| 144 | static inline int | ||
| 145 | smb_is_open(struct inode *i) | ||
| 146 | { | ||
| 147 | return (SMB_I(i)->open == server_from_inode(i)->generation); | ||
| 148 | } | ||
| 149 | |||
| 150 | extern void smb_install_null_ops(struct smb_ops *); | ||
| 151 | #endif /* __KERNEL__ */ | ||
| 152 | |||
| 153 | #endif /* _LINUX_SMB_FS_H */ | ||
diff --git a/include/linux/smb_fs_i.h b/include/linux/smb_fs_i.h deleted file mode 100644 index 8ccf4eca2c3d..000000000000 --- a/include/linux/smb_fs_i.h +++ /dev/null | |||
| @@ -1,37 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * smb_fs_i.h | ||
| 3 | * | ||
| 4 | * Copyright (C) 1995 by Paal-Kr. Engstad and Volker Lendecke | ||
| 5 | * Copyright (C) 1997 by Volker Lendecke | ||
| 6 | * | ||
| 7 | */ | ||
| 8 | |||
| 9 | #ifndef _LINUX_SMB_FS_I | ||
| 10 | #define _LINUX_SMB_FS_I | ||
| 11 | |||
| 12 | #include <linux/types.h> | ||
| 13 | #include <linux/fs.h> | ||
| 14 | |||
| 15 | /* | ||
| 16 | * smb fs inode data (in memory only) | ||
| 17 | */ | ||
| 18 | struct smb_inode_info { | ||
| 19 | |||
| 20 | /* | ||
| 21 | * file handles are local to a connection. A file is open if | ||
| 22 | * (open == generation). | ||
| 23 | */ | ||
| 24 | unsigned int open; /* open generation */ | ||
| 25 | __u16 fileid; /* What id to handle a file with? */ | ||
| 26 | __u16 attr; /* Attribute fields, DOS value */ | ||
| 27 | |||
| 28 | __u16 access; /* Access mode */ | ||
| 29 | __u16 flags; | ||
| 30 | unsigned long oldmtime; /* last time refreshed */ | ||
| 31 | unsigned long closed; /* timestamp when closed */ | ||
| 32 | unsigned openers; /* number of fileid users */ | ||
| 33 | |||
| 34 | struct inode vfs_inode; /* must be at the end */ | ||
| 35 | }; | ||
| 36 | |||
| 37 | #endif | ||
diff --git a/include/linux/smb_fs_sb.h b/include/linux/smb_fs_sb.h deleted file mode 100644 index bb947dd1fba9..000000000000 --- a/include/linux/smb_fs_sb.h +++ /dev/null | |||
| @@ -1,100 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * smb_fs_sb.h | ||
| 3 | * | ||
| 4 | * Copyright (C) 1995 by Paal-Kr. Engstad and Volker Lendecke | ||
| 5 | * Copyright (C) 1997 by Volker Lendecke | ||
| 6 | * | ||
| 7 | */ | ||
| 8 | |||
| 9 | #ifndef _SMB_FS_SB | ||
| 10 | #define _SMB_FS_SB | ||
| 11 | |||
| 12 | #include <linux/types.h> | ||
| 13 | #include <linux/backing-dev.h> | ||
| 14 | #include <linux/smb.h> | ||
| 15 | |||
| 16 | /* | ||
| 17 | * Upper limit on the total number of active smb_request structs. | ||
| 18 | */ | ||
| 19 | #define MAX_REQUEST_HARD 256 | ||
| 20 | |||
| 21 | enum smb_receive_state { | ||
| 22 | SMB_RECV_START, /* No data read, looking for length + sig */ | ||
| 23 | SMB_RECV_HEADER, /* Reading the header data */ | ||
| 24 | SMB_RECV_HCOMPLETE, /* Done with the header */ | ||
| 25 | SMB_RECV_PARAM, /* Reading parameter words */ | ||
| 26 | SMB_RECV_DATA, /* Reading data bytes */ | ||
| 27 | SMB_RECV_END, /* End of request */ | ||
| 28 | SMB_RECV_DROP, /* Dropping this SMB */ | ||
| 29 | SMB_RECV_REQUEST, /* Received a request and not a reply */ | ||
| 30 | }; | ||
| 31 | |||
| 32 | /* structure access macros */ | ||
| 33 | #define server_from_inode(inode) SMB_SB((inode)->i_sb) | ||
| 34 | #define server_from_dentry(dentry) SMB_SB((dentry)->d_sb) | ||
| 35 | #define SB_of(server) ((server)->super_block) | ||
| 36 | |||
| 37 | struct smb_sb_info { | ||
| 38 | /* List of all smbfs superblocks */ | ||
| 39 | struct list_head entry; | ||
| 40 | |||
| 41 | enum smb_conn_state state; | ||
| 42 | struct file * sock_file; | ||
| 43 | int conn_error; | ||
| 44 | enum smb_receive_state rstate; | ||
| 45 | |||
| 46 | atomic_t nr_requests; | ||
| 47 | struct list_head xmitq; | ||
| 48 | struct list_head recvq; | ||
| 49 | u16 mid; | ||
| 50 | |||
| 51 | struct smb_mount_data_kernel *mnt; | ||
| 52 | |||
| 53 | /* Connections are counted. Each time a new socket arrives, | ||
| 54 | * generation is incremented. | ||
| 55 | */ | ||
| 56 | unsigned int generation; | ||
| 57 | struct pid *conn_pid; | ||
| 58 | struct smb_conn_opt opt; | ||
| 59 | wait_queue_head_t conn_wq; | ||
| 60 | int conn_complete; | ||
| 61 | struct semaphore sem; | ||
| 62 | |||
| 63 | unsigned char header[SMB_HEADER_LEN + 20*2 + 2]; | ||
| 64 | u32 header_len; | ||
| 65 | u32 smb_len; | ||
| 66 | u32 smb_read; | ||
| 67 | |||
| 68 | /* We use our own data_ready callback, but need the original one */ | ||
| 69 | void *data_ready; | ||
| 70 | |||
| 71 | /* nls pointers for codepage conversions */ | ||
| 72 | struct nls_table *remote_nls; | ||
| 73 | struct nls_table *local_nls; | ||
| 74 | |||
| 75 | struct smb_ops *ops; | ||
| 76 | |||
| 77 | struct super_block *super_block; | ||
| 78 | |||
| 79 | struct backing_dev_info bdi; | ||
| 80 | }; | ||
| 81 | |||
| 82 | static inline int | ||
| 83 | smb_lock_server_interruptible(struct smb_sb_info *server) | ||
| 84 | { | ||
| 85 | return down_interruptible(&(server->sem)); | ||
| 86 | } | ||
| 87 | |||
| 88 | static inline void | ||
| 89 | smb_lock_server(struct smb_sb_info *server) | ||
| 90 | { | ||
| 91 | down(&(server->sem)); | ||
| 92 | } | ||
| 93 | |||
| 94 | static inline void | ||
| 95 | smb_unlock_server(struct smb_sb_info *server) | ||
| 96 | { | ||
| 97 | up(&(server->sem)); | ||
| 98 | } | ||
| 99 | |||
| 100 | #endif | ||
diff --git a/include/linux/smb_mount.h b/include/linux/smb_mount.h deleted file mode 100644 index d10f00cb5703..000000000000 --- a/include/linux/smb_mount.h +++ /dev/null | |||
| @@ -1,65 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * smb_mount.h | ||
| 3 | * | ||
| 4 | * Copyright (C) 1995, 1996 by Paal-Kr. Engstad and Volker Lendecke | ||
| 5 | * Copyright (C) 1997 by Volker Lendecke | ||
| 6 | * | ||
| 7 | */ | ||
| 8 | |||
| 9 | #ifndef _LINUX_SMB_MOUNT_H | ||
| 10 | #define _LINUX_SMB_MOUNT_H | ||
| 11 | |||
| 12 | #include <linux/types.h> | ||
| 13 | |||
| 14 | #define SMB_MOUNT_VERSION 6 | ||
| 15 | |||
| 16 | struct smb_mount_data { | ||
| 17 | int version; | ||
| 18 | __kernel_uid_t mounted_uid; /* Who may umount() this filesystem? */ | ||
| 19 | __kernel_uid_t uid; | ||
| 20 | __kernel_gid_t gid; | ||
| 21 | __kernel_mode_t file_mode; | ||
| 22 | __kernel_mode_t dir_mode; | ||
| 23 | }; | ||
| 24 | |||
| 25 | |||
| 26 | #ifdef __KERNEL__ | ||
| 27 | |||
| 28 | /* "vers" in big-endian */ | ||
| 29 | #define SMB_MOUNT_ASCII 0x76657273 | ||
| 30 | |||
| 31 | #define SMB_MOUNT_OLDVERSION 6 | ||
| 32 | #undef SMB_MOUNT_VERSION | ||
| 33 | #define SMB_MOUNT_VERSION 7 | ||
| 34 | |||
| 35 | /* flags */ | ||
| 36 | #define SMB_MOUNT_WIN95 0x0001 /* Win 95 server */ | ||
| 37 | #define SMB_MOUNT_OLDATTR 0x0002 /* Use core getattr (Win 95 speedup) */ | ||
| 38 | #define SMB_MOUNT_DIRATTR 0x0004 /* Use find_first for getattr */ | ||
| 39 | #define SMB_MOUNT_CASE 0x0008 /* Be case sensitive */ | ||
| 40 | #define SMB_MOUNT_UNICODE 0x0010 /* Server talks unicode */ | ||
| 41 | #define SMB_MOUNT_UID 0x0020 /* Use user specified uid */ | ||
| 42 | #define SMB_MOUNT_GID 0x0040 /* Use user specified gid */ | ||
| 43 | #define SMB_MOUNT_FMODE 0x0080 /* Use user specified file mode */ | ||
| 44 | #define SMB_MOUNT_DMODE 0x0100 /* Use user specified dir mode */ | ||
| 45 | |||
| 46 | struct smb_mount_data_kernel { | ||
| 47 | int version; | ||
| 48 | |||
| 49 | uid_t mounted_uid; /* Who may umount() this filesystem? */ | ||
| 50 | uid_t uid; | ||
| 51 | gid_t gid; | ||
| 52 | mode_t file_mode; | ||
| 53 | mode_t dir_mode; | ||
| 54 | |||
| 55 | u32 flags; | ||
| 56 | |||
| 57 | /* maximum age in jiffies (inode, dentry and dircache) */ | ||
| 58 | int ttl; | ||
| 59 | |||
| 60 | struct smb_nls_codepage codepage; | ||
| 61 | }; | ||
| 62 | |||
| 63 | #endif | ||
| 64 | |||
| 65 | #endif | ||
diff --git a/include/linux/smbno.h b/include/linux/smbno.h deleted file mode 100644 index f99e02d9ffe2..000000000000 --- a/include/linux/smbno.h +++ /dev/null | |||
| @@ -1,363 +0,0 @@ | |||
| 1 | #ifndef _SMBNO_H_ | ||
| 2 | #define _SMBNO_H_ | ||
| 3 | |||
| 4 | /* these define the attribute byte as seen by DOS */ | ||
| 5 | #define aRONLY (1L<<0) | ||
| 6 | #define aHIDDEN (1L<<1) | ||
| 7 | #define aSYSTEM (1L<<2) | ||
| 8 | #define aVOLID (1L<<3) | ||
| 9 | #define aDIR (1L<<4) | ||
| 10 | #define aARCH (1L<<5) | ||
| 11 | |||
| 12 | /* error classes */ | ||
| 13 | #define SUCCESS 0 /* The request was successful. */ | ||
| 14 | #define ERRDOS 0x01 /* Error is from the core DOS operating system set. */ | ||
| 15 | #define ERRSRV 0x02 /* Error is generated by the server network file manager.*/ | ||
| 16 | #define ERRHRD 0x03 /* Error is an hardware error. */ | ||
| 17 | #define ERRCMD 0xFF /* Command was not in the "SMB" format. */ | ||
| 18 | |||
| 19 | /* SMB X/Open error codes for the ERRdos error class */ | ||
| 20 | |||
| 21 | #define ERRbadfunc 1 /* Invalid function (or system call) */ | ||
| 22 | #define ERRbadfile 2 /* File not found (pathname error) */ | ||
| 23 | #define ERRbadpath 3 /* Directory not found */ | ||
| 24 | #define ERRnofids 4 /* Too many open files */ | ||
| 25 | #define ERRnoaccess 5 /* Access denied */ | ||
| 26 | #define ERRbadfid 6 /* Invalid fid */ | ||
| 27 | #define ERRbadmcb 7 /* Memory control blocks destroyed */ | ||
| 28 | #define ERRnomem 8 /* Out of memory */ | ||
| 29 | #define ERRbadmem 9 /* Invalid memory block address */ | ||
| 30 | #define ERRbadenv 10 /* Invalid environment */ | ||
| 31 | #define ERRbadformat 11 /* Invalid format */ | ||
| 32 | #define ERRbadaccess 12 /* Invalid open mode */ | ||
| 33 | #define ERRbaddata 13 /* Invalid data (only from ioctl call) */ | ||
| 34 | #define ERRres 14 /* reserved */ | ||
| 35 | #define ERRbaddrive 15 /* Invalid drive */ | ||
| 36 | #define ERRremcd 16 /* Attempt to delete current directory */ | ||
| 37 | #define ERRdiffdevice 17 /* rename/move across different filesystems */ | ||
| 38 | #define ERRnofiles 18 /* no more files found in file search */ | ||
| 39 | #define ERRbadshare 32 /* Share mode on file conflict with open mode */ | ||
| 40 | #define ERRlock 33 /* Lock request conflicts with existing lock */ | ||
| 41 | #define ERRfilexists 80 /* File in operation already exists */ | ||
| 42 | #define ERRbadpipe 230 /* Named pipe invalid */ | ||
| 43 | #define ERRpipebusy 231 /* All instances of pipe are busy */ | ||
| 44 | #define ERRpipeclosing 232 /* named pipe close in progress */ | ||
| 45 | #define ERRnotconnected 233 /* No process on other end of named pipe */ | ||
| 46 | #define ERRmoredata 234 /* More data to be returned */ | ||
| 47 | |||
| 48 | #define ERROR_INVALID_PARAMETER 87 | ||
| 49 | #define ERROR_DISK_FULL 112 | ||
| 50 | #define ERROR_INVALID_NAME 123 | ||
| 51 | #define ERROR_DIR_NOT_EMPTY 145 | ||
| 52 | #define ERROR_NOT_LOCKED 158 | ||
| 53 | #define ERROR_ALREADY_EXISTS 183 /* see also 80 ? */ | ||
| 54 | #define ERROR_EAS_DIDNT_FIT 275 /* Extended attributes didn't fit */ | ||
| 55 | #define ERROR_EAS_NOT_SUPPORTED 282 /* Extended attributes not supported */ | ||
| 56 | |||
| 57 | /* Error codes for the ERRSRV class */ | ||
| 58 | |||
| 59 | #define ERRerror 1 /* Non specific error code */ | ||
| 60 | #define ERRbadpw 2 /* Bad password */ | ||
| 61 | #define ERRbadtype 3 /* reserved */ | ||
| 62 | #define ERRaccess 4 /* No permissions to do the requested operation */ | ||
| 63 | #define ERRinvnid 5 /* tid invalid */ | ||
| 64 | #define ERRinvnetname 6 /* Invalid servername */ | ||
| 65 | #define ERRinvdevice 7 /* Invalid device */ | ||
| 66 | #define ERRqfull 49 /* Print queue full */ | ||
| 67 | #define ERRqtoobig 50 /* Queued item too big */ | ||
| 68 | #define ERRinvpfid 52 /* Invalid print file in smb_fid */ | ||
| 69 | #define ERRsmbcmd 64 /* Unrecognised command */ | ||
| 70 | #define ERRsrverror 65 /* smb server internal error */ | ||
| 71 | #define ERRfilespecs 67 /* fid and pathname invalid combination */ | ||
| 72 | #define ERRbadlink 68 /* reserved */ | ||
| 73 | #define ERRbadpermits 69 /* Access specified for a file is not valid */ | ||
| 74 | #define ERRbadpid 70 /* reserved */ | ||
| 75 | #define ERRsetattrmode 71 /* attribute mode invalid */ | ||
| 76 | #define ERRpaused 81 /* Message server paused */ | ||
| 77 | #define ERRmsgoff 82 /* Not receiving messages */ | ||
| 78 | #define ERRnoroom 83 /* No room for message */ | ||
| 79 | #define ERRrmuns 87 /* too many remote usernames */ | ||
| 80 | #define ERRtimeout 88 /* operation timed out */ | ||
| 81 | #define ERRnoresource 89 /* No resources currently available for request. */ | ||
| 82 | #define ERRtoomanyuids 90 /* too many userids */ | ||
| 83 | #define ERRbaduid 91 /* bad userid */ | ||
| 84 | #define ERRuseMPX 250 /* temporarily unable to use raw mode, use MPX mode */ | ||
| 85 | #define ERRuseSTD 251 /* temporarily unable to use raw mode, use std.mode */ | ||
| 86 | #define ERRcontMPX 252 /* resume MPX mode */ | ||
| 87 | #define ERRbadPW /* reserved */ | ||
| 88 | #define ERRnosupport 0xFFFF | ||
| 89 | |||
| 90 | /* Error codes for the ERRHRD class */ | ||
| 91 | |||
| 92 | #define ERRnowrite 19 /* read only media */ | ||
| 93 | #define ERRbadunit 20 /* Unknown device */ | ||
| 94 | #define ERRnotready 21 /* Drive not ready */ | ||
| 95 | #define ERRbadcmd 22 /* Unknown command */ | ||
| 96 | #define ERRdata 23 /* Data (CRC) error */ | ||
| 97 | #define ERRbadreq 24 /* Bad request structure length */ | ||
| 98 | #define ERRseek 25 | ||
| 99 | #define ERRbadmedia 26 | ||
| 100 | #define ERRbadsector 27 | ||
| 101 | #define ERRnopaper 28 | ||
| 102 | #define ERRwrite 29 /* write fault */ | ||
| 103 | #define ERRread 30 /* read fault */ | ||
| 104 | #define ERRgeneral 31 /* General hardware failure */ | ||
| 105 | #define ERRwrongdisk 34 | ||
| 106 | #define ERRFCBunavail 35 | ||
| 107 | #define ERRsharebufexc 36 /* share buffer exceeded */ | ||
| 108 | #define ERRdiskfull 39 | ||
| 109 | |||
| 110 | /* | ||
| 111 | * Access modes when opening a file | ||
| 112 | */ | ||
| 113 | #define SMB_ACCMASK 0x0003 | ||
| 114 | #define SMB_O_RDONLY 0x0000 | ||
| 115 | #define SMB_O_WRONLY 0x0001 | ||
| 116 | #define SMB_O_RDWR 0x0002 | ||
| 117 | |||
| 118 | /* offsets into message for common items */ | ||
| 119 | #define smb_com 8 | ||
| 120 | #define smb_rcls 9 | ||
| 121 | #define smb_reh 10 | ||
| 122 | #define smb_err 11 | ||
| 123 | #define smb_flg 13 | ||
| 124 | #define smb_flg2 14 | ||
| 125 | #define smb_reb 13 | ||
| 126 | #define smb_tid 28 | ||
| 127 | #define smb_pid 30 | ||
| 128 | #define smb_uid 32 | ||
| 129 | #define smb_mid 34 | ||
| 130 | #define smb_wct 36 | ||
| 131 | #define smb_vwv 37 | ||
| 132 | #define smb_vwv0 37 | ||
| 133 | #define smb_vwv1 39 | ||
| 134 | #define smb_vwv2 41 | ||
| 135 | #define smb_vwv3 43 | ||
| 136 | #define smb_vwv4 45 | ||
| 137 | #define smb_vwv5 47 | ||
| 138 | #define smb_vwv6 49 | ||
| 139 | #define smb_vwv7 51 | ||
| 140 | #define smb_vwv8 53 | ||
| 141 | #define smb_vwv9 55 | ||
| 142 | #define smb_vwv10 57 | ||
| 143 | #define smb_vwv11 59 | ||
| 144 | #define smb_vwv12 61 | ||
| 145 | #define smb_vwv13 63 | ||
| 146 | #define smb_vwv14 65 | ||
| 147 | |||
| 148 | /* these are the trans2 sub fields for primary requests */ | ||
| 149 | #define smb_tpscnt smb_vwv0 | ||
| 150 | #define smb_tdscnt smb_vwv1 | ||
| 151 | #define smb_mprcnt smb_vwv2 | ||
| 152 | #define smb_mdrcnt smb_vwv3 | ||
| 153 | #define smb_msrcnt smb_vwv4 | ||
| 154 | #define smb_flags smb_vwv5 | ||
| 155 | #define smb_timeout smb_vwv6 | ||
| 156 | #define smb_pscnt smb_vwv9 | ||
| 157 | #define smb_psoff smb_vwv10 | ||
| 158 | #define smb_dscnt smb_vwv11 | ||
| 159 | #define smb_dsoff smb_vwv12 | ||
| 160 | #define smb_suwcnt smb_vwv13 | ||
| 161 | #define smb_setup smb_vwv14 | ||
| 162 | #define smb_setup0 smb_setup | ||
| 163 | #define smb_setup1 (smb_setup+2) | ||
| 164 | #define smb_setup2 (smb_setup+4) | ||
| 165 | |||
| 166 | /* these are for the secondary requests */ | ||
| 167 | #define smb_spscnt smb_vwv2 | ||
| 168 | #define smb_spsoff smb_vwv3 | ||
| 169 | #define smb_spsdisp smb_vwv4 | ||
| 170 | #define smb_sdscnt smb_vwv5 | ||
| 171 | #define smb_sdsoff smb_vwv6 | ||
| 172 | #define smb_sdsdisp smb_vwv7 | ||
| 173 | #define smb_sfid smb_vwv8 | ||
| 174 | |||
| 175 | /* and these for responses */ | ||
| 176 | #define smb_tprcnt smb_vwv0 | ||
| 177 | #define smb_tdrcnt smb_vwv1 | ||
| 178 | #define smb_prcnt smb_vwv3 | ||
| 179 | #define smb_proff smb_vwv4 | ||
| 180 | #define smb_prdisp smb_vwv5 | ||
| 181 | #define smb_drcnt smb_vwv6 | ||
| 182 | #define smb_droff smb_vwv7 | ||
| 183 | #define smb_drdisp smb_vwv8 | ||
| 184 | |||
| 185 | /* the complete */ | ||
| 186 | #define SMBmkdir 0x00 /* create directory */ | ||
| 187 | #define SMBrmdir 0x01 /* delete directory */ | ||
| 188 | #define SMBopen 0x02 /* open file */ | ||
| 189 | #define SMBcreate 0x03 /* create file */ | ||
| 190 | #define SMBclose 0x04 /* close file */ | ||
| 191 | #define SMBflush 0x05 /* flush file */ | ||
| 192 | #define SMBunlink 0x06 /* delete file */ | ||
| 193 | #define SMBmv 0x07 /* rename file */ | ||
| 194 | #define SMBgetatr 0x08 /* get file attributes */ | ||
| 195 | #define SMBsetatr 0x09 /* set file attributes */ | ||
| 196 | #define SMBread 0x0A /* read from file */ | ||
| 197 | #define SMBwrite 0x0B /* write to file */ | ||
| 198 | #define SMBlock 0x0C /* lock byte range */ | ||
| 199 | #define SMBunlock 0x0D /* unlock byte range */ | ||
| 200 | #define SMBctemp 0x0E /* create temporary file */ | ||
| 201 | #define SMBmknew 0x0F /* make new file */ | ||
| 202 | #define SMBchkpth 0x10 /* check directory path */ | ||
| 203 | #define SMBexit 0x11 /* process exit */ | ||
| 204 | #define SMBlseek 0x12 /* seek */ | ||
| 205 | #define SMBtcon 0x70 /* tree connect */ | ||
| 206 | #define SMBtconX 0x75 /* tree connect and X*/ | ||
| 207 | #define SMBtdis 0x71 /* tree disconnect */ | ||
| 208 | #define SMBnegprot 0x72 /* negotiate protocol */ | ||
| 209 | #define SMBdskattr 0x80 /* get disk attributes */ | ||
| 210 | #define SMBsearch 0x81 /* search directory */ | ||
| 211 | #define SMBsplopen 0xC0 /* open print spool file */ | ||
| 212 | #define SMBsplwr 0xC1 /* write to print spool file */ | ||
| 213 | #define SMBsplclose 0xC2 /* close print spool file */ | ||
| 214 | #define SMBsplretq 0xC3 /* return print queue */ | ||
| 215 | #define SMBsends 0xD0 /* send single block message */ | ||
| 216 | #define SMBsendb 0xD1 /* send broadcast message */ | ||
| 217 | #define SMBfwdname 0xD2 /* forward user name */ | ||
| 218 | #define SMBcancelf 0xD3 /* cancel forward */ | ||
| 219 | #define SMBgetmac 0xD4 /* get machine name */ | ||
| 220 | #define SMBsendstrt 0xD5 /* send start of multi-block message */ | ||
| 221 | #define SMBsendend 0xD6 /* send end of multi-block message */ | ||
| 222 | #define SMBsendtxt 0xD7 /* send text of multi-block message */ | ||
| 223 | |||
| 224 | /* Core+ protocol */ | ||
| 225 | #define SMBlockread 0x13 /* Lock a range and read */ | ||
| 226 | #define SMBwriteunlock 0x14 /* Unlock a range then write */ | ||
| 227 | #define SMBreadbraw 0x1a /* read a block of data with no smb header */ | ||
| 228 | #define SMBwritebraw 0x1d /* write a block of data with no smb header */ | ||
| 229 | #define SMBwritec 0x20 /* secondary write request */ | ||
| 230 | #define SMBwriteclose 0x2c /* write a file then close it */ | ||
| 231 | |||
| 232 | /* dos extended protocol */ | ||
| 233 | #define SMBreadBraw 0x1A /* read block raw */ | ||
| 234 | #define SMBreadBmpx 0x1B /* read block multiplexed */ | ||
| 235 | #define SMBreadBs 0x1C /* read block (secondary response) */ | ||
| 236 | #define SMBwriteBraw 0x1D /* write block raw */ | ||
| 237 | #define SMBwriteBmpx 0x1E /* write block multiplexed */ | ||
| 238 | #define SMBwriteBs 0x1F /* write block (secondary request) */ | ||
| 239 | #define SMBwriteC 0x20 /* write complete response */ | ||
| 240 | #define SMBsetattrE 0x22 /* set file attributes expanded */ | ||
| 241 | #define SMBgetattrE 0x23 /* get file attributes expanded */ | ||
| 242 | #define SMBlockingX 0x24 /* lock/unlock byte ranges and X */ | ||
| 243 | #define SMBtrans 0x25 /* transaction - name, bytes in/out */ | ||
| 244 | #define SMBtranss 0x26 /* transaction (secondary request/response) */ | ||
| 245 | #define SMBioctl 0x27 /* IOCTL */ | ||
| 246 | #define SMBioctls 0x28 /* IOCTL (secondary request/response) */ | ||
| 247 | #define SMBcopy 0x29 /* copy */ | ||
| 248 | #define SMBmove 0x2A /* move */ | ||
| 249 | #define SMBecho 0x2B /* echo */ | ||
| 250 | #define SMBopenX 0x2D /* open and X */ | ||
| 251 | #define SMBreadX 0x2E /* read and X */ | ||
| 252 | #define SMBwriteX 0x2F /* write and X */ | ||
| 253 | #define SMBsesssetupX 0x73 /* Session Set Up & X (including User Logon) */ | ||
| 254 | #define SMBtconX 0x75 /* tree connect and X */ | ||
| 255 | #define SMBffirst 0x82 /* find first */ | ||
| 256 | #define SMBfunique 0x83 /* find unique */ | ||
| 257 | #define SMBfclose 0x84 /* find close */ | ||
| 258 | #define SMBinvalid 0xFE /* invalid command */ | ||
| 259 | |||
| 260 | |||
| 261 | /* Extended 2.0 protocol */ | ||
| 262 | #define SMBtrans2 0x32 /* TRANS2 protocol set */ | ||
| 263 | #define SMBtranss2 0x33 /* TRANS2 protocol set, secondary command */ | ||
| 264 | #define SMBfindclose 0x34 /* Terminate a TRANSACT2_FINDFIRST */ | ||
| 265 | #define SMBfindnclose 0x35 /* Terminate a TRANSACT2_FINDNOTIFYFIRST */ | ||
| 266 | #define SMBulogoffX 0x74 /* user logoff */ | ||
| 267 | |||
| 268 | /* these are the TRANS2 sub commands */ | ||
| 269 | #define TRANSACT2_OPEN 0 | ||
| 270 | #define TRANSACT2_FINDFIRST 1 | ||
| 271 | #define TRANSACT2_FINDNEXT 2 | ||
| 272 | #define TRANSACT2_QFSINFO 3 | ||
| 273 | #define TRANSACT2_SETFSINFO 4 | ||
| 274 | #define TRANSACT2_QPATHINFO 5 | ||
| 275 | #define TRANSACT2_SETPATHINFO 6 | ||
| 276 | #define TRANSACT2_QFILEINFO 7 | ||
| 277 | #define TRANSACT2_SETFILEINFO 8 | ||
| 278 | #define TRANSACT2_FSCTL 9 | ||
| 279 | #define TRANSACT2_IOCTL 10 | ||
| 280 | #define TRANSACT2_FINDNOTIFYFIRST 11 | ||
| 281 | #define TRANSACT2_FINDNOTIFYNEXT 12 | ||
| 282 | #define TRANSACT2_MKDIR 13 | ||
| 283 | |||
| 284 | /* Information Levels - Shared? */ | ||
| 285 | #define SMB_INFO_STANDARD 1 | ||
| 286 | #define SMB_INFO_QUERY_EA_SIZE 2 | ||
| 287 | #define SMB_INFO_QUERY_EAS_FROM_LIST 3 | ||
| 288 | #define SMB_INFO_QUERY_ALL_EAS 4 | ||
| 289 | #define SMB_INFO_IS_NAME_VALID 6 | ||
| 290 | |||
| 291 | /* Information Levels - TRANSACT2_FINDFIRST */ | ||
| 292 | #define SMB_FIND_FILE_DIRECTORY_INFO 0x101 | ||
| 293 | #define SMB_FIND_FILE_FULL_DIRECTORY_INFO 0x102 | ||
| 294 | #define SMB_FIND_FILE_NAMES_INFO 0x103 | ||
| 295 | #define SMB_FIND_FILE_BOTH_DIRECTORY_INFO 0x104 | ||
| 296 | |||
| 297 | /* Information Levels - TRANSACT2_QPATHINFO */ | ||
| 298 | #define SMB_QUERY_FILE_BASIC_INFO 0x101 | ||
| 299 | #define SMB_QUERY_FILE_STANDARD_INFO 0x102 | ||
| 300 | #define SMB_QUERY_FILE_EA_INFO 0x103 | ||
| 301 | #define SMB_QUERY_FILE_NAME_INFO 0x104 | ||
| 302 | #define SMB_QUERY_FILE_ALL_INFO 0x107 | ||
| 303 | #define SMB_QUERY_FILE_ALT_NAME_INFO 0x108 | ||
| 304 | #define SMB_QUERY_FILE_STREAM_INFO 0x109 | ||
| 305 | #define SMB_QUERY_FILE_COMPRESSION_INFO 0x10b | ||
| 306 | |||
| 307 | /* Information Levels - TRANSACT2_SETFILEINFO */ | ||
| 308 | #define SMB_SET_FILE_BASIC_INFO 0x101 | ||
| 309 | #define SMB_SET_FILE_DISPOSITION_INFO 0x102 | ||
| 310 | #define SMB_SET_FILE_ALLOCATION_INFO 0x103 | ||
| 311 | #define SMB_SET_FILE_END_OF_FILE_INFO 0x104 | ||
| 312 | |||
| 313 | /* smb_flg field flags */ | ||
| 314 | #define SMB_FLAGS_SUPPORT_LOCKREAD 0x01 | ||
| 315 | #define SMB_FLAGS_CLIENT_BUF_AVAIL 0x02 | ||
| 316 | #define SMB_FLAGS_RESERVED 0x04 | ||
| 317 | #define SMB_FLAGS_CASELESS_PATHNAMES 0x08 | ||
| 318 | #define SMB_FLAGS_CANONICAL_PATHNAMES 0x10 | ||
| 319 | #define SMB_FLAGS_REQUEST_OPLOCK 0x20 | ||
| 320 | #define SMB_FLAGS_REQUEST_BATCH_OPLOCK 0x40 | ||
| 321 | #define SMB_FLAGS_REPLY 0x80 | ||
| 322 | |||
| 323 | /* smb_flg2 field flags (samba-2.2.0/source/include/smb.h) */ | ||
| 324 | #define SMB_FLAGS2_LONG_PATH_COMPONENTS 0x0001 | ||
| 325 | #define SMB_FLAGS2_EXTENDED_ATTRIBUTES 0x0002 | ||
| 326 | #define SMB_FLAGS2_DFS_PATHNAMES 0x1000 | ||
| 327 | #define SMB_FLAGS2_READ_PERMIT_NO_EXECUTE 0x2000 | ||
| 328 | #define SMB_FLAGS2_32_BIT_ERROR_CODES 0x4000 | ||
| 329 | #define SMB_FLAGS2_UNICODE_STRINGS 0x8000 | ||
| 330 | |||
| 331 | |||
| 332 | /* | ||
| 333 | * UNIX stuff (from samba trans2.h) | ||
| 334 | */ | ||
| 335 | #define MIN_UNIX_INFO_LEVEL 0x200 | ||
| 336 | #define MAX_UNIX_INFO_LEVEL 0x2FF | ||
| 337 | #define SMB_FIND_FILE_UNIX 0x202 | ||
| 338 | #define SMB_QUERY_FILE_UNIX_BASIC 0x200 | ||
| 339 | #define SMB_QUERY_FILE_UNIX_LINK 0x201 | ||
| 340 | #define SMB_QUERY_FILE_UNIX_HLINK 0x202 | ||
| 341 | #define SMB_SET_FILE_UNIX_BASIC 0x200 | ||
| 342 | #define SMB_SET_FILE_UNIX_LINK 0x201 | ||
| 343 | #define SMB_SET_FILE_UNIX_HLINK 0x203 | ||
| 344 | #define SMB_QUERY_CIFS_UNIX_INFO 0x200 | ||
| 345 | |||
| 346 | /* values which means "don't change it" */ | ||
| 347 | #define SMB_MODE_NO_CHANGE 0xFFFFFFFF | ||
| 348 | #define SMB_UID_NO_CHANGE 0xFFFFFFFF | ||
| 349 | #define SMB_GID_NO_CHANGE 0xFFFFFFFF | ||
| 350 | #define SMB_TIME_NO_CHANGE 0xFFFFFFFFFFFFFFFFULL | ||
| 351 | #define SMB_SIZE_NO_CHANGE 0xFFFFFFFFFFFFFFFFULL | ||
| 352 | |||
| 353 | /* UNIX filetype mappings. */ | ||
| 354 | #define UNIX_TYPE_FILE 0 | ||
| 355 | #define UNIX_TYPE_DIR 1 | ||
| 356 | #define UNIX_TYPE_SYMLINK 2 | ||
| 357 | #define UNIX_TYPE_CHARDEV 3 | ||
| 358 | #define UNIX_TYPE_BLKDEV 4 | ||
| 359 | #define UNIX_TYPE_FIFO 5 | ||
| 360 | #define UNIX_TYPE_SOCKET 6 | ||
| 361 | #define UNIX_TYPE_UNKNOWN 0xFFFFFFFF | ||
| 362 | |||
| 363 | #endif /* _SMBNO_H_ */ | ||
diff --git a/include/linux/smp.h b/include/linux/smp.h index cfa2d20e35f1..6dc95cac6b3d 100644 --- a/include/linux/smp.h +++ b/include/linux/smp.h | |||
| @@ -13,9 +13,10 @@ | |||
| 13 | 13 | ||
| 14 | extern void cpu_idle(void); | 14 | extern void cpu_idle(void); |
| 15 | 15 | ||
| 16 | typedef void (*smp_call_func_t)(void *info); | ||
| 16 | struct call_single_data { | 17 | struct call_single_data { |
| 17 | struct list_head list; | 18 | struct list_head list; |
| 18 | void (*func) (void *info); | 19 | smp_call_func_t func; |
| 19 | void *info; | 20 | void *info; |
| 20 | u16 flags; | 21 | u16 flags; |
| 21 | u16 priv; | 22 | u16 priv; |
| @@ -24,8 +25,8 @@ struct call_single_data { | |||
| 24 | /* total number of cpus in this system (may exceed NR_CPUS) */ | 25 | /* total number of cpus in this system (may exceed NR_CPUS) */ |
| 25 | extern unsigned int total_cpus; | 26 | extern unsigned int total_cpus; |
| 26 | 27 | ||
| 27 | int smp_call_function_single(int cpuid, void (*func) (void *info), void *info, | 28 | int smp_call_function_single(int cpuid, smp_call_func_t func, void *info, |
| 28 | int wait); | 29 | int wait); |
| 29 | 30 | ||
| 30 | #ifdef CONFIG_SMP | 31 | #ifdef CONFIG_SMP |
| 31 | 32 | ||
| @@ -69,15 +70,15 @@ extern void smp_cpus_done(unsigned int max_cpus); | |||
| 69 | /* | 70 | /* |
| 70 | * Call a function on all other processors | 71 | * Call a function on all other processors |
| 71 | */ | 72 | */ |
| 72 | int smp_call_function(void(*func)(void *info), void *info, int wait); | 73 | int smp_call_function(smp_call_func_t func, void *info, int wait); |
| 73 | void smp_call_function_many(const struct cpumask *mask, | 74 | void smp_call_function_many(const struct cpumask *mask, |
| 74 | void (*func)(void *info), void *info, bool wait); | 75 | smp_call_func_t func, void *info, bool wait); |
| 75 | 76 | ||
| 76 | void __smp_call_function_single(int cpuid, struct call_single_data *data, | 77 | void __smp_call_function_single(int cpuid, struct call_single_data *data, |
| 77 | int wait); | 78 | int wait); |
| 78 | 79 | ||
| 79 | int smp_call_function_any(const struct cpumask *mask, | 80 | int smp_call_function_any(const struct cpumask *mask, |
| 80 | void (*func)(void *info), void *info, int wait); | 81 | smp_call_func_t func, void *info, int wait); |
| 81 | 82 | ||
| 82 | /* | 83 | /* |
| 83 | * Generic and arch helpers | 84 | * Generic and arch helpers |
| @@ -94,7 +95,7 @@ void ipi_call_unlock_irq(void); | |||
| 94 | /* | 95 | /* |
| 95 | * Call a function on all processors | 96 | * Call a function on all processors |
| 96 | */ | 97 | */ |
| 97 | int on_each_cpu(void (*func) (void *info), void *info, int wait); | 98 | int on_each_cpu(smp_call_func_t func, void *info, int wait); |
| 98 | 99 | ||
| 99 | #define MSG_ALL_BUT_SELF 0x8000 /* Assume <32768 CPU's */ | 100 | #define MSG_ALL_BUT_SELF 0x8000 /* Assume <32768 CPU's */ |
| 100 | #define MSG_ALL 0x8001 | 101 | #define MSG_ALL 0x8001 |
| @@ -122,7 +123,7 @@ static inline void smp_send_stop(void) { } | |||
| 122 | * These macros fold the SMP functionality into a single CPU system | 123 | * These macros fold the SMP functionality into a single CPU system |
| 123 | */ | 124 | */ |
| 124 | #define raw_smp_processor_id() 0 | 125 | #define raw_smp_processor_id() 0 |
| 125 | static inline int up_smp_call_function(void (*func)(void *), void *info) | 126 | static inline int up_smp_call_function(smp_call_func_t func, void *info) |
| 126 | { | 127 | { |
| 127 | return 0; | 128 | return 0; |
| 128 | } | 129 | } |
| @@ -143,7 +144,7 @@ static inline void smp_send_reschedule(int cpu) { } | |||
| 143 | static inline void init_call_single_data(void) { } | 144 | static inline void init_call_single_data(void) { } |
| 144 | 145 | ||
| 145 | static inline int | 146 | static inline int |
| 146 | smp_call_function_any(const struct cpumask *mask, void (*func)(void *info), | 147 | smp_call_function_any(const struct cpumask *mask, smp_call_func_t func, |
| 147 | void *info, int wait) | 148 | void *info, int wait) |
| 148 | { | 149 | { |
| 149 | return smp_call_function_single(0, func, info, wait); | 150 | return smp_call_function_single(0, func, info, wait); |
diff --git a/include/linux/smp_lock.h b/include/linux/smp_lock.h index 2ea1dd1ba21c..291f721144c2 100644 --- a/include/linux/smp_lock.h +++ b/include/linux/smp_lock.h | |||
| @@ -54,12 +54,15 @@ static inline void cycle_kernel_lock(void) | |||
| 54 | 54 | ||
| 55 | #else | 55 | #else |
| 56 | 56 | ||
| 57 | #ifdef CONFIG_BKL /* provoke build bug if not set */ | ||
| 57 | #define lock_kernel() | 58 | #define lock_kernel() |
| 58 | #define unlock_kernel() | 59 | #define unlock_kernel() |
| 59 | #define release_kernel_lock(task) do { } while(0) | ||
| 60 | #define cycle_kernel_lock() do { } while(0) | 60 | #define cycle_kernel_lock() do { } while(0) |
| 61 | #define reacquire_kernel_lock(task) 0 | ||
| 62 | #define kernel_locked() 1 | 61 | #define kernel_locked() 1 |
| 62 | #endif /* CONFIG_BKL */ | ||
| 63 | |||
| 64 | #define release_kernel_lock(task) do { } while(0) | ||
| 65 | #define reacquire_kernel_lock(task) 0 | ||
| 63 | 66 | ||
| 64 | #endif /* CONFIG_LOCK_KERNEL */ | 67 | #endif /* CONFIG_LOCK_KERNEL */ |
| 65 | #endif /* __LINUX_SMPLOCK_H */ | 68 | #endif /* __LINUX_SMPLOCK_H */ |
diff --git a/include/linux/snmp.h b/include/linux/snmp.h index 52797714ade7..ebb0c80ffd6e 100644 --- a/include/linux/snmp.h +++ b/include/linux/snmp.h | |||
| @@ -229,6 +229,7 @@ enum | |||
| 229 | LINUX_MIB_TCPBACKLOGDROP, | 229 | LINUX_MIB_TCPBACKLOGDROP, |
| 230 | LINUX_MIB_TCPMINTTLDROP, /* RFC 5082 */ | 230 | LINUX_MIB_TCPMINTTLDROP, /* RFC 5082 */ |
| 231 | LINUX_MIB_TCPDEFERACCEPTDROP, | 231 | LINUX_MIB_TCPDEFERACCEPTDROP, |
| 232 | LINUX_MIB_IPRPFILTER, /* IP Reverse Path Filter (rp_filter) */ | ||
| 232 | __LINUX_MIB_MAX | 233 | __LINUX_MIB_MAX |
| 233 | }; | 234 | }; |
| 234 | 235 | ||
diff --git a/include/linux/socket.h b/include/linux/socket.h index 032a19eb61b1..5146b50202ce 100644 --- a/include/linux/socket.h +++ b/include/linux/socket.h | |||
| @@ -24,6 +24,9 @@ struct __kernel_sockaddr_storage { | |||
| 24 | #include <linux/types.h> /* pid_t */ | 24 | #include <linux/types.h> /* pid_t */ |
| 25 | #include <linux/compiler.h> /* __user */ | 25 | #include <linux/compiler.h> /* __user */ |
| 26 | 26 | ||
| 27 | struct pid; | ||
| 28 | struct cred; | ||
| 29 | |||
| 27 | #define __sockaddr_check_size(size) \ | 30 | #define __sockaddr_check_size(size) \ |
| 28 | BUILD_BUG_ON(((size) > sizeof(struct __kernel_sockaddr_storage))) | 31 | BUILD_BUG_ON(((size) > sizeof(struct __kernel_sockaddr_storage))) |
| 29 | 32 | ||
| @@ -309,6 +312,8 @@ struct ucred { | |||
| 309 | #define IPX_TYPE 1 | 312 | #define IPX_TYPE 1 |
| 310 | 313 | ||
| 311 | #ifdef __KERNEL__ | 314 | #ifdef __KERNEL__ |
| 315 | extern void cred_to_ucred(struct pid *pid, const struct cred *cred, struct ucred *ucred); | ||
| 316 | |||
| 312 | extern int memcpy_fromiovec(unsigned char *kdata, struct iovec *iov, int len); | 317 | extern int memcpy_fromiovec(unsigned char *kdata, struct iovec *iov, int len); |
| 313 | extern int memcpy_fromiovecend(unsigned char *kdata, const struct iovec *iov, | 318 | extern int memcpy_fromiovecend(unsigned char *kdata, const struct iovec *iov, |
| 314 | int offset, int len); | 319 | int offset, int len); |
| @@ -317,11 +322,10 @@ extern int csum_partial_copy_fromiovecend(unsigned char *kdata, | |||
| 317 | int offset, | 322 | int offset, |
| 318 | unsigned int len, __wsum *csump); | 323 | unsigned int len, __wsum *csump); |
| 319 | 324 | ||
| 320 | extern int verify_iovec(struct msghdr *m, struct iovec *iov, struct sockaddr *address, int mode); | 325 | extern long verify_iovec(struct msghdr *m, struct iovec *iov, struct sockaddr *address, int mode); |
| 321 | extern int memcpy_toiovec(struct iovec *v, unsigned char *kdata, int len); | 326 | extern int memcpy_toiovec(struct iovec *v, unsigned char *kdata, int len); |
| 322 | extern int memcpy_toiovecend(const struct iovec *v, unsigned char *kdata, | 327 | extern int memcpy_toiovecend(const struct iovec *v, unsigned char *kdata, |
| 323 | int offset, int len); | 328 | int offset, int len); |
| 324 | extern int move_addr_to_user(struct sockaddr *kaddr, int klen, void __user *uaddr, int __user *ulen); | ||
| 325 | extern int move_addr_to_kernel(void __user *uaddr, int ulen, struct sockaddr *kaddr); | 329 | extern int move_addr_to_kernel(void __user *uaddr, int ulen, struct sockaddr *kaddr); |
| 326 | extern int put_cmsg(struct msghdr*, int level, int type, int len, void *data); | 330 | extern int put_cmsg(struct msghdr*, int level, int type, int len, void *data); |
| 327 | 331 | ||
diff --git a/include/linux/spi/74x164.h b/include/linux/spi/74x164.h new file mode 100644 index 000000000000..d85c52f294a0 --- /dev/null +++ b/include/linux/spi/74x164.h | |||
| @@ -0,0 +1,11 @@ | |||
| 1 | #ifndef LINUX_SPI_74X164_H | ||
| 2 | #define LINUX_SPI_74X164_H | ||
| 3 | |||
| 4 | #define GEN_74X164_DRIVER_NAME "74x164" | ||
| 5 | |||
| 6 | struct gen_74x164_chip_platform_data { | ||
| 7 | /* number assigned to the first GPIO */ | ||
| 8 | unsigned base; | ||
| 9 | }; | ||
| 10 | |||
| 11 | #endif | ||
diff --git a/include/linux/spi/ads7846.h b/include/linux/spi/ads7846.h index b4ae570d3c98..92bd0839d5b4 100644 --- a/include/linux/spi/ads7846.h +++ b/include/linux/spi/ads7846.h | |||
| @@ -48,11 +48,12 @@ struct ads7846_platform_data { | |||
| 48 | * state if get_pendown_state == NULL | 48 | * state if get_pendown_state == NULL |
| 49 | */ | 49 | */ |
| 50 | int (*get_pendown_state)(void); | 50 | int (*get_pendown_state)(void); |
| 51 | int (*filter_init) (struct ads7846_platform_data *pdata, | 51 | int (*filter_init) (const struct ads7846_platform_data *pdata, |
| 52 | void **filter_data); | 52 | void **filter_data); |
| 53 | int (*filter) (void *filter_data, int data_idx, int *val); | 53 | int (*filter) (void *filter_data, int data_idx, int *val); |
| 54 | void (*filter_cleanup)(void *filter_data); | 54 | void (*filter_cleanup)(void *filter_data); |
| 55 | void (*wait_for_sync)(void); | 55 | void (*wait_for_sync)(void); |
| 56 | bool wakeup; | 56 | bool wakeup; |
| 57 | unsigned long irq_flags; | ||
| 57 | }; | 58 | }; |
| 58 | 59 | ||
diff --git a/include/linux/spi/dw_spi.h b/include/linux/spi/dw_spi.h index cc813f95a2f2..c91302f3a257 100644 --- a/include/linux/spi/dw_spi.h +++ b/include/linux/spi/dw_spi.h | |||
| @@ -14,7 +14,9 @@ | |||
| 14 | #define SPI_MODE_OFFSET 6 | 14 | #define SPI_MODE_OFFSET 6 |
| 15 | #define SPI_SCPH_OFFSET 6 | 15 | #define SPI_SCPH_OFFSET 6 |
| 16 | #define SPI_SCOL_OFFSET 7 | 16 | #define SPI_SCOL_OFFSET 7 |
| 17 | |||
| 17 | #define SPI_TMOD_OFFSET 8 | 18 | #define SPI_TMOD_OFFSET 8 |
| 19 | #define SPI_TMOD_MASK (0x3 << SPI_TMOD_OFFSET) | ||
| 18 | #define SPI_TMOD_TR 0x0 /* xmit & recv */ | 20 | #define SPI_TMOD_TR 0x0 /* xmit & recv */ |
| 19 | #define SPI_TMOD_TO 0x1 /* xmit only */ | 21 | #define SPI_TMOD_TO 0x1 /* xmit only */ |
| 20 | #define SPI_TMOD_RO 0x2 /* recv only */ | 22 | #define SPI_TMOD_RO 0x2 /* recv only */ |
diff --git a/include/linux/spi/max7301.h b/include/linux/spi/max7301.h index 34af0a3477bf..bcaa2f762cc1 100644 --- a/include/linux/spi/max7301.h +++ b/include/linux/spi/max7301.h | |||
| @@ -11,6 +11,7 @@ struct max7301 { | |||
| 11 | struct mutex lock; | 11 | struct mutex lock; |
| 12 | u8 port_config[8]; /* field 0 is unused */ | 12 | u8 port_config[8]; /* field 0 is unused */ |
| 13 | u32 out_level; /* cached output levels */ | 13 | u32 out_level; /* cached output levels */ |
| 14 | u32 input_pullup_active; | ||
| 14 | struct gpio_chip chip; | 15 | struct gpio_chip chip; |
| 15 | struct device *dev; | 16 | struct device *dev; |
| 16 | int (*write)(struct device *dev, unsigned int reg, unsigned int val); | 17 | int (*write)(struct device *dev, unsigned int reg, unsigned int val); |
| @@ -20,6 +21,13 @@ struct max7301 { | |||
| 20 | struct max7301_platform_data { | 21 | struct max7301_platform_data { |
| 21 | /* number assigned to the first GPIO */ | 22 | /* number assigned to the first GPIO */ |
| 22 | unsigned base; | 23 | unsigned base; |
| 24 | /* | ||
| 25 | * bitmask controlling the pullup configuration, | ||
| 26 | * | ||
| 27 | * _note_ the 4 lowest bits are unused, because the first 4 | ||
| 28 | * ports of the controller are not used, too. | ||
| 29 | */ | ||
| 30 | u32 input_pullup_active; | ||
| 23 | }; | 31 | }; |
| 24 | 32 | ||
| 25 | extern int __max730x_remove(struct device *dev); | 33 | extern int __max730x_remove(struct device *dev); |
diff --git a/include/linux/spi/spi.h b/include/linux/spi/spi.h index af56071b06f9..92e52a1e6af3 100644 --- a/include/linux/spi/spi.h +++ b/include/linux/spi/spi.h | |||
| @@ -213,6 +213,9 @@ static inline void spi_unregister_driver(struct spi_driver *sdrv) | |||
| 213 | * @dma_alignment: SPI controller constraint on DMA buffers alignment. | 213 | * @dma_alignment: SPI controller constraint on DMA buffers alignment. |
| 214 | * @mode_bits: flags understood by this controller driver | 214 | * @mode_bits: flags understood by this controller driver |
| 215 | * @flags: other constraints relevant to this driver | 215 | * @flags: other constraints relevant to this driver |
| 216 | * @bus_lock_spinlock: spinlock for SPI bus locking | ||
| 217 | * @bus_lock_mutex: mutex for SPI bus locking | ||
| 218 | * @bus_lock_flag: indicates that the SPI bus is locked for exclusive use | ||
| 216 | * @setup: updates the device mode and clocking records used by a | 219 | * @setup: updates the device mode and clocking records used by a |
| 217 | * device's SPI controller; protocol code may call this. This | 220 | * device's SPI controller; protocol code may call this. This |
| 218 | * must fail if an unrecognized or unsupported mode is requested. | 221 | * must fail if an unrecognized or unsupported mode is requested. |
| @@ -262,6 +265,13 @@ struct spi_master { | |||
| 262 | #define SPI_MASTER_NO_RX BIT(1) /* can't do buffer read */ | 265 | #define SPI_MASTER_NO_RX BIT(1) /* can't do buffer read */ |
| 263 | #define SPI_MASTER_NO_TX BIT(2) /* can't do buffer write */ | 266 | #define SPI_MASTER_NO_TX BIT(2) /* can't do buffer write */ |
| 264 | 267 | ||
| 268 | /* lock and mutex for SPI bus locking */ | ||
| 269 | spinlock_t bus_lock_spinlock; | ||
| 270 | struct mutex bus_lock_mutex; | ||
| 271 | |||
| 272 | /* flag indicating that the SPI bus is locked for exclusive use */ | ||
| 273 | bool bus_lock_flag; | ||
| 274 | |||
| 265 | /* Setup mode and clock, etc (spi driver may call many times). | 275 | /* Setup mode and clock, etc (spi driver may call many times). |
| 266 | * | 276 | * |
| 267 | * IMPORTANT: this may be called when transfers to another | 277 | * IMPORTANT: this may be called when transfers to another |
| @@ -542,6 +552,8 @@ static inline void spi_message_free(struct spi_message *m) | |||
| 542 | 552 | ||
| 543 | extern int spi_setup(struct spi_device *spi); | 553 | extern int spi_setup(struct spi_device *spi); |
| 544 | extern int spi_async(struct spi_device *spi, struct spi_message *message); | 554 | extern int spi_async(struct spi_device *spi, struct spi_message *message); |
| 555 | extern int spi_async_locked(struct spi_device *spi, | ||
| 556 | struct spi_message *message); | ||
| 545 | 557 | ||
| 546 | /*---------------------------------------------------------------------------*/ | 558 | /*---------------------------------------------------------------------------*/ |
| 547 | 559 | ||
| @@ -551,6 +563,9 @@ extern int spi_async(struct spi_device *spi, struct spi_message *message); | |||
| 551 | */ | 563 | */ |
| 552 | 564 | ||
| 553 | extern int spi_sync(struct spi_device *spi, struct spi_message *message); | 565 | extern int spi_sync(struct spi_device *spi, struct spi_message *message); |
| 566 | extern int spi_sync_locked(struct spi_device *spi, struct spi_message *message); | ||
| 567 | extern int spi_bus_lock(struct spi_master *master); | ||
| 568 | extern int spi_bus_unlock(struct spi_master *master); | ||
| 554 | 569 | ||
| 555 | /** | 570 | /** |
| 556 | * spi_write - SPI synchronous write | 571 | * spi_write - SPI synchronous write |
diff --git a/include/linux/spi/spi_gpio.h b/include/linux/spi/spi_gpio.h index ca6782ee4b9f..369b3d7d5b95 100644 --- a/include/linux/spi/spi_gpio.h +++ b/include/linux/spi/spi_gpio.h | |||
| @@ -29,11 +29,16 @@ | |||
| 29 | * SPI_GPIO_NO_CHIPSELECT to the controller_data: | 29 | * SPI_GPIO_NO_CHIPSELECT to the controller_data: |
| 30 | * .controller_data = (void *) SPI_GPIO_NO_CHIPSELECT; | 30 | * .controller_data = (void *) SPI_GPIO_NO_CHIPSELECT; |
| 31 | * | 31 | * |
| 32 | * If the MISO or MOSI pin is not available then it should be set to | ||
| 33 | * SPI_GPIO_NO_MISO or SPI_GPIO_NO_MOSI. | ||
| 34 | * | ||
| 32 | * If the bitbanged bus is later switched to a "native" controller, | 35 | * If the bitbanged bus is later switched to a "native" controller, |
| 33 | * that platform_device and controller_data should be removed. | 36 | * that platform_device and controller_data should be removed. |
| 34 | */ | 37 | */ |
| 35 | 38 | ||
| 36 | #define SPI_GPIO_NO_CHIPSELECT ((unsigned long)-1l) | 39 | #define SPI_GPIO_NO_CHIPSELECT ((unsigned long)-1l) |
| 40 | #define SPI_GPIO_NO_MISO ((unsigned long)-1l) | ||
| 41 | #define SPI_GPIO_NO_MOSI ((unsigned long)-1l) | ||
| 37 | 42 | ||
| 38 | /** | 43 | /** |
| 39 | * struct spi_gpio_platform_data - parameter for bitbanged SPI master | 44 | * struct spi_gpio_platform_data - parameter for bitbanged SPI master |
diff --git a/include/linux/spinlock.h b/include/linux/spinlock.h index f8854655860e..80e535897de6 100644 --- a/include/linux/spinlock.h +++ b/include/linux/spinlock.h | |||
| @@ -50,6 +50,7 @@ | |||
| 50 | #include <linux/preempt.h> | 50 | #include <linux/preempt.h> |
| 51 | #include <linux/linkage.h> | 51 | #include <linux/linkage.h> |
| 52 | #include <linux/compiler.h> | 52 | #include <linux/compiler.h> |
| 53 | #include <linux/irqflags.h> | ||
| 53 | #include <linux/thread_info.h> | 54 | #include <linux/thread_info.h> |
| 54 | #include <linux/kernel.h> | 55 | #include <linux/kernel.h> |
| 55 | #include <linux/stringify.h> | 56 | #include <linux/stringify.h> |
diff --git a/include/linux/srcu.h b/include/linux/srcu.h index 4d5d2f546dbf..58971e891f48 100644 --- a/include/linux/srcu.h +++ b/include/linux/srcu.h | |||
| @@ -108,19 +108,43 @@ static inline int srcu_read_lock_held(struct srcu_struct *sp) | |||
| 108 | #endif /* #else #ifdef CONFIG_DEBUG_LOCK_ALLOC */ | 108 | #endif /* #else #ifdef CONFIG_DEBUG_LOCK_ALLOC */ |
| 109 | 109 | ||
| 110 | /** | 110 | /** |
| 111 | * srcu_dereference - fetch SRCU-protected pointer with checking | 111 | * srcu_dereference_check - fetch SRCU-protected pointer for later dereferencing |
| 112 | * @p: the pointer to fetch and protect for later dereferencing | ||
| 113 | * @sp: pointer to the srcu_struct, which is used to check that we | ||
| 114 | * really are in an SRCU read-side critical section. | ||
| 115 | * @c: condition to check for update-side use | ||
| 112 | * | 116 | * |
| 113 | * Makes rcu_dereference_check() do the dirty work. | 117 | * If PROVE_RCU is enabled, invoking this outside of an RCU read-side |
| 118 | * critical section will result in an RCU-lockdep splat, unless @c evaluates | ||
| 119 | * to 1. The @c argument will normally be a logical expression containing | ||
| 120 | * lockdep_is_held() calls. | ||
| 114 | */ | 121 | */ |
| 115 | #define srcu_dereference(p, sp) \ | 122 | #define srcu_dereference_check(p, sp, c) \ |
| 116 | rcu_dereference_check(p, srcu_read_lock_held(sp)) | 123 | __rcu_dereference_check((p), srcu_read_lock_held(sp) || (c), __rcu) |
| 124 | |||
| 125 | /** | ||
| 126 | * srcu_dereference - fetch SRCU-protected pointer for later dereferencing | ||
| 127 | * @p: the pointer to fetch and protect for later dereferencing | ||
| 128 | * @sp: pointer to the srcu_struct, which is used to check that we | ||
| 129 | * really are in an SRCU read-side critical section. | ||
| 130 | * | ||
| 131 | * Makes rcu_dereference_check() do the dirty work. If PROVE_RCU | ||
| 132 | * is enabled, invoking this outside of an RCU read-side critical | ||
| 133 | * section will result in an RCU-lockdep splat. | ||
| 134 | */ | ||
| 135 | #define srcu_dereference(p, sp) srcu_dereference_check((p), (sp), 0) | ||
| 117 | 136 | ||
| 118 | /** | 137 | /** |
| 119 | * srcu_read_lock - register a new reader for an SRCU-protected structure. | 138 | * srcu_read_lock - register a new reader for an SRCU-protected structure. |
| 120 | * @sp: srcu_struct in which to register the new reader. | 139 | * @sp: srcu_struct in which to register the new reader. |
| 121 | * | 140 | * |
| 122 | * Enter an SRCU read-side critical section. Note that SRCU read-side | 141 | * Enter an SRCU read-side critical section. Note that SRCU read-side |
| 123 | * critical sections may be nested. | 142 | * critical sections may be nested. However, it is illegal to |
| 143 | * call anything that waits on an SRCU grace period for the same | ||
| 144 | * srcu_struct, whether directly or indirectly. Please note that | ||
| 145 | * one way to indirectly wait on an SRCU grace period is to acquire | ||
| 146 | * a mutex that is held elsewhere while calling synchronize_srcu() or | ||
| 147 | * synchronize_srcu_expedited(). | ||
| 124 | */ | 148 | */ |
| 125 | static inline int srcu_read_lock(struct srcu_struct *sp) __acquires(sp) | 149 | static inline int srcu_read_lock(struct srcu_struct *sp) __acquires(sp) |
| 126 | { | 150 | { |
diff --git a/include/linux/ssb/ssb.h b/include/linux/ssb/ssb.h index a2608bff9c78..623b704fdc42 100644 --- a/include/linux/ssb/ssb.h +++ b/include/linux/ssb/ssb.h | |||
| @@ -167,7 +167,7 @@ struct ssb_device { | |||
| 167 | * is an optimization. */ | 167 | * is an optimization. */ |
| 168 | const struct ssb_bus_ops *ops; | 168 | const struct ssb_bus_ops *ops; |
| 169 | 169 | ||
| 170 | struct device *dev; | 170 | struct device *dev, *dma_dev; |
| 171 | 171 | ||
| 172 | struct ssb_bus *bus; | 172 | struct ssb_bus *bus; |
| 173 | struct ssb_device_id id; | 173 | struct ssb_device_id id; |
| @@ -470,14 +470,6 @@ extern u32 ssb_dma_translation(struct ssb_device *dev); | |||
| 470 | #define SSB_DMA_TRANSLATION_MASK 0xC0000000 | 470 | #define SSB_DMA_TRANSLATION_MASK 0xC0000000 |
| 471 | #define SSB_DMA_TRANSLATION_SHIFT 30 | 471 | #define SSB_DMA_TRANSLATION_SHIFT 30 |
| 472 | 472 | ||
| 473 | extern int ssb_dma_set_mask(struct ssb_device *dev, u64 mask); | ||
| 474 | |||
| 475 | extern void * ssb_dma_alloc_consistent(struct ssb_device *dev, size_t size, | ||
| 476 | dma_addr_t *dma_handle, gfp_t gfp_flags); | ||
| 477 | extern void ssb_dma_free_consistent(struct ssb_device *dev, size_t size, | ||
| 478 | void *vaddr, dma_addr_t dma_handle, | ||
| 479 | gfp_t gfp_flags); | ||
| 480 | |||
| 481 | static inline void __cold __ssb_dma_not_implemented(struct ssb_device *dev) | 473 | static inline void __cold __ssb_dma_not_implemented(struct ssb_device *dev) |
| 482 | { | 474 | { |
| 483 | #ifdef CONFIG_SSB_DEBUG | 475 | #ifdef CONFIG_SSB_DEBUG |
| @@ -486,155 +478,6 @@ static inline void __cold __ssb_dma_not_implemented(struct ssb_device *dev) | |||
| 486 | #endif /* DEBUG */ | 478 | #endif /* DEBUG */ |
| 487 | } | 479 | } |
| 488 | 480 | ||
| 489 | static inline int ssb_dma_mapping_error(struct ssb_device *dev, dma_addr_t addr) | ||
| 490 | { | ||
| 491 | switch (dev->bus->bustype) { | ||
| 492 | case SSB_BUSTYPE_PCI: | ||
| 493 | #ifdef CONFIG_SSB_PCIHOST | ||
| 494 | return pci_dma_mapping_error(dev->bus->host_pci, addr); | ||
| 495 | #endif | ||
| 496 | break; | ||
| 497 | case SSB_BUSTYPE_SSB: | ||
| 498 | return dma_mapping_error(dev->dev, addr); | ||
| 499 | default: | ||
| 500 | break; | ||
| 501 | } | ||
| 502 | __ssb_dma_not_implemented(dev); | ||
| 503 | return -ENOSYS; | ||
| 504 | } | ||
| 505 | |||
| 506 | static inline dma_addr_t ssb_dma_map_single(struct ssb_device *dev, void *p, | ||
| 507 | size_t size, enum dma_data_direction dir) | ||
| 508 | { | ||
| 509 | switch (dev->bus->bustype) { | ||
| 510 | case SSB_BUSTYPE_PCI: | ||
| 511 | #ifdef CONFIG_SSB_PCIHOST | ||
| 512 | return pci_map_single(dev->bus->host_pci, p, size, dir); | ||
| 513 | #endif | ||
| 514 | break; | ||
| 515 | case SSB_BUSTYPE_SSB: | ||
| 516 | return dma_map_single(dev->dev, p, size, dir); | ||
| 517 | default: | ||
| 518 | break; | ||
| 519 | } | ||
| 520 | __ssb_dma_not_implemented(dev); | ||
| 521 | return 0; | ||
| 522 | } | ||
| 523 | |||
| 524 | static inline void ssb_dma_unmap_single(struct ssb_device *dev, dma_addr_t dma_addr, | ||
| 525 | size_t size, enum dma_data_direction dir) | ||
| 526 | { | ||
| 527 | switch (dev->bus->bustype) { | ||
| 528 | case SSB_BUSTYPE_PCI: | ||
| 529 | #ifdef CONFIG_SSB_PCIHOST | ||
| 530 | pci_unmap_single(dev->bus->host_pci, dma_addr, size, dir); | ||
| 531 | return; | ||
| 532 | #endif | ||
| 533 | break; | ||
| 534 | case SSB_BUSTYPE_SSB: | ||
| 535 | dma_unmap_single(dev->dev, dma_addr, size, dir); | ||
| 536 | return; | ||
| 537 | default: | ||
| 538 | break; | ||
| 539 | } | ||
| 540 | __ssb_dma_not_implemented(dev); | ||
| 541 | } | ||
| 542 | |||
| 543 | static inline void ssb_dma_sync_single_for_cpu(struct ssb_device *dev, | ||
| 544 | dma_addr_t dma_addr, | ||
| 545 | size_t size, | ||
| 546 | enum dma_data_direction dir) | ||
| 547 | { | ||
| 548 | switch (dev->bus->bustype) { | ||
| 549 | case SSB_BUSTYPE_PCI: | ||
| 550 | #ifdef CONFIG_SSB_PCIHOST | ||
| 551 | pci_dma_sync_single_for_cpu(dev->bus->host_pci, dma_addr, | ||
| 552 | size, dir); | ||
| 553 | return; | ||
| 554 | #endif | ||
| 555 | break; | ||
| 556 | case SSB_BUSTYPE_SSB: | ||
| 557 | dma_sync_single_for_cpu(dev->dev, dma_addr, size, dir); | ||
| 558 | return; | ||
| 559 | default: | ||
| 560 | break; | ||
| 561 | } | ||
| 562 | __ssb_dma_not_implemented(dev); | ||
| 563 | } | ||
| 564 | |||
| 565 | static inline void ssb_dma_sync_single_for_device(struct ssb_device *dev, | ||
| 566 | dma_addr_t dma_addr, | ||
| 567 | size_t size, | ||
| 568 | enum dma_data_direction dir) | ||
| 569 | { | ||
| 570 | switch (dev->bus->bustype) { | ||
| 571 | case SSB_BUSTYPE_PCI: | ||
| 572 | #ifdef CONFIG_SSB_PCIHOST | ||
| 573 | pci_dma_sync_single_for_device(dev->bus->host_pci, dma_addr, | ||
| 574 | size, dir); | ||
| 575 | return; | ||
| 576 | #endif | ||
| 577 | break; | ||
| 578 | case SSB_BUSTYPE_SSB: | ||
| 579 | dma_sync_single_for_device(dev->dev, dma_addr, size, dir); | ||
| 580 | return; | ||
| 581 | default: | ||
| 582 | break; | ||
| 583 | } | ||
| 584 | __ssb_dma_not_implemented(dev); | ||
| 585 | } | ||
| 586 | |||
| 587 | static inline void ssb_dma_sync_single_range_for_cpu(struct ssb_device *dev, | ||
| 588 | dma_addr_t dma_addr, | ||
| 589 | unsigned long offset, | ||
| 590 | size_t size, | ||
| 591 | enum dma_data_direction dir) | ||
| 592 | { | ||
| 593 | switch (dev->bus->bustype) { | ||
| 594 | case SSB_BUSTYPE_PCI: | ||
| 595 | #ifdef CONFIG_SSB_PCIHOST | ||
| 596 | /* Just sync everything. That's all the PCI API can do. */ | ||
| 597 | pci_dma_sync_single_for_cpu(dev->bus->host_pci, dma_addr, | ||
| 598 | offset + size, dir); | ||
| 599 | return; | ||
| 600 | #endif | ||
| 601 | break; | ||
| 602 | case SSB_BUSTYPE_SSB: | ||
| 603 | dma_sync_single_range_for_cpu(dev->dev, dma_addr, offset, | ||
| 604 | size, dir); | ||
| 605 | return; | ||
| 606 | default: | ||
| 607 | break; | ||
| 608 | } | ||
| 609 | __ssb_dma_not_implemented(dev); | ||
| 610 | } | ||
| 611 | |||
| 612 | static inline void ssb_dma_sync_single_range_for_device(struct ssb_device *dev, | ||
| 613 | dma_addr_t dma_addr, | ||
| 614 | unsigned long offset, | ||
| 615 | size_t size, | ||
| 616 | enum dma_data_direction dir) | ||
| 617 | { | ||
| 618 | switch (dev->bus->bustype) { | ||
| 619 | case SSB_BUSTYPE_PCI: | ||
| 620 | #ifdef CONFIG_SSB_PCIHOST | ||
| 621 | /* Just sync everything. That's all the PCI API can do. */ | ||
| 622 | pci_dma_sync_single_for_device(dev->bus->host_pci, dma_addr, | ||
| 623 | offset + size, dir); | ||
| 624 | return; | ||
| 625 | #endif | ||
| 626 | break; | ||
| 627 | case SSB_BUSTYPE_SSB: | ||
| 628 | dma_sync_single_range_for_device(dev->dev, dma_addr, offset, | ||
| 629 | size, dir); | ||
| 630 | return; | ||
| 631 | default: | ||
| 632 | break; | ||
| 633 | } | ||
| 634 | __ssb_dma_not_implemented(dev); | ||
| 635 | } | ||
| 636 | |||
| 637 | |||
| 638 | #ifdef CONFIG_SSB_PCIHOST | 481 | #ifdef CONFIG_SSB_PCIHOST |
| 639 | /* PCI-host wrapper driver */ | 482 | /* PCI-host wrapper driver */ |
| 640 | extern int ssb_pcihost_register(struct pci_driver *driver); | 483 | extern int ssb_pcihost_register(struct pci_driver *driver); |
diff --git a/include/linux/ssb/ssb_regs.h b/include/linux/ssb/ssb_regs.h index a6d5225b9275..11daf9c140e7 100644 --- a/include/linux/ssb/ssb_regs.h +++ b/include/linux/ssb/ssb_regs.h | |||
| @@ -97,6 +97,7 @@ | |||
| 97 | #define SSB_TMSLOW_RESET 0x00000001 /* Reset */ | 97 | #define SSB_TMSLOW_RESET 0x00000001 /* Reset */ |
| 98 | #define SSB_TMSLOW_REJECT_22 0x00000002 /* Reject (Backplane rev 2.2) */ | 98 | #define SSB_TMSLOW_REJECT_22 0x00000002 /* Reject (Backplane rev 2.2) */ |
| 99 | #define SSB_TMSLOW_REJECT_23 0x00000004 /* Reject (Backplane rev 2.3) */ | 99 | #define SSB_TMSLOW_REJECT_23 0x00000004 /* Reject (Backplane rev 2.3) */ |
| 100 | #define SSB_TMSLOW_PHYCLK 0x00000010 /* MAC PHY Clock Control Enable */ | ||
| 100 | #define SSB_TMSLOW_CLOCK 0x00010000 /* Clock Enable */ | 101 | #define SSB_TMSLOW_CLOCK 0x00010000 /* Clock Enable */ |
| 101 | #define SSB_TMSLOW_FGC 0x00020000 /* Force Gated Clocks On */ | 102 | #define SSB_TMSLOW_FGC 0x00020000 /* Force Gated Clocks On */ |
| 102 | #define SSB_TMSLOW_PE 0x40000000 /* Power Management Enable */ | 103 | #define SSB_TMSLOW_PE 0x40000000 /* Power Management Enable */ |
diff --git a/include/linux/statfs.h b/include/linux/statfs.h index b34cc829f98d..0166d320a75d 100644 --- a/include/linux/statfs.h +++ b/include/linux/statfs.h | |||
| @@ -2,7 +2,6 @@ | |||
| 2 | #define _LINUX_STATFS_H | 2 | #define _LINUX_STATFS_H |
| 3 | 3 | ||
| 4 | #include <linux/types.h> | 4 | #include <linux/types.h> |
| 5 | |||
| 6 | #include <asm/statfs.h> | 5 | #include <asm/statfs.h> |
| 7 | 6 | ||
| 8 | struct kstatfs { | 7 | struct kstatfs { |
| @@ -16,7 +15,29 @@ struct kstatfs { | |||
| 16 | __kernel_fsid_t f_fsid; | 15 | __kernel_fsid_t f_fsid; |
| 17 | long f_namelen; | 16 | long f_namelen; |
| 18 | long f_frsize; | 17 | long f_frsize; |
| 19 | long f_spare[5]; | 18 | long f_flags; |
| 19 | long f_spare[4]; | ||
| 20 | }; | 20 | }; |
| 21 | 21 | ||
| 22 | /* | ||
| 23 | * Definitions for the flag in f_flag. | ||
| 24 | * | ||
| 25 | * Generally these flags are equivalent to the MS_ flags used in the mount | ||
| 26 | * ABI. The exception is ST_VALID which has the same value as MS_REMOUNT | ||
| 27 | * which doesn't make any sense for statfs. | ||
| 28 | */ | ||
| 29 | #define ST_RDONLY 0x0001 /* mount read-only */ | ||
| 30 | #define ST_NOSUID 0x0002 /* ignore suid and sgid bits */ | ||
| 31 | #define ST_NODEV 0x0004 /* disallow access to device special files */ | ||
| 32 | #define ST_NOEXEC 0x0008 /* disallow program execution */ | ||
| 33 | #define ST_SYNCHRONOUS 0x0010 /* writes are synced at once */ | ||
| 34 | #define ST_VALID 0x0020 /* f_flags support is implemented */ | ||
| 35 | #define ST_MANDLOCK 0x0040 /* allow mandatory locks on an FS */ | ||
| 36 | /* 0x0080 used for ST_WRITE in glibc */ | ||
| 37 | /* 0x0100 used for ST_APPEND in glibc */ | ||
| 38 | /* 0x0200 used for ST_IMMUTABLE in glibc */ | ||
| 39 | #define ST_NOATIME 0x0400 /* do not update access times */ | ||
| 40 | #define ST_NODIRATIME 0x0800 /* do not update directory access times */ | ||
| 41 | #define ST_RELATIME 0x1000 /* update atime relative to mtime/ctime */ | ||
| 42 | |||
| 22 | #endif | 43 | #endif |
diff --git a/include/linux/stmmac.h b/include/linux/stmmac.h index 632ff7c03280..d66c61774d95 100644 --- a/include/linux/stmmac.h +++ b/include/linux/stmmac.h | |||
| @@ -32,10 +32,14 @@ | |||
| 32 | struct plat_stmmacenet_data { | 32 | struct plat_stmmacenet_data { |
| 33 | int bus_id; | 33 | int bus_id; |
| 34 | int pbl; | 34 | int pbl; |
| 35 | int clk_csr; | ||
| 35 | int has_gmac; | 36 | int has_gmac; |
| 36 | int enh_desc; | 37 | int enh_desc; |
| 38 | int tx_coe; | ||
| 39 | int bugged_jumbo; | ||
| 40 | int pmt; | ||
| 37 | void (*fix_mac_speed)(void *priv, unsigned int speed); | 41 | void (*fix_mac_speed)(void *priv, unsigned int speed); |
| 38 | void (*bus_setup)(unsigned long ioaddr); | 42 | void (*bus_setup)(void __iomem *ioaddr); |
| 39 | #ifdef CONFIG_STM_DRIVERS | 43 | #ifdef CONFIG_STM_DRIVERS |
| 40 | struct stm_pad_config *pad_config; | 44 | struct stm_pad_config *pad_config; |
| 41 | #endif | 45 | #endif |
diff --git a/include/linux/stop_machine.h b/include/linux/stop_machine.h index 6b524a0d02e4..1808960c5059 100644 --- a/include/linux/stop_machine.h +++ b/include/linux/stop_machine.h | |||
| @@ -126,8 +126,8 @@ int __stop_machine(int (*fn)(void *), void *data, const struct cpumask *cpus); | |||
| 126 | 126 | ||
| 127 | #else /* CONFIG_STOP_MACHINE && CONFIG_SMP */ | 127 | #else /* CONFIG_STOP_MACHINE && CONFIG_SMP */ |
| 128 | 128 | ||
| 129 | static inline int stop_machine(int (*fn)(void *), void *data, | 129 | static inline int __stop_machine(int (*fn)(void *), void *data, |
| 130 | const struct cpumask *cpus) | 130 | const struct cpumask *cpus) |
| 131 | { | 131 | { |
| 132 | int ret; | 132 | int ret; |
| 133 | local_irq_disable(); | 133 | local_irq_disable(); |
| @@ -136,5 +136,11 @@ static inline int stop_machine(int (*fn)(void *), void *data, | |||
| 136 | return ret; | 136 | return ret; |
| 137 | } | 137 | } |
| 138 | 138 | ||
| 139 | static inline int stop_machine(int (*fn)(void *), void *data, | ||
| 140 | const struct cpumask *cpus) | ||
| 141 | { | ||
| 142 | return __stop_machine(fn, data, cpus); | ||
| 143 | } | ||
| 144 | |||
| 139 | #endif /* CONFIG_STOP_MACHINE && CONFIG_SMP */ | 145 | #endif /* CONFIG_STOP_MACHINE && CONFIG_SMP */ |
| 140 | #endif /* _LINUX_STOP_MACHINE */ | 146 | #endif /* _LINUX_STOP_MACHINE */ |
diff --git a/include/linux/sunrpc/Kbuild b/include/linux/sunrpc/Kbuild index fb438f158eee..98df21164a86 100644 --- a/include/linux/sunrpc/Kbuild +++ b/include/linux/sunrpc/Kbuild | |||
| @@ -1 +1 @@ | |||
| unifdef-y += debug.h | header-y += debug.h | ||
diff --git a/include/linux/sunrpc/auth.h b/include/linux/sunrpc/auth.h index 87d7ec0bf779..b2024757edd5 100644 --- a/include/linux/sunrpc/auth.h +++ b/include/linux/sunrpc/auth.h | |||
| @@ -61,13 +61,7 @@ struct rpc_cred { | |||
| 61 | /* | 61 | /* |
| 62 | * Client authentication handle | 62 | * Client authentication handle |
| 63 | */ | 63 | */ |
| 64 | #define RPC_CREDCACHE_HASHBITS 4 | 64 | struct rpc_cred_cache; |
| 65 | #define RPC_CREDCACHE_NR (1 << RPC_CREDCACHE_HASHBITS) | ||
| 66 | struct rpc_cred_cache { | ||
| 67 | struct hlist_head hashtable[RPC_CREDCACHE_NR]; | ||
| 68 | spinlock_t lock; | ||
| 69 | }; | ||
| 70 | |||
| 71 | struct rpc_authops; | 65 | struct rpc_authops; |
| 72 | struct rpc_auth { | 66 | struct rpc_auth { |
| 73 | unsigned int au_cslack; /* call cred size estimate */ | 67 | unsigned int au_cslack; /* call cred size estimate */ |
| @@ -112,7 +106,7 @@ struct rpc_credops { | |||
| 112 | void (*crdestroy)(struct rpc_cred *); | 106 | void (*crdestroy)(struct rpc_cred *); |
| 113 | 107 | ||
| 114 | int (*crmatch)(struct auth_cred *, struct rpc_cred *, int); | 108 | int (*crmatch)(struct auth_cred *, struct rpc_cred *, int); |
| 115 | void (*crbind)(struct rpc_task *, struct rpc_cred *, int); | 109 | struct rpc_cred * (*crbind)(struct rpc_task *, struct rpc_cred *, int); |
| 116 | __be32 * (*crmarshal)(struct rpc_task *, __be32 *); | 110 | __be32 * (*crmarshal)(struct rpc_task *, __be32 *); |
| 117 | int (*crrefresh)(struct rpc_task *); | 111 | int (*crrefresh)(struct rpc_task *); |
| 118 | __be32 * (*crvalidate)(struct rpc_task *, __be32 *); | 112 | __be32 * (*crvalidate)(struct rpc_task *, __be32 *); |
| @@ -125,11 +119,12 @@ struct rpc_credops { | |||
| 125 | extern const struct rpc_authops authunix_ops; | 119 | extern const struct rpc_authops authunix_ops; |
| 126 | extern const struct rpc_authops authnull_ops; | 120 | extern const struct rpc_authops authnull_ops; |
| 127 | 121 | ||
| 128 | void __init rpc_init_authunix(void); | 122 | int __init rpc_init_authunix(void); |
| 129 | void __init rpc_init_generic_auth(void); | 123 | int __init rpc_init_generic_auth(void); |
| 130 | void __init rpcauth_init_module(void); | 124 | int __init rpcauth_init_module(void); |
| 131 | void __exit rpcauth_remove_module(void); | 125 | void rpcauth_remove_module(void); |
| 132 | void __exit rpc_destroy_generic_auth(void); | 126 | void rpc_destroy_generic_auth(void); |
| 127 | void rpc_destroy_authunix(void); | ||
| 133 | 128 | ||
| 134 | struct rpc_cred * rpc_lookup_cred(void); | 129 | struct rpc_cred * rpc_lookup_cred(void); |
| 135 | struct rpc_cred * rpc_lookup_machine_cred(void); | 130 | struct rpc_cred * rpc_lookup_machine_cred(void); |
| @@ -140,10 +135,8 @@ void rpcauth_release(struct rpc_auth *); | |||
| 140 | struct rpc_cred * rpcauth_lookup_credcache(struct rpc_auth *, struct auth_cred *, int); | 135 | struct rpc_cred * rpcauth_lookup_credcache(struct rpc_auth *, struct auth_cred *, int); |
| 141 | void rpcauth_init_cred(struct rpc_cred *, const struct auth_cred *, struct rpc_auth *, const struct rpc_credops *); | 136 | void rpcauth_init_cred(struct rpc_cred *, const struct auth_cred *, struct rpc_auth *, const struct rpc_credops *); |
| 142 | struct rpc_cred * rpcauth_lookupcred(struct rpc_auth *, int); | 137 | struct rpc_cred * rpcauth_lookupcred(struct rpc_auth *, int); |
| 143 | void rpcauth_bindcred(struct rpc_task *, struct rpc_cred *, int); | 138 | struct rpc_cred * rpcauth_generic_bind_cred(struct rpc_task *, struct rpc_cred *, int); |
| 144 | void rpcauth_generic_bind_cred(struct rpc_task *, struct rpc_cred *, int); | ||
| 145 | void put_rpccred(struct rpc_cred *); | 139 | void put_rpccred(struct rpc_cred *); |
| 146 | void rpcauth_unbindcred(struct rpc_task *); | ||
| 147 | __be32 * rpcauth_marshcred(struct rpc_task *, __be32 *); | 140 | __be32 * rpcauth_marshcred(struct rpc_task *, __be32 *); |
| 148 | __be32 * rpcauth_checkverf(struct rpc_task *, __be32 *); | 141 | __be32 * rpcauth_checkverf(struct rpc_task *, __be32 *); |
| 149 | int rpcauth_wrap_req(struct rpc_task *task, kxdrproc_t encode, void *rqstp, __be32 *data, void *obj); | 142 | int rpcauth_wrap_req(struct rpc_task *task, kxdrproc_t encode, void *rqstp, __be32 *data, void *obj); |
diff --git a/include/linux/sunrpc/auth_gss.h b/include/linux/sunrpc/auth_gss.h index 671538d25bc1..8eee9dbbfe7a 100644 --- a/include/linux/sunrpc/auth_gss.h +++ b/include/linux/sunrpc/auth_gss.h | |||
| @@ -69,7 +69,7 @@ struct gss_cl_ctx { | |||
| 69 | enum rpc_gss_proc gc_proc; | 69 | enum rpc_gss_proc gc_proc; |
| 70 | u32 gc_seq; | 70 | u32 gc_seq; |
| 71 | spinlock_t gc_seq_lock; | 71 | spinlock_t gc_seq_lock; |
| 72 | struct gss_ctx *gc_gss_ctx; | 72 | struct gss_ctx __rcu *gc_gss_ctx; |
| 73 | struct xdr_netobj gc_wire_ctx; | 73 | struct xdr_netobj gc_wire_ctx; |
| 74 | u32 gc_win; | 74 | u32 gc_win; |
| 75 | unsigned long gc_expiry; | 75 | unsigned long gc_expiry; |
| @@ -80,7 +80,7 @@ struct gss_upcall_msg; | |||
| 80 | struct gss_cred { | 80 | struct gss_cred { |
| 81 | struct rpc_cred gc_base; | 81 | struct rpc_cred gc_base; |
| 82 | enum rpc_gss_svc gc_service; | 82 | enum rpc_gss_svc gc_service; |
| 83 | struct gss_cl_ctx *gc_ctx; | 83 | struct gss_cl_ctx __rcu *gc_ctx; |
| 84 | struct gss_upcall_msg *gc_upcall; | 84 | struct gss_upcall_msg *gc_upcall; |
| 85 | unsigned long gc_upcall_timestamp; | 85 | unsigned long gc_upcall_timestamp; |
| 86 | unsigned char gc_machine_cred : 1; | 86 | unsigned char gc_machine_cred : 1; |
diff --git a/include/linux/sunrpc/cache.h b/include/linux/sunrpc/cache.h index 6f52b4d7c447..6950c981882d 100644 --- a/include/linux/sunrpc/cache.h +++ b/include/linux/sunrpc/cache.h | |||
| @@ -125,12 +125,15 @@ struct cache_detail { | |||
| 125 | */ | 125 | */ |
| 126 | struct cache_req { | 126 | struct cache_req { |
| 127 | struct cache_deferred_req *(*defer)(struct cache_req *req); | 127 | struct cache_deferred_req *(*defer)(struct cache_req *req); |
| 128 | int thread_wait; /* How long (jiffies) we can block the | ||
| 129 | * current thread to wait for updates. | ||
| 130 | */ | ||
| 128 | }; | 131 | }; |
| 129 | /* this must be embedded in a deferred_request that is being | 132 | /* this must be embedded in a deferred_request that is being |
| 130 | * delayed awaiting cache-fill | 133 | * delayed awaiting cache-fill |
| 131 | */ | 134 | */ |
| 132 | struct cache_deferred_req { | 135 | struct cache_deferred_req { |
| 133 | struct list_head hash; /* on hash chain */ | 136 | struct hlist_node hash; /* on hash chain */ |
| 134 | struct list_head recent; /* on fifo */ | 137 | struct list_head recent; /* on fifo */ |
| 135 | struct cache_head *item; /* cache item we wait on */ | 138 | struct cache_head *item; /* cache item we wait on */ |
| 136 | void *owner; /* we might need to discard all defered requests | 139 | void *owner; /* we might need to discard all defered requests |
| @@ -192,8 +195,11 @@ extern int cache_check(struct cache_detail *detail, | |||
| 192 | extern void cache_flush(void); | 195 | extern void cache_flush(void); |
| 193 | extern void cache_purge(struct cache_detail *detail); | 196 | extern void cache_purge(struct cache_detail *detail); |
| 194 | #define NEVER (0x7FFFFFFF) | 197 | #define NEVER (0x7FFFFFFF) |
| 198 | extern void __init cache_initialize(void); | ||
| 195 | extern int cache_register(struct cache_detail *cd); | 199 | extern int cache_register(struct cache_detail *cd); |
| 200 | extern int cache_register_net(struct cache_detail *cd, struct net *net); | ||
| 196 | extern void cache_unregister(struct cache_detail *cd); | 201 | extern void cache_unregister(struct cache_detail *cd); |
| 202 | extern void cache_unregister_net(struct cache_detail *cd, struct net *net); | ||
| 197 | 203 | ||
| 198 | extern int sunrpc_cache_register_pipefs(struct dentry *parent, const char *, | 204 | extern int sunrpc_cache_register_pipefs(struct dentry *parent, const char *, |
| 199 | mode_t, struct cache_detail *); | 205 | mode_t, struct cache_detail *); |
| @@ -217,14 +223,42 @@ static inline int get_int(char **bpp, int *anint) | |||
| 217 | return 0; | 223 | return 0; |
| 218 | } | 224 | } |
| 219 | 225 | ||
| 226 | /* | ||
| 227 | * timestamps kept in the cache are expressed in seconds | ||
| 228 | * since boot. This is the best for measuring differences in | ||
| 229 | * real time. | ||
| 230 | */ | ||
| 231 | static inline time_t seconds_since_boot(void) | ||
| 232 | { | ||
| 233 | struct timespec boot; | ||
| 234 | getboottime(&boot); | ||
| 235 | return get_seconds() - boot.tv_sec; | ||
| 236 | } | ||
| 237 | |||
| 238 | static inline time_t convert_to_wallclock(time_t sinceboot) | ||
| 239 | { | ||
| 240 | struct timespec boot; | ||
| 241 | getboottime(&boot); | ||
| 242 | return boot.tv_sec + sinceboot; | ||
| 243 | } | ||
| 244 | |||
| 220 | static inline time_t get_expiry(char **bpp) | 245 | static inline time_t get_expiry(char **bpp) |
| 221 | { | 246 | { |
| 222 | int rv; | 247 | int rv; |
| 248 | struct timespec boot; | ||
| 249 | |||
| 223 | if (get_int(bpp, &rv)) | 250 | if (get_int(bpp, &rv)) |
| 224 | return 0; | 251 | return 0; |
| 225 | if (rv < 0) | 252 | if (rv < 0) |
| 226 | return 0; | 253 | return 0; |
| 227 | return rv; | 254 | getboottime(&boot); |
| 255 | return rv - boot.tv_sec; | ||
| 228 | } | 256 | } |
| 229 | 257 | ||
| 258 | static inline void sunrpc_invalidate(struct cache_head *h, | ||
| 259 | struct cache_detail *detail) | ||
| 260 | { | ||
| 261 | h->expiry_time = seconds_since_boot() - 1; | ||
| 262 | detail->nextcheck = seconds_since_boot(); | ||
| 263 | } | ||
| 230 | #endif /* _LINUX_SUNRPC_CACHE_H_ */ | 264 | #endif /* _LINUX_SUNRPC_CACHE_H_ */ |
diff --git a/include/linux/sunrpc/clnt.h b/include/linux/sunrpc/clnt.h index 8ed9642a5a76..a5a55f284b7d 100644 --- a/include/linux/sunrpc/clnt.h +++ b/include/linux/sunrpc/clnt.h | |||
| @@ -30,7 +30,7 @@ struct rpc_inode; | |||
| 30 | * The high-level client handle | 30 | * The high-level client handle |
| 31 | */ | 31 | */ |
| 32 | struct rpc_clnt { | 32 | struct rpc_clnt { |
| 33 | struct kref cl_kref; /* Number of references */ | 33 | atomic_t cl_count; /* Number of references */ |
| 34 | struct list_head cl_clients; /* Global list of clients */ | 34 | struct list_head cl_clients; /* Global list of clients */ |
| 35 | struct list_head cl_tasks; /* List of tasks */ | 35 | struct list_head cl_tasks; /* List of tasks */ |
| 36 | spinlock_t cl_lock; /* spinlock */ | 36 | spinlock_t cl_lock; /* spinlock */ |
| @@ -102,6 +102,7 @@ struct rpc_procinfo { | |||
| 102 | #ifdef __KERNEL__ | 102 | #ifdef __KERNEL__ |
| 103 | 103 | ||
| 104 | struct rpc_create_args { | 104 | struct rpc_create_args { |
| 105 | struct net *net; | ||
| 105 | int protocol; | 106 | int protocol; |
| 106 | struct sockaddr *address; | 107 | struct sockaddr *address; |
| 107 | size_t addrsize; | 108 | size_t addrsize; |
| @@ -131,12 +132,12 @@ struct rpc_clnt *rpc_bind_new_program(struct rpc_clnt *, | |||
| 131 | struct rpc_clnt *rpc_clone_client(struct rpc_clnt *); | 132 | struct rpc_clnt *rpc_clone_client(struct rpc_clnt *); |
| 132 | void rpc_shutdown_client(struct rpc_clnt *); | 133 | void rpc_shutdown_client(struct rpc_clnt *); |
| 133 | void rpc_release_client(struct rpc_clnt *); | 134 | void rpc_release_client(struct rpc_clnt *); |
| 135 | void rpc_task_release_client(struct rpc_task *); | ||
| 134 | 136 | ||
| 135 | int rpcb_register(u32, u32, int, unsigned short); | 137 | int rpcb_register(u32, u32, int, unsigned short); |
| 136 | int rpcb_v4_register(const u32 program, const u32 version, | 138 | int rpcb_v4_register(const u32 program, const u32 version, |
| 137 | const struct sockaddr *address, | 139 | const struct sockaddr *address, |
| 138 | const char *netid); | 140 | const char *netid); |
| 139 | int rpcb_getport_sync(struct sockaddr_in *, u32, u32, int); | ||
| 140 | void rpcb_getport_async(struct rpc_task *); | 141 | void rpcb_getport_async(struct rpc_task *); |
| 141 | 142 | ||
| 142 | void rpc_call_start(struct rpc_task *); | 143 | void rpc_call_start(struct rpc_task *); |
| @@ -148,8 +149,8 @@ int rpc_call_sync(struct rpc_clnt *clnt, | |||
| 148 | const struct rpc_message *msg, int flags); | 149 | const struct rpc_message *msg, int flags); |
| 149 | struct rpc_task *rpc_call_null(struct rpc_clnt *clnt, struct rpc_cred *cred, | 150 | struct rpc_task *rpc_call_null(struct rpc_clnt *clnt, struct rpc_cred *cred, |
| 150 | int flags); | 151 | int flags); |
| 151 | void rpc_restart_call_prepare(struct rpc_task *); | 152 | int rpc_restart_call_prepare(struct rpc_task *); |
| 152 | void rpc_restart_call(struct rpc_task *); | 153 | int rpc_restart_call(struct rpc_task *); |
| 153 | void rpc_setbufsize(struct rpc_clnt *, unsigned int, unsigned int); | 154 | void rpc_setbufsize(struct rpc_clnt *, unsigned int, unsigned int); |
| 154 | size_t rpc_max_payload(struct rpc_clnt *); | 155 | size_t rpc_max_payload(struct rpc_clnt *); |
| 155 | void rpc_force_rebind(struct rpc_clnt *); | 156 | void rpc_force_rebind(struct rpc_clnt *); |
diff --git a/include/linux/sunrpc/gss_spkm3.h b/include/linux/sunrpc/gss_spkm3.h deleted file mode 100644 index e3e6a3437f8b..000000000000 --- a/include/linux/sunrpc/gss_spkm3.h +++ /dev/null | |||
| @@ -1,55 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * linux/include/linux/sunrpc/gss_spkm3.h | ||
| 3 | * | ||
| 4 | * Copyright (c) 2000 The Regents of the University of Michigan. | ||
| 5 | * All rights reserved. | ||
| 6 | * | ||
| 7 | * Andy Adamson <andros@umich.edu> | ||
| 8 | */ | ||
| 9 | |||
| 10 | #include <linux/sunrpc/auth_gss.h> | ||
| 11 | #include <linux/sunrpc/gss_err.h> | ||
| 12 | #include <linux/sunrpc/gss_asn1.h> | ||
| 13 | |||
| 14 | struct spkm3_ctx { | ||
| 15 | struct xdr_netobj ctx_id; /* per message context id */ | ||
| 16 | int endtime; /* endtime of the context */ | ||
| 17 | struct xdr_netobj mech_used; | ||
| 18 | unsigned int ret_flags ; | ||
| 19 | struct xdr_netobj conf_alg; | ||
| 20 | struct xdr_netobj derived_conf_key; | ||
| 21 | struct xdr_netobj intg_alg; | ||
| 22 | struct xdr_netobj derived_integ_key; | ||
| 23 | }; | ||
| 24 | |||
| 25 | /* OIDs declarations for K-ALG, I-ALG, C-ALG, and OWF-ALG */ | ||
| 26 | extern const struct xdr_netobj hmac_md5_oid; | ||
| 27 | extern const struct xdr_netobj cast5_cbc_oid; | ||
| 28 | |||
| 29 | /* SPKM InnerContext Token types */ | ||
| 30 | |||
| 31 | #define SPKM_ERROR_TOK 3 | ||
| 32 | #define SPKM_MIC_TOK 4 | ||
| 33 | #define SPKM_WRAP_TOK 5 | ||
| 34 | #define SPKM_DEL_TOK 6 | ||
| 35 | |||
| 36 | u32 spkm3_make_token(struct spkm3_ctx *ctx, struct xdr_buf * text, struct xdr_netobj * token, int toktype); | ||
| 37 | |||
| 38 | u32 spkm3_read_token(struct spkm3_ctx *ctx, struct xdr_netobj *read_token, struct xdr_buf *message_buffer, int toktype); | ||
| 39 | |||
| 40 | #define CKSUMTYPE_RSA_MD5 0x0007 | ||
| 41 | #define CKSUMTYPE_HMAC_MD5 0x0008 | ||
| 42 | |||
| 43 | s32 make_spkm3_checksum(s32 cksumtype, struct xdr_netobj *key, char *header, | ||
| 44 | unsigned int hdrlen, struct xdr_buf *body, | ||
| 45 | unsigned int body_offset, struct xdr_netobj *cksum); | ||
| 46 | void asn1_bitstring_len(struct xdr_netobj *in, int *enclen, int *zerobits); | ||
| 47 | int decode_asn1_bitstring(struct xdr_netobj *out, char *in, int enclen, | ||
| 48 | int explen); | ||
| 49 | void spkm3_mic_header(unsigned char **hdrbuf, unsigned int *hdrlen, | ||
| 50 | unsigned char *ctxhdr, int elen, int zbit); | ||
| 51 | void spkm3_make_mic_token(unsigned char **tokp, int toklen, | ||
| 52 | struct xdr_netobj *mic_hdr, | ||
| 53 | struct xdr_netobj *md5cksum, int md5elen, int md5zbit); | ||
| 54 | u32 spkm3_verify_mic_token(unsigned char **tokp, int *mic_hdrlen, | ||
| 55 | unsigned char **cksum); | ||
diff --git a/include/linux/sunrpc/sched.h b/include/linux/sunrpc/sched.h index 7be4f3a6d246..88513fd8e208 100644 --- a/include/linux/sunrpc/sched.h +++ b/include/linux/sunrpc/sched.h | |||
| @@ -213,6 +213,7 @@ struct rpc_task *rpc_run_bc_task(struct rpc_rqst *req, | |||
| 213 | const struct rpc_call_ops *ops); | 213 | const struct rpc_call_ops *ops); |
| 214 | void rpc_put_task(struct rpc_task *); | 214 | void rpc_put_task(struct rpc_task *); |
| 215 | void rpc_exit_task(struct rpc_task *); | 215 | void rpc_exit_task(struct rpc_task *); |
| 216 | void rpc_exit(struct rpc_task *, int); | ||
| 216 | void rpc_release_calldata(const struct rpc_call_ops *, void *); | 217 | void rpc_release_calldata(const struct rpc_call_ops *, void *); |
| 217 | void rpc_killall_tasks(struct rpc_clnt *); | 218 | void rpc_killall_tasks(struct rpc_clnt *); |
| 218 | void rpc_execute(struct rpc_task *); | 219 | void rpc_execute(struct rpc_task *); |
| @@ -241,12 +242,6 @@ void rpc_destroy_mempool(void); | |||
| 241 | extern struct workqueue_struct *rpciod_workqueue; | 242 | extern struct workqueue_struct *rpciod_workqueue; |
| 242 | void rpc_prepare_task(struct rpc_task *task); | 243 | void rpc_prepare_task(struct rpc_task *task); |
| 243 | 244 | ||
| 244 | static inline void rpc_exit(struct rpc_task *task, int status) | ||
| 245 | { | ||
| 246 | task->tk_status = status; | ||
| 247 | task->tk_action = rpc_exit_task; | ||
| 248 | } | ||
| 249 | |||
| 250 | static inline int rpc_wait_for_completion_task(struct rpc_task *task) | 245 | static inline int rpc_wait_for_completion_task(struct rpc_task *task) |
| 251 | { | 246 | { |
| 252 | return __rpc_wait_for_completion_task(task, NULL); | 247 | return __rpc_wait_for_completion_task(task, NULL); |
diff --git a/include/linux/sunrpc/stats.h b/include/linux/sunrpc/stats.h index 5fa0f2084307..680471d1f28a 100644 --- a/include/linux/sunrpc/stats.h +++ b/include/linux/sunrpc/stats.h | |||
| @@ -38,8 +38,21 @@ struct svc_stat { | |||
| 38 | rpcbadclnt; | 38 | rpcbadclnt; |
| 39 | }; | 39 | }; |
| 40 | 40 | ||
| 41 | void rpc_proc_init(void); | 41 | struct net; |
| 42 | void rpc_proc_exit(void); | 42 | #ifdef CONFIG_PROC_FS |
| 43 | int rpc_proc_init(struct net *); | ||
| 44 | void rpc_proc_exit(struct net *); | ||
| 45 | #else | ||
| 46 | static inline int rpc_proc_init(struct net *net) | ||
| 47 | { | ||
| 48 | return 0; | ||
| 49 | } | ||
| 50 | |||
| 51 | static inline void rpc_proc_exit(struct net *net) | ||
| 52 | { | ||
| 53 | } | ||
| 54 | #endif | ||
| 55 | |||
| 43 | #ifdef MODULE | 56 | #ifdef MODULE |
| 44 | void rpc_modcount(struct inode *, int); | 57 | void rpc_modcount(struct inode *, int); |
| 45 | #endif | 58 | #endif |
| @@ -54,9 +67,6 @@ void svc_proc_unregister(const char *); | |||
| 54 | 67 | ||
| 55 | void svc_seq_show(struct seq_file *, | 68 | void svc_seq_show(struct seq_file *, |
| 56 | const struct svc_stat *); | 69 | const struct svc_stat *); |
| 57 | |||
| 58 | extern struct proc_dir_entry *proc_net_rpc; | ||
| 59 | |||
| 60 | #else | 70 | #else |
| 61 | 71 | ||
| 62 | static inline struct proc_dir_entry *rpc_proc_register(struct rpc_stat *s) { return NULL; } | 72 | static inline struct proc_dir_entry *rpc_proc_register(struct rpc_stat *s) { return NULL; } |
| @@ -69,9 +79,6 @@ static inline void svc_proc_unregister(const char *p) {} | |||
| 69 | 79 | ||
| 70 | static inline void svc_seq_show(struct seq_file *seq, | 80 | static inline void svc_seq_show(struct seq_file *seq, |
| 71 | const struct svc_stat *st) {} | 81 | const struct svc_stat *st) {} |
| 72 | |||
| 73 | #define proc_net_rpc NULL | ||
| 74 | |||
| 75 | #endif | 82 | #endif |
| 76 | 83 | ||
| 77 | #endif /* _LINUX_SUNRPC_STATS_H */ | 84 | #endif /* _LINUX_SUNRPC_STATS_H */ |
diff --git a/include/linux/sunrpc/svc_xprt.h b/include/linux/sunrpc/svc_xprt.h index 5f4e18b3ce73..bbdb680ffbe9 100644 --- a/include/linux/sunrpc/svc_xprt.h +++ b/include/linux/sunrpc/svc_xprt.h | |||
| @@ -12,6 +12,7 @@ | |||
| 12 | 12 | ||
| 13 | struct svc_xprt_ops { | 13 | struct svc_xprt_ops { |
| 14 | struct svc_xprt *(*xpo_create)(struct svc_serv *, | 14 | struct svc_xprt *(*xpo_create)(struct svc_serv *, |
| 15 | struct net *net, | ||
| 15 | struct sockaddr *, int, | 16 | struct sockaddr *, int, |
| 16 | int); | 17 | int); |
| 17 | struct svc_xprt *(*xpo_accept)(struct svc_xprt *); | 18 | struct svc_xprt *(*xpo_accept)(struct svc_xprt *); |
| @@ -32,6 +33,16 @@ struct svc_xprt_class { | |||
| 32 | u32 xcl_max_payload; | 33 | u32 xcl_max_payload; |
| 33 | }; | 34 | }; |
| 34 | 35 | ||
| 36 | /* | ||
| 37 | * This is embedded in an object that wants a callback before deleting | ||
| 38 | * an xprt; intended for use by NFSv4.1, which needs to know when a | ||
| 39 | * client's tcp connection (and hence possibly a backchannel) goes away. | ||
| 40 | */ | ||
| 41 | struct svc_xpt_user { | ||
| 42 | struct list_head list; | ||
| 43 | void (*callback)(struct svc_xpt_user *); | ||
| 44 | }; | ||
| 45 | |||
| 35 | struct svc_xprt { | 46 | struct svc_xprt { |
| 36 | struct svc_xprt_class *xpt_class; | 47 | struct svc_xprt_class *xpt_class; |
| 37 | struct svc_xprt_ops *xpt_ops; | 48 | struct svc_xprt_ops *xpt_ops; |
| @@ -66,14 +77,31 @@ struct svc_xprt { | |||
| 66 | struct sockaddr_storage xpt_remote; /* remote peer's address */ | 77 | struct sockaddr_storage xpt_remote; /* remote peer's address */ |
| 67 | size_t xpt_remotelen; /* length of address */ | 78 | size_t xpt_remotelen; /* length of address */ |
| 68 | struct rpc_wait_queue xpt_bc_pending; /* backchannel wait queue */ | 79 | struct rpc_wait_queue xpt_bc_pending; /* backchannel wait queue */ |
| 80 | struct list_head xpt_users; /* callbacks on free */ | ||
| 81 | |||
| 82 | struct net *xpt_net; | ||
| 69 | }; | 83 | }; |
| 70 | 84 | ||
| 85 | static inline void register_xpt_user(struct svc_xprt *xpt, struct svc_xpt_user *u) | ||
| 86 | { | ||
| 87 | spin_lock(&xpt->xpt_lock); | ||
| 88 | list_add(&u->list, &xpt->xpt_users); | ||
| 89 | spin_unlock(&xpt->xpt_lock); | ||
| 90 | } | ||
| 91 | |||
| 92 | static inline void unregister_xpt_user(struct svc_xprt *xpt, struct svc_xpt_user *u) | ||
| 93 | { | ||
| 94 | spin_lock(&xpt->xpt_lock); | ||
| 95 | list_del_init(&u->list); | ||
| 96 | spin_unlock(&xpt->xpt_lock); | ||
| 97 | } | ||
| 98 | |||
| 71 | int svc_reg_xprt_class(struct svc_xprt_class *); | 99 | int svc_reg_xprt_class(struct svc_xprt_class *); |
| 72 | void svc_unreg_xprt_class(struct svc_xprt_class *); | 100 | void svc_unreg_xprt_class(struct svc_xprt_class *); |
| 73 | void svc_xprt_init(struct svc_xprt_class *, struct svc_xprt *, | 101 | void svc_xprt_init(struct svc_xprt_class *, struct svc_xprt *, |
| 74 | struct svc_serv *); | 102 | struct svc_serv *); |
| 75 | int svc_create_xprt(struct svc_serv *, const char *, const int, | 103 | int svc_create_xprt(struct svc_serv *, const char *, struct net *, |
| 76 | const unsigned short, int); | 104 | const int, const unsigned short, int); |
| 77 | void svc_xprt_enqueue(struct svc_xprt *xprt); | 105 | void svc_xprt_enqueue(struct svc_xprt *xprt); |
| 78 | void svc_xprt_received(struct svc_xprt *); | 106 | void svc_xprt_received(struct svc_xprt *); |
| 79 | void svc_xprt_put(struct svc_xprt *xprt); | 107 | void svc_xprt_put(struct svc_xprt *xprt); |
diff --git a/include/linux/sunrpc/svcauth.h b/include/linux/sunrpc/svcauth.h index d39dbdc7b10f..25d333c1b571 100644 --- a/include/linux/sunrpc/svcauth.h +++ b/include/linux/sunrpc/svcauth.h | |||
| @@ -108,10 +108,15 @@ struct auth_ops { | |||
| 108 | #define SVC_NEGATIVE 4 | 108 | #define SVC_NEGATIVE 4 |
| 109 | #define SVC_OK 5 | 109 | #define SVC_OK 5 |
| 110 | #define SVC_DROP 6 | 110 | #define SVC_DROP 6 |
| 111 | #define SVC_DENIED 7 | 111 | #define SVC_CLOSE 7 /* Like SVC_DROP, but request is definitely |
| 112 | #define SVC_PENDING 8 | 112 | * lost so if there is a tcp connection, it |
| 113 | #define SVC_COMPLETE 9 | 113 | * should be closed |
| 114 | */ | ||
| 115 | #define SVC_DENIED 8 | ||
| 116 | #define SVC_PENDING 9 | ||
| 117 | #define SVC_COMPLETE 10 | ||
| 114 | 118 | ||
| 119 | struct svc_xprt; | ||
| 115 | 120 | ||
| 116 | extern int svc_authenticate(struct svc_rqst *rqstp, __be32 *authp); | 121 | extern int svc_authenticate(struct svc_rqst *rqstp, __be32 *authp); |
| 117 | extern int svc_authorise(struct svc_rqst *rqstp); | 122 | extern int svc_authorise(struct svc_rqst *rqstp); |
| @@ -121,13 +126,13 @@ extern void svc_auth_unregister(rpc_authflavor_t flavor); | |||
| 121 | 126 | ||
| 122 | extern struct auth_domain *unix_domain_find(char *name); | 127 | extern struct auth_domain *unix_domain_find(char *name); |
| 123 | extern void auth_domain_put(struct auth_domain *item); | 128 | extern void auth_domain_put(struct auth_domain *item); |
| 124 | extern int auth_unix_add_addr(struct in6_addr *addr, struct auth_domain *dom); | 129 | extern int auth_unix_add_addr(struct net *net, struct in6_addr *addr, struct auth_domain *dom); |
| 125 | extern struct auth_domain *auth_domain_lookup(char *name, struct auth_domain *new); | 130 | extern struct auth_domain *auth_domain_lookup(char *name, struct auth_domain *new); |
| 126 | extern struct auth_domain *auth_domain_find(char *name); | 131 | extern struct auth_domain *auth_domain_find(char *name); |
| 127 | extern struct auth_domain *auth_unix_lookup(struct in6_addr *addr); | 132 | extern struct auth_domain *auth_unix_lookup(struct net *net, struct in6_addr *addr); |
| 128 | extern int auth_unix_forget_old(struct auth_domain *dom); | 133 | extern int auth_unix_forget_old(struct auth_domain *dom); |
| 129 | extern void svcauth_unix_purge(void); | 134 | extern void svcauth_unix_purge(void); |
| 130 | extern void svcauth_unix_info_release(void *); | 135 | extern void svcauth_unix_info_release(struct svc_xprt *xpt); |
| 131 | extern int svcauth_unix_set_client(struct svc_rqst *rqstp); | 136 | extern int svcauth_unix_set_client(struct svc_rqst *rqstp); |
| 132 | 137 | ||
| 133 | static inline unsigned long hash_str(char *name, int bits) | 138 | static inline unsigned long hash_str(char *name, int bits) |
diff --git a/include/linux/sunrpc/xdr.h b/include/linux/sunrpc/xdr.h index 35cf2e8cd7c6..498ab93a81e4 100644 --- a/include/linux/sunrpc/xdr.h +++ b/include/linux/sunrpc/xdr.h | |||
| @@ -108,6 +108,7 @@ void xdr_encode_pages(struct xdr_buf *, struct page **, unsigned int, | |||
| 108 | unsigned int); | 108 | unsigned int); |
| 109 | void xdr_inline_pages(struct xdr_buf *, unsigned int, | 109 | void xdr_inline_pages(struct xdr_buf *, unsigned int, |
| 110 | struct page **, unsigned int, unsigned int); | 110 | struct page **, unsigned int, unsigned int); |
| 111 | void xdr_terminate_string(struct xdr_buf *, const u32); | ||
| 111 | 112 | ||
| 112 | static inline __be32 *xdr_encode_array(__be32 *p, const void *s, unsigned int len) | 113 | static inline __be32 *xdr_encode_array(__be32 *p, const void *s, unsigned int len) |
| 113 | { | 114 | { |
| @@ -131,6 +132,13 @@ xdr_decode_hyper(__be32 *p, __u64 *valp) | |||
| 131 | return p + 2; | 132 | return p + 2; |
| 132 | } | 133 | } |
| 133 | 134 | ||
| 135 | static inline __be32 * | ||
| 136 | xdr_decode_opaque_fixed(__be32 *p, void *ptr, unsigned int len) | ||
| 137 | { | ||
| 138 | memcpy(ptr, p, len); | ||
| 139 | return p + XDR_QUADLEN(len); | ||
| 140 | } | ||
| 141 | |||
| 134 | /* | 142 | /* |
| 135 | * Adjust kvec to reflect end of xdr'ed data (RPC client XDR) | 143 | * Adjust kvec to reflect end of xdr'ed data (RPC client XDR) |
| 136 | */ | 144 | */ |
| @@ -200,6 +208,7 @@ extern __be32 *xdr_reserve_space(struct xdr_stream *xdr, size_t nbytes); | |||
| 200 | extern void xdr_write_pages(struct xdr_stream *xdr, struct page **pages, | 208 | extern void xdr_write_pages(struct xdr_stream *xdr, struct page **pages, |
| 201 | unsigned int base, unsigned int len); | 209 | unsigned int base, unsigned int len); |
| 202 | extern void xdr_init_decode(struct xdr_stream *xdr, struct xdr_buf *buf, __be32 *p); | 210 | extern void xdr_init_decode(struct xdr_stream *xdr, struct xdr_buf *buf, __be32 *p); |
| 211 | extern __be32 *xdr_inline_peek(struct xdr_stream *xdr, size_t nbytes); | ||
| 203 | extern __be32 *xdr_inline_decode(struct xdr_stream *xdr, size_t nbytes); | 212 | extern __be32 *xdr_inline_decode(struct xdr_stream *xdr, size_t nbytes); |
| 204 | extern void xdr_read_pages(struct xdr_stream *xdr, unsigned int len); | 213 | extern void xdr_read_pages(struct xdr_stream *xdr, unsigned int len); |
| 205 | extern void xdr_enter_page(struct xdr_stream *xdr, unsigned int len); | 214 | extern void xdr_enter_page(struct xdr_stream *xdr, unsigned int len); |
diff --git a/include/linux/sunrpc/xprt.h b/include/linux/sunrpc/xprt.h index b51470302399..89d10d279a20 100644 --- a/include/linux/sunrpc/xprt.h +++ b/include/linux/sunrpc/xprt.h | |||
| @@ -64,6 +64,7 @@ struct rpc_rqst { | |||
| 64 | * This is the private part | 64 | * This is the private part |
| 65 | */ | 65 | */ |
| 66 | struct rpc_task * rq_task; /* RPC task data */ | 66 | struct rpc_task * rq_task; /* RPC task data */ |
| 67 | struct rpc_cred * rq_cred; /* Bound cred */ | ||
| 67 | __be32 rq_xid; /* request XID */ | 68 | __be32 rq_xid; /* request XID */ |
| 68 | int rq_cong; /* has incremented xprt->cong */ | 69 | int rq_cong; /* has incremented xprt->cong */ |
| 69 | u32 rq_seqno; /* gss seq no. used on req. */ | 70 | u32 rq_seqno; /* gss seq no. used on req. */ |
| @@ -223,6 +224,7 @@ struct rpc_xprt { | |||
| 223 | bklog_u; /* backlog queue utilization */ | 224 | bklog_u; /* backlog queue utilization */ |
| 224 | } stat; | 225 | } stat; |
| 225 | 226 | ||
| 227 | struct net *xprt_net; | ||
| 226 | const char *address_strings[RPC_DISPLAY_MAX]; | 228 | const char *address_strings[RPC_DISPLAY_MAX]; |
| 227 | }; | 229 | }; |
| 228 | 230 | ||
| @@ -248,6 +250,7 @@ static inline int bc_prealloc(struct rpc_rqst *req) | |||
| 248 | 250 | ||
| 249 | struct xprt_create { | 251 | struct xprt_create { |
| 250 | int ident; /* XPRT_TRANSPORT identifier */ | 252 | int ident; /* XPRT_TRANSPORT identifier */ |
| 253 | struct net * net; | ||
| 251 | struct sockaddr * srcaddr; /* optional local address */ | 254 | struct sockaddr * srcaddr; /* optional local address */ |
| 252 | struct sockaddr * dstaddr; /* remote peer address */ | 255 | struct sockaddr * dstaddr; /* remote peer address */ |
| 253 | size_t addrlen; | 256 | size_t addrlen; |
| @@ -279,6 +282,8 @@ void xprt_release_xprt_cong(struct rpc_xprt *xprt, struct rpc_task *task); | |||
| 279 | void xprt_release(struct rpc_task *task); | 282 | void xprt_release(struct rpc_task *task); |
| 280 | struct rpc_xprt * xprt_get(struct rpc_xprt *xprt); | 283 | struct rpc_xprt * xprt_get(struct rpc_xprt *xprt); |
| 281 | void xprt_put(struct rpc_xprt *xprt); | 284 | void xprt_put(struct rpc_xprt *xprt); |
| 285 | struct rpc_xprt * xprt_alloc(struct net *net, int size, int max_req); | ||
| 286 | void xprt_free(struct rpc_xprt *); | ||
| 282 | 287 | ||
| 283 | static inline __be32 *xprt_skip_transport_header(struct rpc_xprt *xprt, __be32 *p) | 288 | static inline __be32 *xprt_skip_transport_header(struct rpc_xprt *xprt, __be32 *p) |
| 284 | { | 289 | { |
diff --git a/include/linux/suspend.h b/include/linux/suspend.h index bc7d6bb4cd8e..26697514c5ec 100644 --- a/include/linux/suspend.h +++ b/include/linux/suspend.h | |||
| @@ -61,14 +61,15 @@ typedef int __bitwise suspend_state_t; | |||
| 61 | * before device drivers' late suspend callbacks are executed. It returns | 61 | * before device drivers' late suspend callbacks are executed. It returns |
| 62 | * 0 on success or a negative error code otherwise, in which case the | 62 | * 0 on success or a negative error code otherwise, in which case the |
| 63 | * system cannot enter the desired sleep state (@prepare_late(), @enter(), | 63 | * system cannot enter the desired sleep state (@prepare_late(), @enter(), |
| 64 | * @wake(), and @finish() will not be called in that case). | 64 | * and @wake() will not be called in that case). |
| 65 | * | 65 | * |
| 66 | * @prepare_late: Finish preparing the platform for entering the system sleep | 66 | * @prepare_late: Finish preparing the platform for entering the system sleep |
| 67 | * state indicated by @begin(). | 67 | * state indicated by @begin(). |
| 68 | * @prepare_late is called before disabling nonboot CPUs and after | 68 | * @prepare_late is called before disabling nonboot CPUs and after |
| 69 | * device drivers' late suspend callbacks have been executed. It returns | 69 | * device drivers' late suspend callbacks have been executed. It returns |
| 70 | * 0 on success or a negative error code otherwise, in which case the | 70 | * 0 on success or a negative error code otherwise, in which case the |
| 71 | * system cannot enter the desired sleep state (@enter() and @wake()). | 71 | * system cannot enter the desired sleep state (@enter() will not be |
| 72 | * executed). | ||
| 72 | * | 73 | * |
| 73 | * @enter: Enter the system sleep state indicated by @begin() or represented by | 74 | * @enter: Enter the system sleep state indicated by @begin() or represented by |
| 74 | * the argument if @begin() is not implemented. | 75 | * the argument if @begin() is not implemented. |
| @@ -81,14 +82,15 @@ typedef int __bitwise suspend_state_t; | |||
| 81 | * resume callbacks are executed. | 82 | * resume callbacks are executed. |
| 82 | * This callback is optional, but should be implemented by the platforms | 83 | * This callback is optional, but should be implemented by the platforms |
| 83 | * that implement @prepare_late(). If implemented, it is always called | 84 | * that implement @prepare_late(). If implemented, it is always called |
| 84 | * after @enter(), even if @enter() fails. | 85 | * after @prepare_late and @enter(), even if one of them fails. |
| 85 | * | 86 | * |
| 86 | * @finish: Finish wake-up of the platform. | 87 | * @finish: Finish wake-up of the platform. |
| 87 | * @finish is called right prior to calling device drivers' regular suspend | 88 | * @finish is called right prior to calling device drivers' regular suspend |
| 88 | * callbacks. | 89 | * callbacks. |
| 89 | * This callback is optional, but should be implemented by the platforms | 90 | * This callback is optional, but should be implemented by the platforms |
| 90 | * that implement @prepare(). If implemented, it is always called after | 91 | * that implement @prepare(). If implemented, it is always called after |
| 91 | * @enter() and @wake(), if implemented, even if any of them fails. | 92 | * @enter() and @wake(), even if any of them fails. It is executed after |
| 93 | * a failing @prepare. | ||
| 92 | * | 94 | * |
| 93 | * @end: Called by the PM core right after resuming devices, to indicate to | 95 | * @end: Called by the PM core right after resuming devices, to indicate to |
| 94 | * the platform that the system has returned to the working state or | 96 | * the platform that the system has returned to the working state or |
| @@ -286,6 +288,13 @@ extern int unregister_pm_notifier(struct notifier_block *nb); | |||
| 286 | { .notifier_call = fn, .priority = pri }; \ | 288 | { .notifier_call = fn, .priority = pri }; \ |
| 287 | register_pm_notifier(&fn##_nb); \ | 289 | register_pm_notifier(&fn##_nb); \ |
| 288 | } | 290 | } |
| 291 | |||
| 292 | /* drivers/base/power/wakeup.c */ | ||
| 293 | extern bool events_check_enabled; | ||
| 294 | |||
| 295 | extern bool pm_check_wakeup_events(void); | ||
| 296 | extern bool pm_get_wakeup_count(unsigned int *count); | ||
| 297 | extern bool pm_save_wakeup_count(unsigned int count); | ||
| 289 | #else /* !CONFIG_PM_SLEEP */ | 298 | #else /* !CONFIG_PM_SLEEP */ |
| 290 | 299 | ||
| 291 | static inline int register_pm_notifier(struct notifier_block *nb) | 300 | static inline int register_pm_notifier(struct notifier_block *nb) |
| @@ -299,6 +308,8 @@ static inline int unregister_pm_notifier(struct notifier_block *nb) | |||
| 299 | } | 308 | } |
| 300 | 309 | ||
| 301 | #define pm_notifier(fn, pri) do { (void)(fn); } while (0) | 310 | #define pm_notifier(fn, pri) do { (void)(fn); } while (0) |
| 311 | |||
| 312 | static inline bool pm_check_wakeup_events(void) { return true; } | ||
| 302 | #endif /* !CONFIG_PM_SLEEP */ | 313 | #endif /* !CONFIG_PM_SLEEP */ |
| 303 | 314 | ||
| 304 | extern struct mutex pm_mutex; | 315 | extern struct mutex pm_mutex; |
diff --git a/include/linux/swap.h b/include/linux/swap.h index ff4acea9bbdb..eba53e71d2cc 100644 --- a/include/linux/swap.h +++ b/include/linux/swap.h | |||
| @@ -19,6 +19,7 @@ struct bio; | |||
| 19 | #define SWAP_FLAG_PREFER 0x8000 /* set if swap priority specified */ | 19 | #define SWAP_FLAG_PREFER 0x8000 /* set if swap priority specified */ |
| 20 | #define SWAP_FLAG_PRIO_MASK 0x7fff | 20 | #define SWAP_FLAG_PRIO_MASK 0x7fff |
| 21 | #define SWAP_FLAG_PRIO_SHIFT 0 | 21 | #define SWAP_FLAG_PRIO_SHIFT 0 |
| 22 | #define SWAP_FLAG_DISCARD 0x10000 /* discard swap cluster after use */ | ||
| 22 | 23 | ||
| 23 | static inline int current_is_kswapd(void) | 24 | static inline int current_is_kswapd(void) |
| 24 | { | 25 | { |
| @@ -142,7 +143,7 @@ struct swap_extent { | |||
| 142 | enum { | 143 | enum { |
| 143 | SWP_USED = (1 << 0), /* is slot in swap_info[] used? */ | 144 | SWP_USED = (1 << 0), /* is slot in swap_info[] used? */ |
| 144 | SWP_WRITEOK = (1 << 1), /* ok to write to this swap? */ | 145 | SWP_WRITEOK = (1 << 1), /* ok to write to this swap? */ |
| 145 | SWP_DISCARDABLE = (1 << 2), /* blkdev supports discard */ | 146 | SWP_DISCARDABLE = (1 << 2), /* swapon+blkdev support discard */ |
| 146 | SWP_DISCARDING = (1 << 3), /* now discarding a free cluster */ | 147 | SWP_DISCARDING = (1 << 3), /* now discarding a free cluster */ |
| 147 | SWP_SOLIDSTATE = (1 << 4), /* blkdev seeks are cheap */ | 148 | SWP_SOLIDSTATE = (1 << 4), /* blkdev seeks are cheap */ |
| 148 | SWP_CONTINUED = (1 << 5), /* swap_map has count continuation */ | 149 | SWP_CONTINUED = (1 << 5), /* swap_map has count continuation */ |
| @@ -244,8 +245,7 @@ extern unsigned long try_to_free_mem_cgroup_pages(struct mem_cgroup *mem, | |||
| 244 | extern unsigned long mem_cgroup_shrink_node_zone(struct mem_cgroup *mem, | 245 | extern unsigned long mem_cgroup_shrink_node_zone(struct mem_cgroup *mem, |
| 245 | gfp_t gfp_mask, bool noswap, | 246 | gfp_t gfp_mask, bool noswap, |
| 246 | unsigned int swappiness, | 247 | unsigned int swappiness, |
| 247 | struct zone *zone, | 248 | struct zone *zone); |
| 248 | int nid); | ||
| 249 | extern int __isolate_lru_page(struct page *page, int mode, int file); | 249 | extern int __isolate_lru_page(struct page *page, int mode, int file); |
| 250 | extern unsigned long shrink_all_memory(unsigned long nr_pages); | 250 | extern unsigned long shrink_all_memory(unsigned long nr_pages); |
| 251 | extern int vm_swappiness; | 251 | extern int vm_swappiness; |
| @@ -271,8 +271,18 @@ extern void scan_mapping_unevictable_pages(struct address_space *); | |||
| 271 | extern unsigned long scan_unevictable_pages; | 271 | extern unsigned long scan_unevictable_pages; |
| 272 | extern int scan_unevictable_handler(struct ctl_table *, int, | 272 | extern int scan_unevictable_handler(struct ctl_table *, int, |
| 273 | void __user *, size_t *, loff_t *); | 273 | void __user *, size_t *, loff_t *); |
| 274 | #ifdef CONFIG_NUMA | ||
| 274 | extern int scan_unevictable_register_node(struct node *node); | 275 | extern int scan_unevictable_register_node(struct node *node); |
| 275 | extern void scan_unevictable_unregister_node(struct node *node); | 276 | extern void scan_unevictable_unregister_node(struct node *node); |
| 277 | #else | ||
| 278 | static inline int scan_unevictable_register_node(struct node *node) | ||
| 279 | { | ||
| 280 | return 0; | ||
| 281 | } | ||
| 282 | static inline void scan_unevictable_unregister_node(struct node *node) | ||
| 283 | { | ||
| 284 | } | ||
| 285 | #endif | ||
| 276 | 286 | ||
| 277 | extern int kswapd_run(int nid); | 287 | extern int kswapd_run(int nid); |
| 278 | extern void kswapd_stop(int nid); | 288 | extern void kswapd_stop(int nid); |
diff --git a/include/linux/swiotlb.h b/include/linux/swiotlb.h index 81a4e213c6cf..8c0e349f4a6c 100644 --- a/include/linux/swiotlb.h +++ b/include/linux/swiotlb.h | |||
| @@ -23,6 +23,29 @@ extern int swiotlb_force; | |||
| 23 | #define IO_TLB_SHIFT 11 | 23 | #define IO_TLB_SHIFT 11 |
| 24 | 24 | ||
| 25 | extern void swiotlb_init(int verbose); | 25 | extern void swiotlb_init(int verbose); |
| 26 | extern void swiotlb_init_with_tbl(char *tlb, unsigned long nslabs, int verbose); | ||
| 27 | |||
| 28 | /* | ||
| 29 | * Enumeration for sync targets | ||
| 30 | */ | ||
| 31 | enum dma_sync_target { | ||
| 32 | SYNC_FOR_CPU = 0, | ||
| 33 | SYNC_FOR_DEVICE = 1, | ||
| 34 | }; | ||
| 35 | extern void *swiotlb_tbl_map_single(struct device *hwdev, dma_addr_t tbl_dma_addr, | ||
| 36 | phys_addr_t phys, size_t size, | ||
| 37 | enum dma_data_direction dir); | ||
| 38 | |||
| 39 | extern void swiotlb_tbl_unmap_single(struct device *hwdev, char *dma_addr, | ||
| 40 | size_t size, enum dma_data_direction dir); | ||
| 41 | |||
| 42 | extern void swiotlb_tbl_sync_single(struct device *hwdev, char *dma_addr, | ||
| 43 | size_t size, enum dma_data_direction dir, | ||
| 44 | enum dma_sync_target target); | ||
| 45 | |||
| 46 | /* Accessory functions. */ | ||
| 47 | extern void swiotlb_bounce(phys_addr_t phys, char *dma_addr, size_t size, | ||
| 48 | enum dma_data_direction dir); | ||
| 26 | 49 | ||
| 27 | extern void | 50 | extern void |
| 28 | *swiotlb_alloc_coherent(struct device *hwdev, size_t size, | 51 | *swiotlb_alloc_coherent(struct device *hwdev, size_t size, |
| @@ -42,11 +65,11 @@ extern void swiotlb_unmap_page(struct device *hwdev, dma_addr_t dev_addr, | |||
| 42 | 65 | ||
| 43 | extern int | 66 | extern int |
| 44 | swiotlb_map_sg(struct device *hwdev, struct scatterlist *sg, int nents, | 67 | swiotlb_map_sg(struct device *hwdev, struct scatterlist *sg, int nents, |
| 45 | int direction); | 68 | enum dma_data_direction dir); |
| 46 | 69 | ||
| 47 | extern void | 70 | extern void |
| 48 | swiotlb_unmap_sg(struct device *hwdev, struct scatterlist *sg, int nents, | 71 | swiotlb_unmap_sg(struct device *hwdev, struct scatterlist *sg, int nents, |
| 49 | int direction); | 72 | enum dma_data_direction dir); |
| 50 | 73 | ||
| 51 | extern int | 74 | extern int |
| 52 | swiotlb_map_sg_attrs(struct device *hwdev, struct scatterlist *sgl, int nelems, | 75 | swiotlb_map_sg_attrs(struct device *hwdev, struct scatterlist *sgl, int nelems, |
diff --git a/include/linux/synclink.h b/include/linux/synclink.h index 0ff2779c44d0..2e7d81c4e5ad 100644 --- a/include/linux/synclink.h +++ b/include/linux/synclink.h | |||
| @@ -126,6 +126,7 @@ | |||
| 126 | #define MGSL_MODE_BISYNC 4 | 126 | #define MGSL_MODE_BISYNC 4 |
| 127 | #define MGSL_MODE_RAW 6 | 127 | #define MGSL_MODE_RAW 6 |
| 128 | #define MGSL_MODE_BASE_CLOCK 7 | 128 | #define MGSL_MODE_BASE_CLOCK 7 |
| 129 | #define MGSL_MODE_XSYNC 8 | ||
| 129 | 130 | ||
| 130 | #define MGSL_BUS_TYPE_ISA 1 | 131 | #define MGSL_BUS_TYPE_ISA 1 |
| 131 | #define MGSL_BUS_TYPE_EISA 2 | 132 | #define MGSL_BUS_TYPE_EISA 2 |
| @@ -290,6 +291,10 @@ struct gpio_desc { | |||
| 290 | #define MGSL_IOCSGPIO _IOW(MGSL_MAGIC_IOC,16,struct gpio_desc) | 291 | #define MGSL_IOCSGPIO _IOW(MGSL_MAGIC_IOC,16,struct gpio_desc) |
| 291 | #define MGSL_IOCGGPIO _IOR(MGSL_MAGIC_IOC,17,struct gpio_desc) | 292 | #define MGSL_IOCGGPIO _IOR(MGSL_MAGIC_IOC,17,struct gpio_desc) |
| 292 | #define MGSL_IOCWAITGPIO _IOWR(MGSL_MAGIC_IOC,18,struct gpio_desc) | 293 | #define MGSL_IOCWAITGPIO _IOWR(MGSL_MAGIC_IOC,18,struct gpio_desc) |
| 294 | #define MGSL_IOCSXSYNC _IO(MGSL_MAGIC_IOC, 19) | ||
| 295 | #define MGSL_IOCGXSYNC _IO(MGSL_MAGIC_IOC, 20) | ||
| 296 | #define MGSL_IOCSXCTRL _IO(MGSL_MAGIC_IOC, 21) | ||
| 297 | #define MGSL_IOCGXCTRL _IO(MGSL_MAGIC_IOC, 22) | ||
| 293 | 298 | ||
| 294 | #ifdef __KERNEL__ | 299 | #ifdef __KERNEL__ |
| 295 | /* provide 32 bit ioctl compatibility on 64 bit systems */ | 300 | /* provide 32 bit ioctl compatibility on 64 bit systems */ |
diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h index 13ebb5413a79..cacc27a0e285 100644 --- a/include/linux/syscalls.h +++ b/include/linux/syscalls.h | |||
| @@ -35,6 +35,7 @@ struct oldold_utsname; | |||
| 35 | struct old_utsname; | 35 | struct old_utsname; |
| 36 | struct pollfd; | 36 | struct pollfd; |
| 37 | struct rlimit; | 37 | struct rlimit; |
| 38 | struct rlimit64; | ||
| 38 | struct rusage; | 39 | struct rusage; |
| 39 | struct sched_param; | 40 | struct sched_param; |
| 40 | struct sel_arg_struct; | 41 | struct sel_arg_struct; |
| @@ -167,7 +168,6 @@ extern struct trace_event_functions exit_syscall_print_funcs; | |||
| 167 | .enter_event = &event_enter_##sname, \ | 168 | .enter_event = &event_enter_##sname, \ |
| 168 | .exit_event = &event_exit_##sname, \ | 169 | .exit_event = &event_exit_##sname, \ |
| 169 | .enter_fields = LIST_HEAD_INIT(__syscall_meta_##sname.enter_fields), \ | 170 | .enter_fields = LIST_HEAD_INIT(__syscall_meta_##sname.enter_fields), \ |
| 170 | .exit_fields = LIST_HEAD_INIT(__syscall_meta_##sname.exit_fields), \ | ||
| 171 | }; | 171 | }; |
| 172 | 172 | ||
| 173 | #define SYSCALL_DEFINE0(sname) \ | 173 | #define SYSCALL_DEFINE0(sname) \ |
| @@ -182,7 +182,6 @@ extern struct trace_event_functions exit_syscall_print_funcs; | |||
| 182 | .enter_event = &event_enter__##sname, \ | 182 | .enter_event = &event_enter__##sname, \ |
| 183 | .exit_event = &event_exit__##sname, \ | 183 | .exit_event = &event_exit__##sname, \ |
| 184 | .enter_fields = LIST_HEAD_INIT(__syscall_meta__##sname.enter_fields), \ | 184 | .enter_fields = LIST_HEAD_INIT(__syscall_meta__##sname.enter_fields), \ |
| 185 | .exit_fields = LIST_HEAD_INIT(__syscall_meta__##sname.exit_fields), \ | ||
| 186 | }; \ | 185 | }; \ |
| 187 | asmlinkage long sys_##sname(void) | 186 | asmlinkage long sys_##sname(void) |
| 188 | #else | 187 | #else |
| @@ -395,7 +394,7 @@ asmlinkage long sys_umount(char __user *name, int flags); | |||
| 395 | asmlinkage long sys_oldumount(char __user *name); | 394 | asmlinkage long sys_oldumount(char __user *name); |
| 396 | asmlinkage long sys_truncate(const char __user *path, long length); | 395 | asmlinkage long sys_truncate(const char __user *path, long length); |
| 397 | asmlinkage long sys_ftruncate(unsigned int fd, unsigned long length); | 396 | asmlinkage long sys_ftruncate(unsigned int fd, unsigned long length); |
| 398 | asmlinkage long sys_stat(char __user *filename, | 397 | asmlinkage long sys_stat(const char __user *filename, |
| 399 | struct __old_kernel_stat __user *statbuf); | 398 | struct __old_kernel_stat __user *statbuf); |
| 400 | asmlinkage long sys_statfs(const char __user * path, | 399 | asmlinkage long sys_statfs(const char __user * path, |
| 401 | struct statfs __user *buf); | 400 | struct statfs __user *buf); |
| @@ -404,21 +403,21 @@ asmlinkage long sys_statfs64(const char __user *path, size_t sz, | |||
| 404 | asmlinkage long sys_fstatfs(unsigned int fd, struct statfs __user *buf); | 403 | asmlinkage long sys_fstatfs(unsigned int fd, struct statfs __user *buf); |
| 405 | asmlinkage long sys_fstatfs64(unsigned int fd, size_t sz, | 404 | asmlinkage long sys_fstatfs64(unsigned int fd, size_t sz, |
| 406 | struct statfs64 __user *buf); | 405 | struct statfs64 __user *buf); |
| 407 | asmlinkage long sys_lstat(char __user *filename, | 406 | asmlinkage long sys_lstat(const char __user *filename, |
| 408 | struct __old_kernel_stat __user *statbuf); | 407 | struct __old_kernel_stat __user *statbuf); |
| 409 | asmlinkage long sys_fstat(unsigned int fd, | 408 | asmlinkage long sys_fstat(unsigned int fd, |
| 410 | struct __old_kernel_stat __user *statbuf); | 409 | struct __old_kernel_stat __user *statbuf); |
| 411 | asmlinkage long sys_newstat(char __user *filename, | 410 | asmlinkage long sys_newstat(const char __user *filename, |
| 412 | struct stat __user *statbuf); | 411 | struct stat __user *statbuf); |
| 413 | asmlinkage long sys_newlstat(char __user *filename, | 412 | asmlinkage long sys_newlstat(const char __user *filename, |
| 414 | struct stat __user *statbuf); | 413 | struct stat __user *statbuf); |
| 415 | asmlinkage long sys_newfstat(unsigned int fd, struct stat __user *statbuf); | 414 | asmlinkage long sys_newfstat(unsigned int fd, struct stat __user *statbuf); |
| 416 | asmlinkage long sys_ustat(unsigned dev, struct ustat __user *ubuf); | 415 | asmlinkage long sys_ustat(unsigned dev, struct ustat __user *ubuf); |
| 417 | #if BITS_PER_LONG == 32 | 416 | #if BITS_PER_LONG == 32 |
| 418 | asmlinkage long sys_stat64(char __user *filename, | 417 | asmlinkage long sys_stat64(const char __user *filename, |
| 419 | struct stat64 __user *statbuf); | 418 | struct stat64 __user *statbuf); |
| 420 | asmlinkage long sys_fstat64(unsigned long fd, struct stat64 __user *statbuf); | 419 | asmlinkage long sys_fstat64(unsigned long fd, struct stat64 __user *statbuf); |
| 421 | asmlinkage long sys_lstat64(char __user *filename, | 420 | asmlinkage long sys_lstat64(const char __user *filename, |
| 422 | struct stat64 __user *statbuf); | 421 | struct stat64 __user *statbuf); |
| 423 | asmlinkage long sys_truncate64(const char __user *path, loff_t length); | 422 | asmlinkage long sys_truncate64(const char __user *path, loff_t length); |
| 424 | asmlinkage long sys_ftruncate64(unsigned int fd, loff_t length); | 423 | asmlinkage long sys_ftruncate64(unsigned int fd, loff_t length); |
| @@ -646,6 +645,9 @@ asmlinkage long sys_old_getrlimit(unsigned int resource, struct rlimit __user *r | |||
| 646 | #endif | 645 | #endif |
| 647 | asmlinkage long sys_setrlimit(unsigned int resource, | 646 | asmlinkage long sys_setrlimit(unsigned int resource, |
| 648 | struct rlimit __user *rlim); | 647 | struct rlimit __user *rlim); |
| 648 | asmlinkage long sys_prlimit64(pid_t pid, unsigned int resource, | ||
| 649 | const struct rlimit64 __user *new_rlim, | ||
| 650 | struct rlimit64 __user *old_rlim); | ||
| 649 | asmlinkage long sys_getrusage(int who, struct rusage __user *ru); | 651 | asmlinkage long sys_getrusage(int who, struct rusage __user *ru); |
| 650 | asmlinkage long sys_umask(int mask); | 652 | asmlinkage long sys_umask(int mask); |
| 651 | 653 | ||
| @@ -699,7 +701,8 @@ asmlinkage long sys_nfsservctl(int cmd, | |||
| 699 | asmlinkage long sys_syslog(int type, char __user *buf, int len); | 701 | asmlinkage long sys_syslog(int type, char __user *buf, int len); |
| 700 | asmlinkage long sys_uselib(const char __user *library); | 702 | asmlinkage long sys_uselib(const char __user *library); |
| 701 | asmlinkage long sys_ni_syscall(void); | 703 | asmlinkage long sys_ni_syscall(void); |
| 702 | asmlinkage long sys_ptrace(long request, long pid, long addr, long data); | 704 | asmlinkage long sys_ptrace(long request, long pid, unsigned long addr, |
| 705 | unsigned long data); | ||
| 703 | 706 | ||
| 704 | asmlinkage long sys_add_key(const char __user *_type, | 707 | asmlinkage long sys_add_key(const char __user *_type, |
| 705 | const char __user *_description, | 708 | const char __user *_description, |
| @@ -758,7 +761,7 @@ asmlinkage long sys_linkat(int olddfd, const char __user *oldname, | |||
| 758 | int newdfd, const char __user *newname, int flags); | 761 | int newdfd, const char __user *newname, int flags); |
| 759 | asmlinkage long sys_renameat(int olddfd, const char __user * oldname, | 762 | asmlinkage long sys_renameat(int olddfd, const char __user * oldname, |
| 760 | int newdfd, const char __user * newname); | 763 | int newdfd, const char __user * newname); |
| 761 | asmlinkage long sys_futimesat(int dfd, char __user *filename, | 764 | asmlinkage long sys_futimesat(int dfd, const char __user *filename, |
| 762 | struct timeval __user *utimes); | 765 | struct timeval __user *utimes); |
| 763 | asmlinkage long sys_faccessat(int dfd, const char __user *filename, int mode); | 766 | asmlinkage long sys_faccessat(int dfd, const char __user *filename, int mode); |
| 764 | asmlinkage long sys_fchmodat(int dfd, const char __user * filename, | 767 | asmlinkage long sys_fchmodat(int dfd, const char __user * filename, |
| @@ -767,13 +770,13 @@ asmlinkage long sys_fchownat(int dfd, const char __user *filename, uid_t user, | |||
| 767 | gid_t group, int flag); | 770 | gid_t group, int flag); |
| 768 | asmlinkage long sys_openat(int dfd, const char __user *filename, int flags, | 771 | asmlinkage long sys_openat(int dfd, const char __user *filename, int flags, |
| 769 | int mode); | 772 | int mode); |
| 770 | asmlinkage long sys_newfstatat(int dfd, char __user *filename, | 773 | asmlinkage long sys_newfstatat(int dfd, const char __user *filename, |
| 771 | struct stat __user *statbuf, int flag); | 774 | struct stat __user *statbuf, int flag); |
| 772 | asmlinkage long sys_fstatat64(int dfd, char __user *filename, | 775 | asmlinkage long sys_fstatat64(int dfd, const char __user *filename, |
| 773 | struct stat64 __user *statbuf, int flag); | 776 | struct stat64 __user *statbuf, int flag); |
| 774 | asmlinkage long sys_readlinkat(int dfd, const char __user *path, char __user *buf, | 777 | asmlinkage long sys_readlinkat(int dfd, const char __user *path, char __user *buf, |
| 775 | int bufsiz); | 778 | int bufsiz); |
| 776 | asmlinkage long sys_utimensat(int dfd, char __user *filename, | 779 | asmlinkage long sys_utimensat(int dfd, const char __user *filename, |
| 777 | struct timespec __user *utimes, int flags); | 780 | struct timespec __user *utimes, int flags); |
| 778 | asmlinkage long sys_unshare(unsigned long unshare_flags); | 781 | asmlinkage long sys_unshare(unsigned long unshare_flags); |
| 779 | 782 | ||
| @@ -813,8 +816,12 @@ asmlinkage long sys_pselect6(int, fd_set __user *, fd_set __user *, | |||
| 813 | asmlinkage long sys_ppoll(struct pollfd __user *, unsigned int, | 816 | asmlinkage long sys_ppoll(struct pollfd __user *, unsigned int, |
| 814 | struct timespec __user *, const sigset_t __user *, | 817 | struct timespec __user *, const sigset_t __user *, |
| 815 | size_t); | 818 | size_t); |
| 819 | asmlinkage long sys_fanotify_init(unsigned int flags, unsigned int event_f_flags); | ||
| 820 | asmlinkage long sys_fanotify_mark(int fanotify_fd, unsigned int flags, | ||
| 821 | u64 mask, int fd, | ||
| 822 | const char __user *pathname); | ||
| 816 | 823 | ||
| 817 | int kernel_execve(const char *filename, char *const argv[], char *const envp[]); | 824 | int kernel_execve(const char *filename, const char *const argv[], const char *const envp[]); |
| 818 | 825 | ||
| 819 | 826 | ||
| 820 | asmlinkage long sys_perf_event_open( | 827 | asmlinkage long sys_perf_event_open( |
diff --git a/include/linux/sysfs.h b/include/linux/sysfs.h index f2694eb4dd3d..30b881555fa5 100644 --- a/include/linux/sysfs.h +++ b/include/linux/sysfs.h | |||
| @@ -16,20 +16,15 @@ | |||
| 16 | #include <linux/errno.h> | 16 | #include <linux/errno.h> |
| 17 | #include <linux/list.h> | 17 | #include <linux/list.h> |
| 18 | #include <linux/lockdep.h> | 18 | #include <linux/lockdep.h> |
| 19 | #include <linux/kobject_ns.h> | ||
| 19 | #include <asm/atomic.h> | 20 | #include <asm/atomic.h> |
| 20 | 21 | ||
| 21 | struct kobject; | 22 | struct kobject; |
| 22 | struct module; | 23 | struct module; |
| 23 | enum kobj_ns_type; | 24 | enum kobj_ns_type; |
| 24 | 25 | ||
| 25 | /* FIXME | ||
| 26 | * The *owner field is no longer used. | ||
| 27 | * x86 tree has been cleaned up. The owner | ||
| 28 | * attribute is still left for other arches. | ||
| 29 | */ | ||
| 30 | struct attribute { | 26 | struct attribute { |
| 31 | const char *name; | 27 | const char *name; |
| 32 | struct module *owner; | ||
| 33 | mode_t mode; | 28 | mode_t mode; |
| 34 | #ifdef CONFIG_DEBUG_LOCK_ALLOC | 29 | #ifdef CONFIG_DEBUG_LOCK_ALLOC |
| 35 | struct lock_class_key *key; | 30 | struct lock_class_key *key; |
| @@ -136,8 +131,8 @@ int __must_check sysfs_create_file(struct kobject *kobj, | |||
| 136 | const struct attribute *attr); | 131 | const struct attribute *attr); |
| 137 | int __must_check sysfs_create_files(struct kobject *kobj, | 132 | int __must_check sysfs_create_files(struct kobject *kobj, |
| 138 | const struct attribute **attr); | 133 | const struct attribute **attr); |
| 139 | int __must_check sysfs_chmod_file(struct kobject *kobj, struct attribute *attr, | 134 | int __must_check sysfs_chmod_file(struct kobject *kobj, |
| 140 | mode_t mode); | 135 | const struct attribute *attr, mode_t mode); |
| 141 | void sysfs_remove_file(struct kobject *kobj, const struct attribute *attr); | 136 | void sysfs_remove_file(struct kobject *kobj, const struct attribute *attr); |
| 142 | void sysfs_remove_files(struct kobject *kobj, const struct attribute **attr); | 137 | void sysfs_remove_files(struct kobject *kobj, const struct attribute **attr); |
| 143 | 138 | ||
| @@ -169,6 +164,10 @@ int sysfs_add_file_to_group(struct kobject *kobj, | |||
| 169 | const struct attribute *attr, const char *group); | 164 | const struct attribute *attr, const char *group); |
| 170 | void sysfs_remove_file_from_group(struct kobject *kobj, | 165 | void sysfs_remove_file_from_group(struct kobject *kobj, |
| 171 | const struct attribute *attr, const char *group); | 166 | const struct attribute *attr, const char *group); |
| 167 | int sysfs_merge_group(struct kobject *kobj, | ||
| 168 | const struct attribute_group *grp); | ||
| 169 | void sysfs_unmerge_group(struct kobject *kobj, | ||
| 170 | const struct attribute_group *grp); | ||
| 172 | 171 | ||
| 173 | void sysfs_notify(struct kobject *kobj, const char *dir, const char *attr); | 172 | void sysfs_notify(struct kobject *kobj, const char *dir, const char *attr); |
| 174 | void sysfs_notify_dirent(struct sysfs_dirent *sd); | 173 | void sysfs_notify_dirent(struct sysfs_dirent *sd); |
| @@ -225,7 +224,7 @@ static inline int sysfs_create_files(struct kobject *kobj, | |||
| 225 | } | 224 | } |
| 226 | 225 | ||
| 227 | static inline int sysfs_chmod_file(struct kobject *kobj, | 226 | static inline int sysfs_chmod_file(struct kobject *kobj, |
| 228 | struct attribute *attr, mode_t mode) | 227 | const struct attribute *attr, mode_t mode) |
| 229 | { | 228 | { |
| 230 | return 0; | 229 | return 0; |
| 231 | } | 230 | } |
| @@ -307,6 +306,17 @@ static inline void sysfs_remove_file_from_group(struct kobject *kobj, | |||
| 307 | { | 306 | { |
| 308 | } | 307 | } |
| 309 | 308 | ||
| 309 | static inline int sysfs_merge_group(struct kobject *kobj, | ||
| 310 | const struct attribute_group *grp) | ||
| 311 | { | ||
| 312 | return 0; | ||
| 313 | } | ||
| 314 | |||
| 315 | static inline void sysfs_unmerge_group(struct kobject *kobj, | ||
| 316 | const struct attribute_group *grp) | ||
| 317 | { | ||
| 318 | } | ||
| 319 | |||
| 310 | static inline void sysfs_notify(struct kobject *kobj, const char *dir, | 320 | static inline void sysfs_notify(struct kobject *kobj, const char *dir, |
| 311 | const char *attr) | 321 | const char *attr) |
| 312 | { | 322 | { |
diff --git a/include/linux/sysrq.h b/include/linux/sysrq.h index 609e8ca5f534..387fa7d05c98 100644 --- a/include/linux/sysrq.h +++ b/include/linux/sysrq.h | |||
| @@ -15,9 +15,7 @@ | |||
| 15 | #define _LINUX_SYSRQ_H | 15 | #define _LINUX_SYSRQ_H |
| 16 | 16 | ||
| 17 | #include <linux/errno.h> | 17 | #include <linux/errno.h> |
| 18 | 18 | #include <linux/types.h> | |
| 19 | struct pt_regs; | ||
| 20 | struct tty_struct; | ||
| 21 | 19 | ||
| 22 | /* Possible values of bitmask for enabling sysrq functions */ | 20 | /* Possible values of bitmask for enabling sysrq functions */ |
| 23 | /* 0x0001 is reserved for enable everything */ | 21 | /* 0x0001 is reserved for enable everything */ |
| @@ -31,7 +29,7 @@ struct tty_struct; | |||
| 31 | #define SYSRQ_ENABLE_RTNICE 0x0100 | 29 | #define SYSRQ_ENABLE_RTNICE 0x0100 |
| 32 | 30 | ||
| 33 | struct sysrq_key_op { | 31 | struct sysrq_key_op { |
| 34 | void (*handler)(int, struct tty_struct *); | 32 | void (*handler)(int); |
| 35 | char *help_msg; | 33 | char *help_msg; |
| 36 | char *action_msg; | 34 | char *action_msg; |
| 37 | int enable_mask; | 35 | int enable_mask; |
| @@ -44,8 +42,8 @@ struct sysrq_key_op { | |||
| 44 | * are available -- else NULL's). | 42 | * are available -- else NULL's). |
| 45 | */ | 43 | */ |
| 46 | 44 | ||
| 47 | void handle_sysrq(int key, struct tty_struct *tty); | 45 | void handle_sysrq(int key); |
| 48 | void __handle_sysrq(int key, struct tty_struct *tty, int check_mask); | 46 | void __handle_sysrq(int key, bool check_mask); |
| 49 | int register_sysrq_key(int key, struct sysrq_key_op *op); | 47 | int register_sysrq_key(int key, struct sysrq_key_op *op); |
| 50 | int unregister_sysrq_key(int key, struct sysrq_key_op *op); | 48 | int unregister_sysrq_key(int key, struct sysrq_key_op *op); |
| 51 | struct sysrq_key_op *__sysrq_get_key_op(int key); | 49 | struct sysrq_key_op *__sysrq_get_key_op(int key); |
| @@ -54,7 +52,11 @@ int sysrq_toggle_support(int enable_mask); | |||
| 54 | 52 | ||
| 55 | #else | 53 | #else |
| 56 | 54 | ||
| 57 | static inline void handle_sysrq(int key, struct tty_struct *tty) | 55 | static inline void handle_sysrq(int key) |
| 56 | { | ||
| 57 | } | ||
| 58 | |||
| 59 | static inline void __handle_sysrq(int key, bool check_mask) | ||
| 58 | { | 60 | { |
| 59 | } | 61 | } |
| 60 | 62 | ||
diff --git a/include/linux/sysv_fs.h b/include/linux/sysv_fs.h index 96411306eec6..e47d6d90023d 100644 --- a/include/linux/sysv_fs.h +++ b/include/linux/sysv_fs.h | |||
| @@ -148,6 +148,17 @@ struct v7_super_block { | |||
| 148 | char s_fname[6]; /* file system name */ | 148 | char s_fname[6]; /* file system name */ |
| 149 | char s_fpack[6]; /* file system pack name */ | 149 | char s_fpack[6]; /* file system pack name */ |
| 150 | }; | 150 | }; |
| 151 | /* Constants to aid sanity checking */ | ||
| 152 | /* This is not a hard limit, nor enforced by v7 kernel. It's actually just | ||
| 153 | * the limit used by Seventh Edition's ls, though is high enough to assume | ||
| 154 | * that no reasonable file system would have that much entries in root | ||
| 155 | * directory. Thus, if we see anything higher, we just probably got the | ||
| 156 | * endiannes wrong. */ | ||
| 157 | #define V7_NFILES 1024 | ||
| 158 | /* The disk addresses are three-byte (despite direct block addresses being | ||
| 159 | * aligned word-wise in inode). If the most significant byte is non-zero, | ||
| 160 | * something is most likely wrong (not a filesystem, bad bytesex). */ | ||
| 161 | #define V7_MAXSIZE 0x00ffffff | ||
| 151 | 162 | ||
| 152 | /* Coherent super-block data on disk */ | 163 | /* Coherent super-block data on disk */ |
| 153 | #define COH_NICINOD 100 /* number of inode cache entries */ | 164 | #define COH_NICINOD 100 /* number of inode cache entries */ |
diff --git a/include/linux/tc_act/Kbuild b/include/linux/tc_act/Kbuild index 76990937f4c9..67b501c302b2 100644 --- a/include/linux/tc_act/Kbuild +++ b/include/linux/tc_act/Kbuild | |||
| @@ -4,3 +4,4 @@ header-y += tc_mirred.h | |||
| 4 | header-y += tc_pedit.h | 4 | header-y += tc_pedit.h |
| 5 | header-y += tc_nat.h | 5 | header-y += tc_nat.h |
| 6 | header-y += tc_skbedit.h | 6 | header-y += tc_skbedit.h |
| 7 | header-y += tc_csum.h | ||
diff --git a/include/linux/tc_act/tc_csum.h b/include/linux/tc_act/tc_csum.h new file mode 100644 index 000000000000..a047c49a3153 --- /dev/null +++ b/include/linux/tc_act/tc_csum.h | |||
| @@ -0,0 +1,32 @@ | |||
| 1 | #ifndef __LINUX_TC_CSUM_H | ||
| 2 | #define __LINUX_TC_CSUM_H | ||
| 3 | |||
| 4 | #include <linux/types.h> | ||
| 5 | #include <linux/pkt_cls.h> | ||
| 6 | |||
| 7 | #define TCA_ACT_CSUM 16 | ||
| 8 | |||
| 9 | enum { | ||
| 10 | TCA_CSUM_UNSPEC, | ||
| 11 | TCA_CSUM_PARMS, | ||
| 12 | TCA_CSUM_TM, | ||
| 13 | __TCA_CSUM_MAX | ||
| 14 | }; | ||
| 15 | #define TCA_CSUM_MAX (__TCA_CSUM_MAX - 1) | ||
| 16 | |||
| 17 | enum { | ||
| 18 | TCA_CSUM_UPDATE_FLAG_IPV4HDR = 1, | ||
| 19 | TCA_CSUM_UPDATE_FLAG_ICMP = 2, | ||
| 20 | TCA_CSUM_UPDATE_FLAG_IGMP = 4, | ||
| 21 | TCA_CSUM_UPDATE_FLAG_TCP = 8, | ||
| 22 | TCA_CSUM_UPDATE_FLAG_UDP = 16, | ||
| 23 | TCA_CSUM_UPDATE_FLAG_UDPLITE = 32 | ||
| 24 | }; | ||
| 25 | |||
| 26 | struct tc_csum { | ||
| 27 | tc_gen; | ||
| 28 | |||
| 29 | __u32 update_flags; | ||
| 30 | }; | ||
| 31 | |||
| 32 | #endif /* __LINUX_TC_CSUM_H */ | ||
diff --git a/include/linux/tc_ematch/tc_em_meta.h b/include/linux/tc_ematch/tc_em_meta.h index 0864206ec1a3..7138962664f8 100644 --- a/include/linux/tc_ematch/tc_em_meta.h +++ b/include/linux/tc_ematch/tc_em_meta.h | |||
| @@ -79,6 +79,7 @@ enum { | |||
| 79 | TCF_META_ID_SK_SENDMSG_OFF, | 79 | TCF_META_ID_SK_SENDMSG_OFF, |
| 80 | TCF_META_ID_SK_WRITE_PENDING, | 80 | TCF_META_ID_SK_WRITE_PENDING, |
| 81 | TCF_META_ID_VLAN_TAG, | 81 | TCF_META_ID_VLAN_TAG, |
| 82 | TCF_META_ID_RXHASH, | ||
| 82 | __TCF_META_ID_MAX | 83 | __TCF_META_ID_MAX |
| 83 | }; | 84 | }; |
| 84 | #define TCF_META_ID_MAX (__TCF_META_ID_MAX - 1) | 85 | #define TCF_META_ID_MAX (__TCF_META_ID_MAX - 1) |
diff --git a/include/linux/tcp.h b/include/linux/tcp.h index a778ee024590..e64f4c67d0ef 100644 --- a/include/linux/tcp.h +++ b/include/linux/tcp.h | |||
| @@ -105,6 +105,7 @@ enum { | |||
| 105 | #define TCP_COOKIE_TRANSACTIONS 15 /* TCP Cookie Transactions */ | 105 | #define TCP_COOKIE_TRANSACTIONS 15 /* TCP Cookie Transactions */ |
| 106 | #define TCP_THIN_LINEAR_TIMEOUTS 16 /* Use linear timeouts for thin streams*/ | 106 | #define TCP_THIN_LINEAR_TIMEOUTS 16 /* Use linear timeouts for thin streams*/ |
| 107 | #define TCP_THIN_DUPACK 17 /* Fast retrans. after 1 dupack */ | 107 | #define TCP_THIN_DUPACK 17 /* Fast retrans. after 1 dupack */ |
| 108 | #define TCP_USER_TIMEOUT 18 /* How long for loss retry before timeout */ | ||
| 108 | 109 | ||
| 109 | /* for TCP_INFO socket option */ | 110 | /* for TCP_INFO socket option */ |
| 110 | #define TCPI_OPT_TIMESTAMPS 1 | 111 | #define TCPI_OPT_TIMESTAMPS 1 |
diff --git a/include/linux/thread_info.h b/include/linux/thread_info.h index a8cc4e13434c..c90696544176 100644 --- a/include/linux/thread_info.h +++ b/include/linux/thread_info.h | |||
| @@ -23,12 +23,12 @@ struct restart_block { | |||
| 23 | }; | 23 | }; |
| 24 | /* For futex_wait and futex_wait_requeue_pi */ | 24 | /* For futex_wait and futex_wait_requeue_pi */ |
| 25 | struct { | 25 | struct { |
| 26 | u32 *uaddr; | 26 | u32 __user *uaddr; |
| 27 | u32 val; | 27 | u32 val; |
| 28 | u32 flags; | 28 | u32 flags; |
| 29 | u32 bitset; | 29 | u32 bitset; |
| 30 | u64 time; | 30 | u64 time; |
| 31 | u32 *uaddr2; | 31 | u32 __user *uaddr2; |
| 32 | } futex; | 32 | } futex; |
| 33 | /* For nanosleep */ | 33 | /* For nanosleep */ |
| 34 | struct { | 34 | struct { |
diff --git a/include/linux/ti_wilink_st.h b/include/linux/ti_wilink_st.h new file mode 100644 index 000000000000..4c7be2263011 --- /dev/null +++ b/include/linux/ti_wilink_st.h | |||
| @@ -0,0 +1,400 @@ | |||
| 1 | /* | ||
| 2 | * Shared Transport Header file | ||
| 3 | * To be included by the protocol stack drivers for | ||
| 4 | * Texas Instruments BT,FM and GPS combo chip drivers | ||
| 5 | * and also serves the sub-modules of the shared transport driver. | ||
| 6 | * | ||
| 7 | * Copyright (C) 2009-2010 Texas Instruments | ||
| 8 | * Author: Pavan Savoy <pavan_savoy@ti.com> | ||
| 9 | * | ||
| 10 | * This program is free software; you can redistribute it and/or modify | ||
| 11 | * it under the terms of the GNU General Public License version 2 as | ||
| 12 | * published by the Free Software Foundation. | ||
| 13 | * | ||
| 14 | * This program is distributed in the hope that it will be useful, | ||
| 15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 17 | * GNU General Public License for more details. | ||
| 18 | * | ||
| 19 | * You should have received a copy of the GNU General Public License | ||
| 20 | * along with this program; if not, write to the Free Software | ||
| 21 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 22 | * | ||
| 23 | */ | ||
| 24 | |||
| 25 | #ifndef TI_WILINK_ST_H | ||
| 26 | #define TI_WILINK_ST_H | ||
| 27 | |||
| 28 | /** | ||
| 29 | * enum kim_gpio_state - Few protocols such as FM have ACTIVE LOW | ||
| 30 | * gpio states for their chip/core enable gpios | ||
| 31 | */ | ||
| 32 | enum kim_gpio_state { | ||
| 33 | KIM_GPIO_INACTIVE, | ||
| 34 | KIM_GPIO_ACTIVE, | ||
| 35 | }; | ||
| 36 | |||
| 37 | /** | ||
| 38 | * enum proto-type - The protocol on WiLink chips which share a | ||
| 39 | * common physical interface like UART. | ||
| 40 | */ | ||
| 41 | enum proto_type { | ||
| 42 | ST_BT, | ||
| 43 | ST_FM, | ||
| 44 | ST_GPS, | ||
| 45 | ST_MAX, | ||
| 46 | }; | ||
| 47 | |||
| 48 | /** | ||
| 49 | * struct st_proto_s - Per Protocol structure from BT/FM/GPS to ST | ||
| 50 | * @type: type of the protocol being registered among the | ||
| 51 | * available proto_type(BT, FM, GPS the protocol which share TTY). | ||
| 52 | * @recv: the receiver callback pointing to a function in the | ||
| 53 | * protocol drivers called by the ST driver upon receiving | ||
| 54 | * relevant data. | ||
| 55 | * @match_packet: reserved for future use, to make ST more generic | ||
| 56 | * @reg_complete_cb: callback handler pointing to a function in protocol | ||
| 57 | * handler called by ST when the pending registrations are complete. | ||
| 58 | * The registrations are marked pending, in situations when fw | ||
| 59 | * download is in progress. | ||
| 60 | * @write: pointer to function in ST provided to protocol drivers from ST, | ||
| 61 | * to be made use when protocol drivers have data to send to TTY. | ||
| 62 | * @priv_data: privdate data holder for the protocol drivers, sent | ||
| 63 | * from the protocol drivers during registration, and sent back on | ||
| 64 | * reg_complete_cb and recv. | ||
| 65 | */ | ||
| 66 | struct st_proto_s { | ||
| 67 | enum proto_type type; | ||
| 68 | long (*recv) (void *, struct sk_buff *); | ||
| 69 | unsigned char (*match_packet) (const unsigned char *data); | ||
| 70 | void (*reg_complete_cb) (void *, char data); | ||
| 71 | long (*write) (struct sk_buff *skb); | ||
| 72 | void *priv_data; | ||
| 73 | }; | ||
| 74 | |||
| 75 | extern long st_register(struct st_proto_s *); | ||
| 76 | extern long st_unregister(enum proto_type); | ||
| 77 | |||
| 78 | |||
| 79 | /* | ||
| 80 | * header information used by st_core.c | ||
| 81 | */ | ||
| 82 | |||
| 83 | /* states of protocol list */ | ||
| 84 | #define ST_NOTEMPTY 1 | ||
| 85 | #define ST_EMPTY 0 | ||
| 86 | |||
| 87 | /* | ||
| 88 | * possible st_states | ||
| 89 | */ | ||
| 90 | #define ST_INITIALIZING 1 | ||
| 91 | #define ST_REG_IN_PROGRESS 2 | ||
| 92 | #define ST_REG_PENDING 3 | ||
| 93 | #define ST_WAITING_FOR_RESP 4 | ||
| 94 | |||
| 95 | /** | ||
| 96 | * struct st_data_s - ST core internal structure | ||
| 97 | * @st_state: different states of ST like initializing, registration | ||
| 98 | * in progress, this is mainly used to return relevant err codes | ||
| 99 | * when protocol drivers are registering. It is also used to track | ||
| 100 | * the recv function, as in during fw download only HCI events | ||
| 101 | * can occur , where as during other times other events CH8, CH9 | ||
| 102 | * can occur. | ||
| 103 | * @tty: tty provided by the TTY core for line disciplines. | ||
| 104 | * @tx_skb: If for some reason the tty's write returns lesser bytes written | ||
| 105 | * then to maintain the rest of data to be written on next instance. | ||
| 106 | * This needs to be protected, hence the lock inside wakeup func. | ||
| 107 | * @tx_state: if the data is being written onto the TTY and protocol driver | ||
| 108 | * wants to send more, queue up data and mark that there is | ||
| 109 | * more data to send. | ||
| 110 | * @list: the list of protocols registered, only MAX can exist, one protocol | ||
| 111 | * can register only once. | ||
| 112 | * @rx_state: states to be maintained inside st's tty receive | ||
| 113 | * @rx_count: count to be maintained inside st's tty receieve | ||
| 114 | * @rx_skb: the skb where all data for a protocol gets accumulated, | ||
| 115 | * since tty might not call receive when a complete event packet | ||
| 116 | * is received, the states, count and the skb needs to be maintained. | ||
| 117 | * @txq: the list of skbs which needs to be sent onto the TTY. | ||
| 118 | * @tx_waitq: if the chip is not in AWAKE state, the skbs needs to be queued | ||
| 119 | * up in here, PM(WAKEUP_IND) data needs to be sent and then the skbs | ||
| 120 | * from waitq can be moved onto the txq. | ||
| 121 | * Needs locking too. | ||
| 122 | * @lock: the lock to protect skbs, queues, and ST states. | ||
| 123 | * @protos_registered: count of the protocols registered, also when 0 the | ||
| 124 | * chip enable gpio can be toggled, and when it changes to 1 the fw | ||
| 125 | * needs to be downloaded to initialize chip side ST. | ||
| 126 | * @ll_state: the various PM states the chip can be, the states are notified | ||
| 127 | * to us, when the chip sends relevant PM packets(SLEEP_IND, WAKE_IND). | ||
| 128 | * @kim_data: reference to the parent encapsulating structure. | ||
| 129 | * | ||
| 130 | */ | ||
| 131 | struct st_data_s { | ||
| 132 | unsigned long st_state; | ||
| 133 | struct tty_struct *tty; | ||
| 134 | struct sk_buff *tx_skb; | ||
| 135 | #define ST_TX_SENDING 1 | ||
| 136 | #define ST_TX_WAKEUP 2 | ||
| 137 | unsigned long tx_state; | ||
| 138 | struct st_proto_s *list[ST_MAX]; | ||
| 139 | unsigned long rx_state; | ||
| 140 | unsigned long rx_count; | ||
| 141 | struct sk_buff *rx_skb; | ||
| 142 | struct sk_buff_head txq, tx_waitq; | ||
| 143 | spinlock_t lock; | ||
| 144 | unsigned char protos_registered; | ||
| 145 | unsigned long ll_state; | ||
| 146 | void *kim_data; | ||
| 147 | }; | ||
| 148 | |||
| 149 | /** | ||
| 150 | * st_int_write - | ||
| 151 | * point this to tty->driver->write or tty->ops->write | ||
| 152 | * depending upon the kernel version | ||
| 153 | */ | ||
| 154 | int st_int_write(struct st_data_s*, const unsigned char*, int); | ||
| 155 | |||
| 156 | /** | ||
| 157 | * st_write - | ||
| 158 | * internal write function, passed onto protocol drivers | ||
| 159 | * via the write function ptr of protocol struct | ||
| 160 | */ | ||
| 161 | long st_write(struct sk_buff *); | ||
| 162 | |||
| 163 | /* function to be called from ST-LL */ | ||
| 164 | void st_ll_send_frame(enum proto_type, struct sk_buff *); | ||
| 165 | |||
| 166 | /* internal wake up function */ | ||
| 167 | void st_tx_wakeup(struct st_data_s *st_data); | ||
| 168 | |||
| 169 | /* init, exit entry funcs called from KIM */ | ||
| 170 | int st_core_init(struct st_data_s **); | ||
| 171 | void st_core_exit(struct st_data_s *); | ||
| 172 | |||
| 173 | /* ask for reference from KIM */ | ||
| 174 | void st_kim_ref(struct st_data_s **, int); | ||
| 175 | |||
| 176 | #define GPS_STUB_TEST | ||
| 177 | #ifdef GPS_STUB_TEST | ||
| 178 | int gps_chrdrv_stub_write(const unsigned char*, int); | ||
| 179 | void gps_chrdrv_stub_init(void); | ||
| 180 | #endif | ||
| 181 | |||
| 182 | /* | ||
| 183 | * header information used by st_kim.c | ||
| 184 | */ | ||
| 185 | |||
| 186 | /* time in msec to wait for | ||
| 187 | * line discipline to be installed | ||
| 188 | */ | ||
| 189 | #define LDISC_TIME 500 | ||
| 190 | #define CMD_RESP_TIME 500 | ||
| 191 | #define MAKEWORD(a, b) ((unsigned short)(((unsigned char)(a)) \ | ||
| 192 | | ((unsigned short)((unsigned char)(b))) << 8)) | ||
| 193 | |||
| 194 | #define GPIO_HIGH 1 | ||
| 195 | #define GPIO_LOW 0 | ||
| 196 | |||
| 197 | /* the Power-On-Reset logic, requires to attempt | ||
| 198 | * to download firmware onto chip more than once | ||
| 199 | * since the self-test for chip takes a while | ||
| 200 | */ | ||
| 201 | #define POR_RETRY_COUNT 5 | ||
| 202 | |||
| 203 | /** | ||
| 204 | * struct chip_version - save the chip version | ||
| 205 | */ | ||
| 206 | struct chip_version { | ||
| 207 | unsigned short full; | ||
| 208 | unsigned short chip; | ||
| 209 | unsigned short min_ver; | ||
| 210 | unsigned short maj_ver; | ||
| 211 | }; | ||
| 212 | |||
| 213 | /** | ||
| 214 | * struct kim_data_s - the KIM internal data, embedded as the | ||
| 215 | * platform's drv data. One for each ST device in the system. | ||
| 216 | * @uim_pid: KIM needs to communicate with UIM to request to install | ||
| 217 | * the ldisc by opening UART when protocol drivers register. | ||
| 218 | * @kim_pdev: the platform device added in one of the board-XX.c file | ||
| 219 | * in arch/XX/ directory, 1 for each ST device. | ||
| 220 | * @kim_rcvd: completion handler to notify when data was received, | ||
| 221 | * mainly used during fw download, which involves multiple send/wait | ||
| 222 | * for each of the HCI-VS commands. | ||
| 223 | * @ldisc_installed: completion handler to notify that the UIM accepted | ||
| 224 | * the request to install ldisc, notify from tty_open which suggests | ||
| 225 | * the ldisc was properly installed. | ||
| 226 | * @resp_buffer: data buffer for the .bts fw file name. | ||
| 227 | * @fw_entry: firmware class struct to request/release the fw. | ||
| 228 | * @gpios: the list of core/chip enable gpios for BT, FM and GPS cores. | ||
| 229 | * @rx_state: the rx state for kim's receive func during fw download. | ||
| 230 | * @rx_count: the rx count for the kim's receive func during fw download. | ||
| 231 | * @rx_skb: all of fw data might not come at once, and hence data storage for | ||
| 232 | * whole of the fw response, only HCI_EVENTs and hence diff from ST's | ||
| 233 | * response. | ||
| 234 | * @rfkill: rfkill data for each of the cores to be registered with rfkill. | ||
| 235 | * @rf_protos: proto types of the data registered with rfkill sub-system. | ||
| 236 | * @core_data: ST core's data, which mainly is the tty's disc_data | ||
| 237 | * @version: chip version available via a sysfs entry. | ||
| 238 | * | ||
| 239 | */ | ||
| 240 | struct kim_data_s { | ||
| 241 | long uim_pid; | ||
| 242 | struct platform_device *kim_pdev; | ||
| 243 | struct completion kim_rcvd, ldisc_installed; | ||
| 244 | char resp_buffer[30]; | ||
| 245 | const struct firmware *fw_entry; | ||
| 246 | long gpios[ST_MAX]; | ||
| 247 | unsigned long rx_state; | ||
| 248 | unsigned long rx_count; | ||
| 249 | struct sk_buff *rx_skb; | ||
| 250 | struct rfkill *rfkill[ST_MAX]; | ||
| 251 | enum proto_type rf_protos[ST_MAX]; | ||
| 252 | struct st_data_s *core_data; | ||
| 253 | struct chip_version version; | ||
| 254 | }; | ||
| 255 | |||
| 256 | /** | ||
| 257 | * functions called when 1 of the protocol drivers gets | ||
| 258 | * registered, these need to communicate with UIM to request | ||
| 259 | * ldisc installed, read chip_version, download relevant fw | ||
| 260 | */ | ||
| 261 | long st_kim_start(void *); | ||
| 262 | long st_kim_stop(void *); | ||
| 263 | |||
| 264 | void st_kim_recv(void *, const unsigned char *, long count); | ||
| 265 | void st_kim_chip_toggle(enum proto_type, enum kim_gpio_state); | ||
| 266 | void st_kim_complete(void *); | ||
| 267 | void kim_st_list_protocols(struct st_data_s *, void *); | ||
| 268 | |||
| 269 | /* | ||
| 270 | * BTS headers | ||
| 271 | */ | ||
| 272 | #define ACTION_SEND_COMMAND 1 | ||
| 273 | #define ACTION_WAIT_EVENT 2 | ||
| 274 | #define ACTION_SERIAL 3 | ||
| 275 | #define ACTION_DELAY 4 | ||
| 276 | #define ACTION_RUN_SCRIPT 5 | ||
| 277 | #define ACTION_REMARKS 6 | ||
| 278 | |||
| 279 | /** | ||
| 280 | * struct bts_header - the fw file is NOT binary which can | ||
| 281 | * be sent onto TTY as is. The .bts is more a script | ||
| 282 | * file which has different types of actions. | ||
| 283 | * Each such action needs to be parsed by the KIM and | ||
| 284 | * relevant procedure to be called. | ||
| 285 | */ | ||
| 286 | struct bts_header { | ||
| 287 | u32 magic; | ||
| 288 | u32 version; | ||
| 289 | u8 future[24]; | ||
| 290 | u8 actions[0]; | ||
| 291 | } __attribute__ ((packed)); | ||
| 292 | |||
| 293 | /** | ||
| 294 | * struct bts_action - Each .bts action has its own type of | ||
| 295 | * data. | ||
| 296 | */ | ||
| 297 | struct bts_action { | ||
| 298 | u16 type; | ||
| 299 | u16 size; | ||
| 300 | u8 data[0]; | ||
| 301 | } __attribute__ ((packed)); | ||
| 302 | |||
| 303 | struct bts_action_send { | ||
| 304 | u8 data[0]; | ||
| 305 | } __attribute__ ((packed)); | ||
| 306 | |||
| 307 | struct bts_action_wait { | ||
| 308 | u32 msec; | ||
| 309 | u32 size; | ||
| 310 | u8 data[0]; | ||
| 311 | } __attribute__ ((packed)); | ||
| 312 | |||
| 313 | struct bts_action_delay { | ||
| 314 | u32 msec; | ||
| 315 | } __attribute__ ((packed)); | ||
| 316 | |||
| 317 | struct bts_action_serial { | ||
| 318 | u32 baud; | ||
| 319 | u32 flow_control; | ||
| 320 | } __attribute__ ((packed)); | ||
| 321 | |||
| 322 | /** | ||
| 323 | * struct hci_command - the HCI-VS for intrepreting | ||
| 324 | * the change baud rate of host-side UART, which | ||
| 325 | * needs to be ignored, since UIM would do that | ||
| 326 | * when it receives request from KIM for ldisc installation. | ||
| 327 | */ | ||
| 328 | struct hci_command { | ||
| 329 | u8 prefix; | ||
| 330 | u16 opcode; | ||
| 331 | u8 plen; | ||
| 332 | u32 speed; | ||
| 333 | } __attribute__ ((packed)); | ||
| 334 | |||
| 335 | /* | ||
| 336 | * header information used by st_ll.c | ||
| 337 | */ | ||
| 338 | |||
| 339 | /* ST LL receiver states */ | ||
| 340 | #define ST_W4_PACKET_TYPE 0 | ||
| 341 | #define ST_BT_W4_EVENT_HDR 1 | ||
| 342 | #define ST_BT_W4_ACL_HDR 2 | ||
| 343 | #define ST_BT_W4_SCO_HDR 3 | ||
| 344 | #define ST_BT_W4_DATA 4 | ||
| 345 | #define ST_FM_W4_EVENT_HDR 5 | ||
| 346 | #define ST_GPS_W4_EVENT_HDR 6 | ||
| 347 | |||
| 348 | /* ST LL state machines */ | ||
| 349 | #define ST_LL_ASLEEP 0 | ||
| 350 | #define ST_LL_ASLEEP_TO_AWAKE 1 | ||
| 351 | #define ST_LL_AWAKE 2 | ||
| 352 | #define ST_LL_AWAKE_TO_ASLEEP 3 | ||
| 353 | #define ST_LL_INVALID 4 | ||
| 354 | |||
| 355 | /* different PM notifications coming from chip */ | ||
| 356 | #define LL_SLEEP_IND 0x30 | ||
| 357 | #define LL_SLEEP_ACK 0x31 | ||
| 358 | #define LL_WAKE_UP_IND 0x32 | ||
| 359 | #define LL_WAKE_UP_ACK 0x33 | ||
| 360 | |||
| 361 | /* initialize and de-init ST LL */ | ||
| 362 | long st_ll_init(struct st_data_s *); | ||
| 363 | long st_ll_deinit(struct st_data_s *); | ||
| 364 | |||
| 365 | /** | ||
| 366 | * enable/disable ST LL along with KIM start/stop | ||
| 367 | * called by ST Core | ||
| 368 | */ | ||
| 369 | void st_ll_enable(struct st_data_s *); | ||
| 370 | void st_ll_disable(struct st_data_s *); | ||
| 371 | |||
| 372 | /** | ||
| 373 | * various funcs used by ST core to set/get the various PM states | ||
| 374 | * of the chip. | ||
| 375 | */ | ||
| 376 | unsigned long st_ll_getstate(struct st_data_s *); | ||
| 377 | unsigned long st_ll_sleep_state(struct st_data_s *, unsigned char); | ||
| 378 | void st_ll_wakeup(struct st_data_s *); | ||
| 379 | |||
| 380 | /* | ||
| 381 | * header information used by st_core.c for FM and GPS | ||
| 382 | * packet parsing, the bluetooth headers are already available | ||
| 383 | * at net/bluetooth/ | ||
| 384 | */ | ||
| 385 | |||
| 386 | struct fm_event_hdr { | ||
| 387 | u8 plen; | ||
| 388 | } __attribute__ ((packed)); | ||
| 389 | |||
| 390 | #define FM_MAX_FRAME_SIZE 0xFF /* TODO: */ | ||
| 391 | #define FM_EVENT_HDR_SIZE 1 /* size of fm_event_hdr */ | ||
| 392 | #define ST_FM_CH8_PKT 0x8 | ||
| 393 | |||
| 394 | /* gps stuff */ | ||
| 395 | struct gps_event_hdr { | ||
| 396 | u8 opcode; | ||
| 397 | u16 plen; | ||
| 398 | } __attribute__ ((packed)); | ||
| 399 | |||
| 400 | #endif /* TI_WILINK_ST_H */ | ||
diff --git a/include/linux/time.h b/include/linux/time.h index ea3559f0b3f2..9f15ac7ab92a 100644 --- a/include/linux/time.h +++ b/include/linux/time.h | |||
| @@ -38,7 +38,7 @@ extern struct timezone sys_tz; | |||
| 38 | #define NSEC_PER_MSEC 1000000L | 38 | #define NSEC_PER_MSEC 1000000L |
| 39 | #define USEC_PER_SEC 1000000L | 39 | #define USEC_PER_SEC 1000000L |
| 40 | #define NSEC_PER_SEC 1000000000L | 40 | #define NSEC_PER_SEC 1000000000L |
| 41 | #define FSEC_PER_SEC 1000000000000000L | 41 | #define FSEC_PER_SEC 1000000000000000LL |
| 42 | 42 | ||
| 43 | #define TIME_T_MAX (time_t)((1UL << ((sizeof(time_t) << 3) - 1)) - 1) | 43 | #define TIME_T_MAX (time_t)((1UL << ((sizeof(time_t) << 3) - 1)) - 1) |
| 44 | 44 | ||
| @@ -76,9 +76,25 @@ extern unsigned long mktime(const unsigned int year, const unsigned int mon, | |||
| 76 | const unsigned int min, const unsigned int sec); | 76 | const unsigned int min, const unsigned int sec); |
| 77 | 77 | ||
| 78 | extern void set_normalized_timespec(struct timespec *ts, time_t sec, s64 nsec); | 78 | extern void set_normalized_timespec(struct timespec *ts, time_t sec, s64 nsec); |
| 79 | |||
| 80 | /* | ||
| 81 | * timespec_add_safe assumes both values are positive and checks | ||
| 82 | * for overflow. It will return TIME_T_MAX if the reutrn would be | ||
| 83 | * smaller then either of the arguments. | ||
| 84 | */ | ||
| 79 | extern struct timespec timespec_add_safe(const struct timespec lhs, | 85 | extern struct timespec timespec_add_safe(const struct timespec lhs, |
| 80 | const struct timespec rhs); | 86 | const struct timespec rhs); |
| 81 | 87 | ||
| 88 | |||
| 89 | static inline struct timespec timespec_add(struct timespec lhs, | ||
| 90 | struct timespec rhs) | ||
| 91 | { | ||
| 92 | struct timespec ts_delta; | ||
| 93 | set_normalized_timespec(&ts_delta, lhs.tv_sec + rhs.tv_sec, | ||
| 94 | lhs.tv_nsec + rhs.tv_nsec); | ||
| 95 | return ts_delta; | ||
| 96 | } | ||
| 97 | |||
| 82 | /* | 98 | /* |
| 83 | * sub = lhs - rhs, in normalized form | 99 | * sub = lhs - rhs, in normalized form |
| 84 | */ | 100 | */ |
| @@ -97,8 +113,6 @@ static inline struct timespec timespec_sub(struct timespec lhs, | |||
| 97 | #define timespec_valid(ts) \ | 113 | #define timespec_valid(ts) \ |
| 98 | (((ts)->tv_sec >= 0) && (((unsigned long) (ts)->tv_nsec) < NSEC_PER_SEC)) | 114 | (((ts)->tv_sec >= 0) && (((unsigned long) (ts)->tv_nsec) < NSEC_PER_SEC)) |
| 99 | 115 | ||
| 100 | extern struct timespec xtime; | ||
| 101 | extern struct timespec wall_to_monotonic; | ||
| 102 | extern seqlock_t xtime_lock; | 116 | extern seqlock_t xtime_lock; |
| 103 | 117 | ||
| 104 | extern void read_persistent_clock(struct timespec *ts); | 118 | extern void read_persistent_clock(struct timespec *ts); |
| @@ -110,7 +124,8 @@ extern int timekeeping_suspended; | |||
| 110 | 124 | ||
| 111 | unsigned long get_seconds(void); | 125 | unsigned long get_seconds(void); |
| 112 | struct timespec current_kernel_time(void); | 126 | struct timespec current_kernel_time(void); |
| 113 | struct timespec __current_kernel_time(void); /* does not hold xtime_lock */ | 127 | struct timespec __current_kernel_time(void); /* does not take xtime_lock */ |
| 128 | struct timespec __get_wall_to_monotonic(void); /* does not take xtime_lock */ | ||
| 114 | struct timespec get_monotonic_coarse(void); | 129 | struct timespec get_monotonic_coarse(void); |
| 115 | 130 | ||
| 116 | #define CURRENT_TIME (current_kernel_time()) | 131 | #define CURRENT_TIME (current_kernel_time()) |
| @@ -135,7 +150,7 @@ extern void do_gettimeofday(struct timeval *tv); | |||
| 135 | extern int do_settimeofday(struct timespec *tv); | 150 | extern int do_settimeofday(struct timespec *tv); |
| 136 | extern int do_sys_settimeofday(struct timespec *tv, struct timezone *tz); | 151 | extern int do_sys_settimeofday(struct timespec *tv, struct timezone *tz); |
| 137 | #define do_posix_clock_monotonic_gettime(ts) ktime_get_ts(ts) | 152 | #define do_posix_clock_monotonic_gettime(ts) ktime_get_ts(ts) |
| 138 | extern long do_utimes(int dfd, char __user *filename, struct timespec *times, int flags); | 153 | extern long do_utimes(int dfd, const char __user *filename, struct timespec *times, int flags); |
| 139 | struct itimerval; | 154 | struct itimerval; |
| 140 | extern int do_setitimer(int which, struct itimerval *value, | 155 | extern int do_setitimer(int which, struct itimerval *value, |
| 141 | struct itimerval *ovalue); | 156 | struct itimerval *ovalue); |
diff --git a/include/linux/timer.h b/include/linux/timer.h index ea965b857a50..38cf093ef62c 100644 --- a/include/linux/timer.h +++ b/include/linux/timer.h | |||
| @@ -100,6 +100,13 @@ void init_timer_deferrable_key(struct timer_list *timer, | |||
| 100 | setup_timer_on_stack_key((timer), #timer, &__key, \ | 100 | setup_timer_on_stack_key((timer), #timer, &__key, \ |
| 101 | (fn), (data)); \ | 101 | (fn), (data)); \ |
| 102 | } while (0) | 102 | } while (0) |
| 103 | #define setup_deferrable_timer_on_stack(timer, fn, data) \ | ||
| 104 | do { \ | ||
| 105 | static struct lock_class_key __key; \ | ||
| 106 | setup_deferrable_timer_on_stack_key((timer), #timer, \ | ||
| 107 | &__key, (fn), \ | ||
| 108 | (data)); \ | ||
| 109 | } while (0) | ||
| 103 | #else | 110 | #else |
| 104 | #define init_timer(timer)\ | 111 | #define init_timer(timer)\ |
| 105 | init_timer_key((timer), NULL, NULL) | 112 | init_timer_key((timer), NULL, NULL) |
| @@ -111,6 +118,8 @@ void init_timer_deferrable_key(struct timer_list *timer, | |||
| 111 | setup_timer_key((timer), NULL, NULL, (fn), (data)) | 118 | setup_timer_key((timer), NULL, NULL, (fn), (data)) |
| 112 | #define setup_timer_on_stack(timer, fn, data)\ | 119 | #define setup_timer_on_stack(timer, fn, data)\ |
| 113 | setup_timer_on_stack_key((timer), NULL, NULL, (fn), (data)) | 120 | setup_timer_on_stack_key((timer), NULL, NULL, (fn), (data)) |
| 121 | #define setup_deferrable_timer_on_stack(timer, fn, data)\ | ||
| 122 | setup_deferrable_timer_on_stack_key((timer), NULL, NULL, (fn), (data)) | ||
| 114 | #endif | 123 | #endif |
| 115 | 124 | ||
| 116 | #ifdef CONFIG_DEBUG_OBJECTS_TIMERS | 125 | #ifdef CONFIG_DEBUG_OBJECTS_TIMERS |
| @@ -150,6 +159,12 @@ static inline void setup_timer_on_stack_key(struct timer_list *timer, | |||
| 150 | init_timer_on_stack_key(timer, name, key); | 159 | init_timer_on_stack_key(timer, name, key); |
| 151 | } | 160 | } |
| 152 | 161 | ||
| 162 | extern void setup_deferrable_timer_on_stack_key(struct timer_list *timer, | ||
| 163 | const char *name, | ||
| 164 | struct lock_class_key *key, | ||
| 165 | void (*function)(unsigned long), | ||
| 166 | unsigned long data); | ||
| 167 | |||
| 153 | /** | 168 | /** |
| 154 | * timer_pending - is a timer pending? | 169 | * timer_pending - is a timer pending? |
| 155 | * @timer: the timer in question | 170 | * @timer: the timer in question |
diff --git a/include/linux/tipc.h b/include/linux/tipc.h index 181c8d0e6f73..d10614b29d59 100644 --- a/include/linux/tipc.h +++ b/include/linux/tipc.h | |||
| @@ -127,17 +127,23 @@ static inline unsigned int tipc_node(__u32 addr) | |||
| 127 | * TIPC topology subscription service definitions | 127 | * TIPC topology subscription service definitions |
| 128 | */ | 128 | */ |
| 129 | 129 | ||
| 130 | #define TIPC_SUB_SERVICE 0x00 /* Filter for service availability */ | 130 | #define TIPC_SUB_PORTS 0x01 /* filter for port availability */ |
| 131 | #define TIPC_SUB_PORTS 0x01 /* Filter for port availability */ | 131 | #define TIPC_SUB_SERVICE 0x02 /* filter for service availability */ |
| 132 | #define TIPC_SUB_CANCEL 0x04 /* Cancel a subscription */ | 132 | #define TIPC_SUB_CANCEL 0x04 /* cancel a subscription */ |
| 133 | #if 0 | ||
| 134 | /* The following filter options are not currently implemented */ | ||
| 135 | #define TIPC_SUB_NO_BIND_EVTS 0x04 /* filter out "publish" events */ | ||
| 136 | #define TIPC_SUB_NO_UNBIND_EVTS 0x08 /* filter out "withdraw" events */ | ||
| 137 | #define TIPC_SUB_SINGLE_EVT 0x10 /* expire after first event */ | ||
| 138 | #endif | ||
| 133 | 139 | ||
| 134 | #define TIPC_WAIT_FOREVER ~0 /* timeout for permanent subscription */ | 140 | #define TIPC_WAIT_FOREVER ~0 /* timeout for permanent subscription */ |
| 135 | 141 | ||
| 136 | struct tipc_subscr { | 142 | struct tipc_subscr { |
| 137 | struct tipc_name_seq seq; /* NBO. Name sequence of interest */ | 143 | struct tipc_name_seq seq; /* name sequence of interest */ |
| 138 | __u32 timeout; /* NBO. Subscription duration (in ms) */ | 144 | __u32 timeout; /* subscription duration (in ms) */ |
| 139 | __u32 filter; /* NBO. Bitmask of filter options */ | 145 | __u32 filter; /* bitmask of filter options */ |
| 140 | char usr_handle[8]; /* Opaque. Available for subscriber use */ | 146 | char usr_handle[8]; /* available for subscriber use */ |
| 141 | }; | 147 | }; |
| 142 | 148 | ||
| 143 | #define TIPC_PUBLISHED 1 /* publication event */ | 149 | #define TIPC_PUBLISHED 1 /* publication event */ |
| @@ -145,11 +151,11 @@ struct tipc_subscr { | |||
| 145 | #define TIPC_SUBSCR_TIMEOUT 3 /* subscription timeout event */ | 151 | #define TIPC_SUBSCR_TIMEOUT 3 /* subscription timeout event */ |
| 146 | 152 | ||
| 147 | struct tipc_event { | 153 | struct tipc_event { |
| 148 | __u32 event; /* NBO. Event type, as defined above */ | 154 | __u32 event; /* event type */ |
| 149 | __u32 found_lower; /* NBO. Matching name seq instances */ | 155 | __u32 found_lower; /* matching name seq instances */ |
| 150 | __u32 found_upper; /* " " " " " */ | 156 | __u32 found_upper; /* " " " " */ |
| 151 | struct tipc_portid port; /* NBO. Associated port */ | 157 | struct tipc_portid port; /* associated port */ |
| 152 | struct tipc_subscr s; /* Original, associated subscription */ | 158 | struct tipc_subscr s; /* associated subscription */ |
| 153 | }; | 159 | }; |
| 154 | 160 | ||
| 155 | /* | 161 | /* |
diff --git a/include/linux/topology.h b/include/linux/topology.h index c44df50a05ab..b91a40e847d2 100644 --- a/include/linux/topology.h +++ b/include/linux/topology.h | |||
| @@ -103,6 +103,7 @@ int arch_update_cpu_topology(void); | |||
| 103 | | 1*SD_SHARE_PKG_RESOURCES \ | 103 | | 1*SD_SHARE_PKG_RESOURCES \ |
| 104 | | 0*SD_SERIALIZE \ | 104 | | 0*SD_SERIALIZE \ |
| 105 | | 0*SD_PREFER_SIBLING \ | 105 | | 0*SD_PREFER_SIBLING \ |
| 106 | | arch_sd_sibling_asym_packing() \ | ||
| 106 | , \ | 107 | , \ |
| 107 | .last_balance = jiffies, \ | 108 | .last_balance = jiffies, \ |
| 108 | .balance_interval = 1, \ | 109 | .balance_interval = 1, \ |
| @@ -200,6 +201,12 @@ int arch_update_cpu_topology(void); | |||
| 200 | .balance_interval = 64, \ | 201 | .balance_interval = 64, \ |
| 201 | } | 202 | } |
| 202 | 203 | ||
| 204 | #ifdef CONFIG_SCHED_BOOK | ||
| 205 | #ifndef SD_BOOK_INIT | ||
| 206 | #error Please define an appropriate SD_BOOK_INIT in include/asm/topology.h!!! | ||
| 207 | #endif | ||
| 208 | #endif /* CONFIG_SCHED_BOOK */ | ||
| 209 | |||
| 203 | #ifdef CONFIG_NUMA | 210 | #ifdef CONFIG_NUMA |
| 204 | #ifndef SD_NODE_INIT | 211 | #ifndef SD_NODE_INIT |
| 205 | #error Please define an appropriate SD_NODE_INIT in include/asm/topology.h!!! | 212 | #error Please define an appropriate SD_NODE_INIT in include/asm/topology.h!!! |
| @@ -291,10 +298,6 @@ static inline void set_cpu_numa_mem(int cpu, int node) | |||
| 291 | 298 | ||
| 292 | #else /* !CONFIG_HAVE_MEMORYLESS_NODES */ | 299 | #else /* !CONFIG_HAVE_MEMORYLESS_NODES */ |
| 293 | 300 | ||
| 294 | static inline void set_numa_mem(int node) {} | ||
| 295 | |||
| 296 | static inline void set_cpu_numa_mem(int cpu, int node) {} | ||
| 297 | |||
| 298 | #ifndef numa_mem_id | 301 | #ifndef numa_mem_id |
| 299 | /* Returns the number of the nearest Node with memory */ | 302 | /* Returns the number of the nearest Node with memory */ |
| 300 | static inline int numa_mem_id(void) | 303 | static inline int numa_mem_id(void) |
diff --git a/include/linux/tracehook.h b/include/linux/tracehook.h index 10db0102a890..3a2e66d88a32 100644 --- a/include/linux/tracehook.h +++ b/include/linux/tracehook.h | |||
| @@ -150,7 +150,7 @@ static inline void tracehook_report_syscall_exit(struct pt_regs *regs, int step) | |||
| 150 | * | 150 | * |
| 151 | * Return %LSM_UNSAFE_* bits applied to an exec because of tracing. | 151 | * Return %LSM_UNSAFE_* bits applied to an exec because of tracing. |
| 152 | * | 152 | * |
| 153 | * @task->cred_guard_mutex is held by the caller through the do_execve(). | 153 | * @task->signal->cred_guard_mutex is held by the caller through the do_execve(). |
| 154 | */ | 154 | */ |
| 155 | static inline int tracehook_unsafe_exec(struct task_struct *task) | 155 | static inline int tracehook_unsafe_exec(struct task_struct *task) |
| 156 | { | 156 | { |
diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h index 103d1b61aacb..a4a90b6726ce 100644 --- a/include/linux/tracepoint.h +++ b/include/linux/tracepoint.h | |||
| @@ -17,6 +17,7 @@ | |||
| 17 | #include <linux/errno.h> | 17 | #include <linux/errno.h> |
| 18 | #include <linux/types.h> | 18 | #include <linux/types.h> |
| 19 | #include <linux/rcupdate.h> | 19 | #include <linux/rcupdate.h> |
| 20 | #include <linux/jump_label.h> | ||
| 20 | 21 | ||
| 21 | struct module; | 22 | struct module; |
| 22 | struct tracepoint; | 23 | struct tracepoint; |
| @@ -145,7 +146,9 @@ static inline void tracepoint_update_probe_range(struct tracepoint *begin, | |||
| 145 | extern struct tracepoint __tracepoint_##name; \ | 146 | extern struct tracepoint __tracepoint_##name; \ |
| 146 | static inline void trace_##name(proto) \ | 147 | static inline void trace_##name(proto) \ |
| 147 | { \ | 148 | { \ |
| 148 | if (unlikely(__tracepoint_##name.state)) \ | 149 | JUMP_LABEL(&__tracepoint_##name.state, do_trace); \ |
| 150 | return; \ | ||
| 151 | do_trace: \ | ||
| 149 | __DO_TRACE(&__tracepoint_##name, \ | 152 | __DO_TRACE(&__tracepoint_##name, \ |
| 150 | TP_PROTO(data_proto), \ | 153 | TP_PROTO(data_proto), \ |
| 151 | TP_ARGS(data_args)); \ | 154 | TP_ARGS(data_args)); \ |
diff --git a/include/linux/tty.h b/include/linux/tty.h index 931078b73226..e500171c745f 100644 --- a/include/linux/tty.h +++ b/include/linux/tty.h | |||
| @@ -13,6 +13,7 @@ | |||
| 13 | #include <linux/tty_driver.h> | 13 | #include <linux/tty_driver.h> |
| 14 | #include <linux/tty_ldisc.h> | 14 | #include <linux/tty_ldisc.h> |
| 15 | #include <linux/mutex.h> | 15 | #include <linux/mutex.h> |
| 16 | #include <linux/smp_lock.h> | ||
| 16 | 17 | ||
| 17 | #include <asm/system.h> | 18 | #include <asm/system.h> |
| 18 | 19 | ||
| @@ -49,6 +50,7 @@ | |||
| 49 | #define N_V253 19 /* Codec control over voice modem */ | 50 | #define N_V253 19 /* Codec control over voice modem */ |
| 50 | #define N_CAIF 20 /* CAIF protocol for talking to modems */ | 51 | #define N_CAIF 20 /* CAIF protocol for talking to modems */ |
| 51 | #define N_GSM0710 21 /* GSM 0710 Mux */ | 52 | #define N_GSM0710 21 /* GSM 0710 Mux */ |
| 53 | #define N_TI_WL 22 /* for TI's WL BT, FM, GPS combo chips */ | ||
| 52 | 54 | ||
| 53 | /* | 55 | /* |
| 54 | * This character is the same as _POSIX_VDISABLE: it cannot be used as | 56 | * This character is the same as _POSIX_VDISABLE: it cannot be used as |
| @@ -179,6 +181,7 @@ struct tty_bufhead { | |||
| 179 | #define L_FLUSHO(tty) _L_FLAG((tty), FLUSHO) | 181 | #define L_FLUSHO(tty) _L_FLAG((tty), FLUSHO) |
| 180 | #define L_PENDIN(tty) _L_FLAG((tty), PENDIN) | 182 | #define L_PENDIN(tty) _L_FLAG((tty), PENDIN) |
| 181 | #define L_IEXTEN(tty) _L_FLAG((tty), IEXTEN) | 183 | #define L_IEXTEN(tty) _L_FLAG((tty), IEXTEN) |
| 184 | #define L_EXTPROC(tty) _L_FLAG((tty), EXTPROC) | ||
| 182 | 185 | ||
| 183 | struct device; | 186 | struct device; |
| 184 | struct signal_struct; | 187 | struct signal_struct; |
| @@ -254,6 +257,7 @@ struct tty_operations; | |||
| 254 | struct tty_struct { | 257 | struct tty_struct { |
| 255 | int magic; | 258 | int magic; |
| 256 | struct kref kref; | 259 | struct kref kref; |
| 260 | struct device *dev; | ||
| 257 | struct tty_driver *driver; | 261 | struct tty_driver *driver; |
| 258 | const struct tty_operations *ops; | 262 | const struct tty_operations *ops; |
| 259 | int index; | 263 | int index; |
| @@ -327,6 +331,13 @@ struct tty_struct { | |||
| 327 | struct tty_port *port; | 331 | struct tty_port *port; |
| 328 | }; | 332 | }; |
| 329 | 333 | ||
| 334 | /* Each of a tty's open files has private_data pointing to tty_file_private */ | ||
| 335 | struct tty_file_private { | ||
| 336 | struct tty_struct *tty; | ||
| 337 | struct file *file; | ||
| 338 | struct list_head list; | ||
| 339 | }; | ||
| 340 | |||
| 330 | /* tty magic number */ | 341 | /* tty magic number */ |
| 331 | #define TTY_MAGIC 0x5401 | 342 | #define TTY_MAGIC 0x5401 |
| 332 | 343 | ||
| @@ -415,6 +426,7 @@ extern int is_ignored(int sig); | |||
| 415 | extern int tty_signal(int sig, struct tty_struct *tty); | 426 | extern int tty_signal(int sig, struct tty_struct *tty); |
| 416 | extern void tty_hangup(struct tty_struct *tty); | 427 | extern void tty_hangup(struct tty_struct *tty); |
| 417 | extern void tty_vhangup(struct tty_struct *tty); | 428 | extern void tty_vhangup(struct tty_struct *tty); |
| 429 | extern void tty_vhangup_locked(struct tty_struct *tty); | ||
| 418 | extern void tty_vhangup_self(void); | 430 | extern void tty_vhangup_self(void); |
| 419 | extern void tty_unhangup(struct file *filp); | 431 | extern void tty_unhangup(struct file *filp); |
| 420 | extern int tty_hung_up_p(struct file *filp); | 432 | extern int tty_hung_up_p(struct file *filp); |
| @@ -455,6 +467,7 @@ extern void proc_clear_tty(struct task_struct *p); | |||
| 455 | extern struct tty_struct *get_current_tty(void); | 467 | extern struct tty_struct *get_current_tty(void); |
| 456 | extern void tty_default_fops(struct file_operations *fops); | 468 | extern void tty_default_fops(struct file_operations *fops); |
| 457 | extern struct tty_struct *alloc_tty_struct(void); | 469 | extern struct tty_struct *alloc_tty_struct(void); |
| 470 | extern int tty_add_file(struct tty_struct *tty, struct file *file); | ||
| 458 | extern void free_tty_struct(struct tty_struct *tty); | 471 | extern void free_tty_struct(struct tty_struct *tty); |
| 459 | extern void initialize_tty_struct(struct tty_struct *tty, | 472 | extern void initialize_tty_struct(struct tty_struct *tty, |
| 460 | struct tty_driver *driver, int idx); | 473 | struct tty_driver *driver, int idx); |
| @@ -467,6 +480,7 @@ extern struct tty_struct *tty_pair_get_tty(struct tty_struct *tty); | |||
| 467 | extern struct tty_struct *tty_pair_get_pty(struct tty_struct *tty); | 480 | extern struct tty_struct *tty_pair_get_pty(struct tty_struct *tty); |
| 468 | 481 | ||
| 469 | extern struct mutex tty_mutex; | 482 | extern struct mutex tty_mutex; |
| 483 | extern spinlock_t tty_files_lock; | ||
| 470 | 484 | ||
| 471 | extern void tty_write_unlock(struct tty_struct *tty); | 485 | extern void tty_write_unlock(struct tty_struct *tty); |
| 472 | extern int tty_write_lock(struct tty_struct *tty, int ndelay); | 486 | extern int tty_write_lock(struct tty_struct *tty, int ndelay); |
| @@ -552,6 +566,9 @@ static inline void tty_audit_push_task(struct task_struct *tsk, | |||
| 552 | } | 566 | } |
| 553 | #endif | 567 | #endif |
| 554 | 568 | ||
| 569 | /* tty_io.c */ | ||
| 570 | extern int __init tty_init(void); | ||
| 571 | |||
| 555 | /* tty_ioctl.c */ | 572 | /* tty_ioctl.c */ |
| 556 | extern int n_tty_ioctl_helper(struct tty_struct *tty, struct file *file, | 573 | extern int n_tty_ioctl_helper(struct tty_struct *tty, struct file *file, |
| 557 | unsigned int cmd, unsigned long arg); | 574 | unsigned int cmd, unsigned long arg); |
| @@ -572,5 +589,54 @@ extern int vt_ioctl(struct tty_struct *tty, struct file *file, | |||
| 572 | extern long vt_compat_ioctl(struct tty_struct *tty, struct file * file, | 589 | extern long vt_compat_ioctl(struct tty_struct *tty, struct file * file, |
| 573 | unsigned int cmd, unsigned long arg); | 590 | unsigned int cmd, unsigned long arg); |
| 574 | 591 | ||
| 592 | /* tty_mutex.c */ | ||
| 593 | /* functions for preparation of BKL removal */ | ||
| 594 | extern void __lockfunc tty_lock(void) __acquires(tty_lock); | ||
| 595 | extern void __lockfunc tty_unlock(void) __releases(tty_lock); | ||
| 596 | extern struct task_struct *__big_tty_mutex_owner; | ||
| 597 | #define tty_locked() (current == __big_tty_mutex_owner) | ||
| 598 | |||
| 599 | /* | ||
| 600 | * wait_event_interruptible_tty -- wait for a condition with the tty lock held | ||
| 601 | * | ||
| 602 | * The condition we are waiting for might take a long time to | ||
| 603 | * become true, or might depend on another thread taking the | ||
| 604 | * BTM. In either case, we need to drop the BTM to guarantee | ||
| 605 | * forward progress. This is a leftover from the conversion | ||
| 606 | * from the BKL and should eventually get removed as the BTM | ||
| 607 | * falls out of use. | ||
| 608 | * | ||
| 609 | * Do not use in new code. | ||
| 610 | */ | ||
| 611 | #define wait_event_interruptible_tty(wq, condition) \ | ||
| 612 | ({ \ | ||
| 613 | int __ret = 0; \ | ||
| 614 | if (!(condition)) { \ | ||
| 615 | __wait_event_interruptible_tty(wq, condition, __ret); \ | ||
| 616 | } \ | ||
| 617 | __ret; \ | ||
| 618 | }) | ||
| 619 | |||
| 620 | #define __wait_event_interruptible_tty(wq, condition, ret) \ | ||
| 621 | do { \ | ||
| 622 | DEFINE_WAIT(__wait); \ | ||
| 623 | \ | ||
| 624 | for (;;) { \ | ||
| 625 | prepare_to_wait(&wq, &__wait, TASK_INTERRUPTIBLE); \ | ||
| 626 | if (condition) \ | ||
| 627 | break; \ | ||
| 628 | if (!signal_pending(current)) { \ | ||
| 629 | tty_unlock(); \ | ||
| 630 | schedule(); \ | ||
| 631 | tty_lock(); \ | ||
| 632 | continue; \ | ||
| 633 | } \ | ||
| 634 | ret = -ERESTARTSYS; \ | ||
| 635 | break; \ | ||
| 636 | } \ | ||
| 637 | finish_wait(&wq, &__wait); \ | ||
| 638 | } while (0) | ||
| 639 | |||
| 640 | |||
| 575 | #endif /* __KERNEL__ */ | 641 | #endif /* __KERNEL__ */ |
| 576 | #endif | 642 | #endif |
diff --git a/include/linux/tty_driver.h b/include/linux/tty_driver.h index b08677982525..db2d227694da 100644 --- a/include/linux/tty_driver.h +++ b/include/linux/tty_driver.h | |||
| @@ -224,6 +224,12 @@ | |||
| 224 | * unless the tty also has a valid tty->termiox pointer. | 224 | * unless the tty also has a valid tty->termiox pointer. |
| 225 | * | 225 | * |
| 226 | * Optional: Called under the termios lock | 226 | * Optional: Called under the termios lock |
| 227 | * | ||
| 228 | * int (*get_icount)(struct tty_struct *tty, struct serial_icounter *icount); | ||
| 229 | * | ||
| 230 | * Called when the device receives a TIOCGICOUNT ioctl. Passed a kernel | ||
| 231 | * structure to complete. This method is optional and will only be called | ||
| 232 | * if provided (otherwise EINVAL will be returned). | ||
| 227 | */ | 233 | */ |
| 228 | 234 | ||
| 229 | #include <linux/fs.h> | 235 | #include <linux/fs.h> |
| @@ -232,6 +238,7 @@ | |||
| 232 | 238 | ||
| 233 | struct tty_struct; | 239 | struct tty_struct; |
| 234 | struct tty_driver; | 240 | struct tty_driver; |
| 241 | struct serial_icounter_struct; | ||
| 235 | 242 | ||
| 236 | struct tty_operations { | 243 | struct tty_operations { |
| 237 | struct tty_struct * (*lookup)(struct tty_driver *driver, | 244 | struct tty_struct * (*lookup)(struct tty_driver *driver, |
| @@ -268,6 +275,8 @@ struct tty_operations { | |||
| 268 | unsigned int set, unsigned int clear); | 275 | unsigned int set, unsigned int clear); |
| 269 | int (*resize)(struct tty_struct *tty, struct winsize *ws); | 276 | int (*resize)(struct tty_struct *tty, struct winsize *ws); |
| 270 | int (*set_termiox)(struct tty_struct *tty, struct termiox *tnew); | 277 | int (*set_termiox)(struct tty_struct *tty, struct termiox *tnew); |
| 278 | int (*get_icount)(struct tty_struct *tty, | ||
| 279 | struct serial_icounter_struct *icount); | ||
| 271 | #ifdef CONFIG_CONSOLE_POLL | 280 | #ifdef CONFIG_CONSOLE_POLL |
| 272 | int (*poll_init)(struct tty_driver *driver, int line, char *options); | 281 | int (*poll_init)(struct tty_driver *driver, int line, char *options); |
| 273 | int (*poll_get_char)(struct tty_driver *driver, int line); | 282 | int (*poll_get_char)(struct tty_driver *driver, int line); |
diff --git a/include/linux/types.h b/include/linux/types.h index 23d237a075e2..c2a9eb44f2fa 100644 --- a/include/linux/types.h +++ b/include/linux/types.h | |||
| @@ -8,7 +8,10 @@ | |||
| 8 | 8 | ||
| 9 | #define DECLARE_BITMAP(name,bits) \ | 9 | #define DECLARE_BITMAP(name,bits) \ |
| 10 | unsigned long name[BITS_TO_LONGS(bits)] | 10 | unsigned long name[BITS_TO_LONGS(bits)] |
| 11 | 11 | #else | |
| 12 | #ifndef __EXPORTED_HEADERS__ | ||
| 13 | #warning "Attempt to use kernel headers from user space, see http://kernelnewbies.org/KernelHeaders" | ||
| 14 | #endif /* __EXPORTED_HEADERS__ */ | ||
| 12 | #endif | 15 | #endif |
| 13 | 16 | ||
| 14 | #include <linux/posix_types.h> | 17 | #include <linux/posix_types.h> |
| @@ -175,6 +178,19 @@ typedef __u64 __bitwise __be64; | |||
| 175 | typedef __u16 __bitwise __sum16; | 178 | typedef __u16 __bitwise __sum16; |
| 176 | typedef __u32 __bitwise __wsum; | 179 | typedef __u32 __bitwise __wsum; |
| 177 | 180 | ||
| 181 | /* | ||
| 182 | * aligned_u64 should be used in defining kernel<->userspace ABIs to avoid | ||
| 183 | * common 32/64-bit compat problems. | ||
| 184 | * 64-bit values align to 4-byte boundaries on x86_32 (and possibly other | ||
| 185 | * architectures) and to 8-byte boundaries on 64-bit architetures. The new | ||
| 186 | * aligned_64 type enforces 8-byte alignment so that structs containing | ||
| 187 | * aligned_64 values have the same alignment on 32-bit and 64-bit architectures. | ||
| 188 | * No conversions are necessary between 32-bit user-space and a 64-bit kernel. | ||
| 189 | */ | ||
| 190 | #define __aligned_u64 __u64 __attribute__((aligned(8))) | ||
| 191 | #define __aligned_be64 __be64 __attribute__((aligned(8))) | ||
| 192 | #define __aligned_le64 __le64 __attribute__((aligned(8))) | ||
| 193 | |||
| 178 | #ifdef __KERNEL__ | 194 | #ifdef __KERNEL__ |
| 179 | typedef unsigned __bitwise__ gfp_t; | 195 | typedef unsigned __bitwise__ gfp_t; |
| 180 | typedef unsigned __bitwise__ fmode_t; | 196 | typedef unsigned __bitwise__ fmode_t; |
| @@ -197,6 +213,18 @@ typedef struct { | |||
| 197 | } atomic64_t; | 213 | } atomic64_t; |
| 198 | #endif | 214 | #endif |
| 199 | 215 | ||
| 216 | struct list_head { | ||
| 217 | struct list_head *next, *prev; | ||
| 218 | }; | ||
| 219 | |||
| 220 | struct hlist_head { | ||
| 221 | struct hlist_node *first; | ||
| 222 | }; | ||
| 223 | |||
| 224 | struct hlist_node { | ||
| 225 | struct hlist_node *next, **pprev; | ||
| 226 | }; | ||
| 227 | |||
| 200 | struct ustat { | 228 | struct ustat { |
| 201 | __kernel_daddr_t f_tfree; | 229 | __kernel_daddr_t f_tfree; |
| 202 | __kernel_ino_t f_tinode; | 230 | __kernel_ino_t f_tinode; |
diff --git a/include/linux/u64_stats_sync.h b/include/linux/u64_stats_sync.h new file mode 100644 index 000000000000..fa261a0da280 --- /dev/null +++ b/include/linux/u64_stats_sync.h | |||
| @@ -0,0 +1,140 @@ | |||
| 1 | #ifndef _LINUX_U64_STATS_SYNC_H | ||
| 2 | #define _LINUX_U64_STATS_SYNC_H | ||
| 3 | |||
| 4 | /* | ||
| 5 | * To properly implement 64bits network statistics on 32bit and 64bit hosts, | ||
| 6 | * we provide a synchronization point, that is a noop on 64bit or UP kernels. | ||
| 7 | * | ||
| 8 | * Key points : | ||
| 9 | * 1) Use a seqcount on SMP 32bits, with low overhead. | ||
| 10 | * 2) Whole thing is a noop on 64bit arches or UP kernels. | ||
| 11 | * 3) Write side must ensure mutual exclusion or one seqcount update could | ||
| 12 | * be lost, thus blocking readers forever. | ||
| 13 | * If this synchronization point is not a mutex, but a spinlock or | ||
| 14 | * spinlock_bh() or disable_bh() : | ||
| 15 | * 3.1) Write side should not sleep. | ||
| 16 | * 3.2) Write side should not allow preemption. | ||
| 17 | * 3.3) If applicable, interrupts should be disabled. | ||
| 18 | * | ||
| 19 | * 4) If reader fetches several counters, there is no guarantee the whole values | ||
| 20 | * are consistent (remember point 1) : this is a noop on 64bit arches anyway) | ||
| 21 | * | ||
| 22 | * 5) readers are allowed to sleep or be preempted/interrupted : They perform | ||
| 23 | * pure reads. But if they have to fetch many values, it's better to not allow | ||
| 24 | * preemptions/interruptions to avoid many retries. | ||
| 25 | * | ||
| 26 | * 6) If counter might be written by an interrupt, readers should block interrupts. | ||
| 27 | * (On UP, there is no seqcount_t protection, a reader allowing interrupts could | ||
| 28 | * read partial values) | ||
| 29 | * | ||
| 30 | * 7) For softirq uses, readers can use u64_stats_fetch_begin_bh() and | ||
| 31 | * u64_stats_fetch_retry_bh() helpers | ||
| 32 | * | ||
| 33 | * Usage : | ||
| 34 | * | ||
| 35 | * Stats producer (writer) should use following template granted it already got | ||
| 36 | * an exclusive access to counters (a lock is already taken, or per cpu | ||
| 37 | * data is used [in a non preemptable context]) | ||
| 38 | * | ||
| 39 | * spin_lock_bh(...) or other synchronization to get exclusive access | ||
| 40 | * ... | ||
| 41 | * u64_stats_update_begin(&stats->syncp); | ||
| 42 | * stats->bytes64 += len; // non atomic operation | ||
| 43 | * stats->packets64++; // non atomic operation | ||
| 44 | * u64_stats_update_end(&stats->syncp); | ||
| 45 | * | ||
| 46 | * While a consumer (reader) should use following template to get consistent | ||
| 47 | * snapshot for each variable (but no guarantee on several ones) | ||
| 48 | * | ||
| 49 | * u64 tbytes, tpackets; | ||
| 50 | * unsigned int start; | ||
| 51 | * | ||
| 52 | * do { | ||
| 53 | * start = u64_stats_fetch_begin(&stats->syncp); | ||
| 54 | * tbytes = stats->bytes64; // non atomic operation | ||
| 55 | * tpackets = stats->packets64; // non atomic operation | ||
| 56 | * } while (u64_stats_fetch_retry(&stats->syncp, start)); | ||
| 57 | * | ||
| 58 | * | ||
| 59 | * Example of use in drivers/net/loopback.c, using per_cpu containers, | ||
| 60 | * in BH disabled context. | ||
| 61 | */ | ||
| 62 | #include <linux/seqlock.h> | ||
| 63 | |||
| 64 | struct u64_stats_sync { | ||
| 65 | #if BITS_PER_LONG==32 && defined(CONFIG_SMP) | ||
| 66 | seqcount_t seq; | ||
| 67 | #endif | ||
| 68 | }; | ||
| 69 | |||
| 70 | static void inline u64_stats_update_begin(struct u64_stats_sync *syncp) | ||
| 71 | { | ||
| 72 | #if BITS_PER_LONG==32 && defined(CONFIG_SMP) | ||
| 73 | write_seqcount_begin(&syncp->seq); | ||
| 74 | #endif | ||
| 75 | } | ||
| 76 | |||
| 77 | static void inline u64_stats_update_end(struct u64_stats_sync *syncp) | ||
| 78 | { | ||
| 79 | #if BITS_PER_LONG==32 && defined(CONFIG_SMP) | ||
| 80 | write_seqcount_end(&syncp->seq); | ||
| 81 | #endif | ||
| 82 | } | ||
| 83 | |||
| 84 | static unsigned int inline u64_stats_fetch_begin(const struct u64_stats_sync *syncp) | ||
| 85 | { | ||
| 86 | #if BITS_PER_LONG==32 && defined(CONFIG_SMP) | ||
| 87 | return read_seqcount_begin(&syncp->seq); | ||
| 88 | #else | ||
| 89 | #if BITS_PER_LONG==32 | ||
| 90 | preempt_disable(); | ||
| 91 | #endif | ||
| 92 | return 0; | ||
| 93 | #endif | ||
| 94 | } | ||
| 95 | |||
| 96 | static bool inline u64_stats_fetch_retry(const struct u64_stats_sync *syncp, | ||
| 97 | unsigned int start) | ||
| 98 | { | ||
| 99 | #if BITS_PER_LONG==32 && defined(CONFIG_SMP) | ||
| 100 | return read_seqcount_retry(&syncp->seq, start); | ||
| 101 | #else | ||
| 102 | #if BITS_PER_LONG==32 | ||
| 103 | preempt_enable(); | ||
| 104 | #endif | ||
| 105 | return false; | ||
| 106 | #endif | ||
| 107 | } | ||
| 108 | |||
| 109 | /* | ||
| 110 | * In case softirq handlers can update u64 counters, readers can use following helpers | ||
| 111 | * - SMP 32bit arches use seqcount protection, irq safe. | ||
| 112 | * - UP 32bit must disable BH. | ||
| 113 | * - 64bit have no problem atomically reading u64 values, irq safe. | ||
| 114 | */ | ||
| 115 | static unsigned int inline u64_stats_fetch_begin_bh(const struct u64_stats_sync *syncp) | ||
| 116 | { | ||
| 117 | #if BITS_PER_LONG==32 && defined(CONFIG_SMP) | ||
| 118 | return read_seqcount_begin(&syncp->seq); | ||
| 119 | #else | ||
| 120 | #if BITS_PER_LONG==32 | ||
| 121 | local_bh_disable(); | ||
| 122 | #endif | ||
| 123 | return 0; | ||
| 124 | #endif | ||
| 125 | } | ||
| 126 | |||
| 127 | static bool inline u64_stats_fetch_retry_bh(const struct u64_stats_sync *syncp, | ||
| 128 | unsigned int start) | ||
| 129 | { | ||
| 130 | #if BITS_PER_LONG==32 && defined(CONFIG_SMP) | ||
| 131 | return read_seqcount_retry(&syncp->seq, start); | ||
| 132 | #else | ||
| 133 | #if BITS_PER_LONG==32 | ||
| 134 | local_bh_enable(); | ||
| 135 | #endif | ||
| 136 | return false; | ||
| 137 | #endif | ||
| 138 | } | ||
| 139 | |||
| 140 | #endif /* _LINUX_U64_STATS_SYNC_H */ | ||
diff --git a/include/linux/uinput.h b/include/linux/uinput.h index 60c81da77f0f..05f7fed2b173 100644 --- a/include/linux/uinput.h +++ b/include/linux/uinput.h | |||
| @@ -37,7 +37,6 @@ | |||
| 37 | #define UINPUT_VERSION 3 | 37 | #define UINPUT_VERSION 3 |
| 38 | 38 | ||
| 39 | #ifdef __KERNEL__ | 39 | #ifdef __KERNEL__ |
| 40 | #define UINPUT_MINOR 223 | ||
| 41 | #define UINPUT_NAME "uinput" | 40 | #define UINPUT_NAME "uinput" |
| 42 | #define UINPUT_BUFFER_SIZE 16 | 41 | #define UINPUT_BUFFER_SIZE 16 |
| 43 | #define UINPUT_NUM_REQUESTS 16 | 42 | #define UINPUT_NUM_REQUESTS 16 |
diff --git a/include/linux/uio_driver.h b/include/linux/uio_driver.h index 5dcc9ff72f69..d6188e5a52df 100644 --- a/include/linux/uio_driver.h +++ b/include/linux/uio_driver.h | |||
| @@ -108,7 +108,7 @@ extern void uio_event_notify(struct uio_info *info); | |||
| 108 | 108 | ||
| 109 | /* defines for uio_info->irq */ | 109 | /* defines for uio_info->irq */ |
| 110 | #define UIO_IRQ_CUSTOM -1 | 110 | #define UIO_IRQ_CUSTOM -1 |
| 111 | #define UIO_IRQ_NONE -2 | 111 | #define UIO_IRQ_NONE 0 |
| 112 | 112 | ||
| 113 | /* defines for uio_mem->memtype */ | 113 | /* defines for uio_mem->memtype */ |
| 114 | #define UIO_MEM_NONE 0 | 114 | #define UIO_MEM_NONE 0 |
diff --git a/include/linux/usb.h b/include/linux/usb.h index d5922a877994..35fe6ab222bb 100644 --- a/include/linux/usb.h +++ b/include/linux/usb.h | |||
| @@ -127,6 +127,8 @@ enum usb_interface_condition { | |||
| 127 | * queued reset so that usb_cancel_queued_reset() doesn't try to | 127 | * queued reset so that usb_cancel_queued_reset() doesn't try to |
| 128 | * remove from the workqueue when running inside the worker | 128 | * remove from the workqueue when running inside the worker |
| 129 | * thread. See __usb_queue_reset_device(). | 129 | * thread. See __usb_queue_reset_device(). |
| 130 | * @resetting_device: USB core reset the device, so use alt setting 0 as | ||
| 131 | * current; needs bandwidth alloc after reset. | ||
| 130 | * | 132 | * |
| 131 | * USB device drivers attach to interfaces on a physical device. Each | 133 | * USB device drivers attach to interfaces on a physical device. Each |
| 132 | * interface encapsulates a single high level function, such as feeding | 134 | * interface encapsulates a single high level function, such as feeding |
| @@ -843,7 +845,7 @@ struct usb_driver { | |||
| 843 | 845 | ||
| 844 | void (*disconnect) (struct usb_interface *intf); | 846 | void (*disconnect) (struct usb_interface *intf); |
| 845 | 847 | ||
| 846 | int (*ioctl) (struct usb_interface *intf, unsigned int code, | 848 | int (*unlocked_ioctl) (struct usb_interface *intf, unsigned int code, |
| 847 | void *buf); | 849 | void *buf); |
| 848 | 850 | ||
| 849 | int (*suspend) (struct usb_interface *intf, pm_message_t message); | 851 | int (*suspend) (struct usb_interface *intf, pm_message_t message); |
| @@ -1015,6 +1017,7 @@ typedef void (*usb_complete_t)(struct urb *); | |||
| 1015 | * is a different endpoint (and pipe) from "out" endpoint two. | 1017 | * is a different endpoint (and pipe) from "out" endpoint two. |
| 1016 | * The current configuration controls the existence, type, and | 1018 | * The current configuration controls the existence, type, and |
| 1017 | * maximum packet size of any given endpoint. | 1019 | * maximum packet size of any given endpoint. |
| 1020 | * @stream_id: the endpoint's stream ID for bulk streams | ||
| 1018 | * @dev: Identifies the USB device to perform the request. | 1021 | * @dev: Identifies the USB device to perform the request. |
| 1019 | * @status: This is read in non-iso completion functions to get the | 1022 | * @status: This is read in non-iso completion functions to get the |
| 1020 | * status of the particular request. ISO requests only use it | 1023 | * status of the particular request. ISO requests only use it |
diff --git a/include/linux/usb/audio-v2.h b/include/linux/usb/audio-v2.h index 383b94ba8c20..964cb603f7c7 100644 --- a/include/linux/usb/audio-v2.h +++ b/include/linux/usb/audio-v2.h | |||
| @@ -18,6 +18,21 @@ | |||
| 18 | /* v1.0 and v2.0 of this standard have many things in common. For the rest | 18 | /* v1.0 and v2.0 of this standard have many things in common. For the rest |
| 19 | * of the definitions, please refer to audio.h */ | 19 | * of the definitions, please refer to audio.h */ |
| 20 | 20 | ||
| 21 | /* | ||
| 22 | * bmControl field decoders | ||
| 23 | * | ||
| 24 | * From the USB Audio spec v2.0: | ||
| 25 | * | ||
| 26 | * bmaControls() is a (ch+1)-element array of 4-byte bitmaps, | ||
| 27 | * each containing a set of bit pairs. If a Control is present, | ||
| 28 | * it must be Host readable. If a certain Control is not | ||
| 29 | * present then the bit pair must be set to 0b00. | ||
| 30 | * If a Control is present but read-only, the bit pair must be | ||
| 31 | * set to 0b01. If a Control is also Host programmable, the bit | ||
| 32 | * pair must be set to 0b11. The value 0b10 is not allowed. | ||
| 33 | * | ||
| 34 | */ | ||
| 35 | |||
| 21 | static inline bool uac2_control_is_readable(u32 bmControls, u8 control) | 36 | static inline bool uac2_control_is_readable(u32 bmControls, u8 control) |
| 22 | { | 37 | { |
| 23 | return (bmControls >> (control * 2)) & 0x1; | 38 | return (bmControls >> (control * 2)) & 0x1; |
| @@ -121,7 +136,7 @@ struct uac2_feature_unit_descriptor { | |||
| 121 | 136 | ||
| 122 | /* 4.9.2 Class-Specific AS Interface Descriptor */ | 137 | /* 4.9.2 Class-Specific AS Interface Descriptor */ |
| 123 | 138 | ||
| 124 | struct uac_as_header_descriptor_v2 { | 139 | struct uac2_as_header_descriptor { |
| 125 | __u8 bLength; | 140 | __u8 bLength; |
| 126 | __u8 bDescriptorType; | 141 | __u8 bDescriptorType; |
| 127 | __u8 bDescriptorSubtype; | 142 | __u8 bDescriptorSubtype; |
diff --git a/include/linux/usb/audio.h b/include/linux/usb/audio.h index c51200c715e5..a54b8255d75f 100644 --- a/include/linux/usb/audio.h +++ b/include/linux/usb/audio.h | |||
| @@ -39,8 +39,8 @@ | |||
| 39 | #define UAC_MIXER_UNIT 0x04 | 39 | #define UAC_MIXER_UNIT 0x04 |
| 40 | #define UAC_SELECTOR_UNIT 0x05 | 40 | #define UAC_SELECTOR_UNIT 0x05 |
| 41 | #define UAC_FEATURE_UNIT 0x06 | 41 | #define UAC_FEATURE_UNIT 0x06 |
| 42 | #define UAC_PROCESSING_UNIT_V1 0x07 | 42 | #define UAC1_PROCESSING_UNIT 0x07 |
| 43 | #define UAC_EXTENSION_UNIT_V1 0x08 | 43 | #define UAC1_EXTENSION_UNIT 0x08 |
| 44 | 44 | ||
| 45 | /* A.6 Audio Class-Specific AS Interface Descriptor Subtypes */ | 45 | /* A.6 Audio Class-Specific AS Interface Descriptor Subtypes */ |
| 46 | #define UAC_AS_GENERAL 0x01 | 46 | #define UAC_AS_GENERAL 0x01 |
| @@ -151,7 +151,7 @@ | |||
| 151 | 151 | ||
| 152 | /* Terminal Control Selectors */ | 152 | /* Terminal Control Selectors */ |
| 153 | /* 4.3.2 Class-Specific AC Interface Descriptor */ | 153 | /* 4.3.2 Class-Specific AC Interface Descriptor */ |
| 154 | struct uac_ac_header_descriptor_v1 { | 154 | struct uac1_ac_header_descriptor { |
| 155 | __u8 bLength; /* 8 + n */ | 155 | __u8 bLength; /* 8 + n */ |
| 156 | __u8 bDescriptorType; /* USB_DT_CS_INTERFACE */ | 156 | __u8 bDescriptorType; /* USB_DT_CS_INTERFACE */ |
| 157 | __u8 bDescriptorSubtype; /* UAC_MS_HEADER */ | 157 | __u8 bDescriptorSubtype; /* UAC_MS_HEADER */ |
| @@ -165,7 +165,7 @@ struct uac_ac_header_descriptor_v1 { | |||
| 165 | 165 | ||
| 166 | /* As above, but more useful for defining your own descriptors: */ | 166 | /* As above, but more useful for defining your own descriptors: */ |
| 167 | #define DECLARE_UAC_AC_HEADER_DESCRIPTOR(n) \ | 167 | #define DECLARE_UAC_AC_HEADER_DESCRIPTOR(n) \ |
| 168 | struct uac_ac_header_descriptor_v1_##n { \ | 168 | struct uac1_ac_header_descriptor_##n { \ |
| 169 | __u8 bLength; \ | 169 | __u8 bLength; \ |
| 170 | __u8 bDescriptorType; \ | 170 | __u8 bDescriptorType; \ |
| 171 | __u8 bDescriptorSubtype; \ | 171 | __u8 bDescriptorSubtype; \ |
| @@ -205,7 +205,7 @@ struct uac_input_terminal_descriptor { | |||
| 205 | #define UAC_TERMINAL_CS_COPY_PROTECT_CONTROL 0x01 | 205 | #define UAC_TERMINAL_CS_COPY_PROTECT_CONTROL 0x01 |
| 206 | 206 | ||
| 207 | /* 4.3.2.2 Output Terminal Descriptor */ | 207 | /* 4.3.2.2 Output Terminal Descriptor */ |
| 208 | struct uac_output_terminal_descriptor_v1 { | 208 | struct uac1_output_terminal_descriptor { |
| 209 | __u8 bLength; /* in bytes: 9 */ | 209 | __u8 bLength; /* in bytes: 9 */ |
| 210 | __u8 bDescriptorType; /* CS_INTERFACE descriptor type */ | 210 | __u8 bDescriptorType; /* CS_INTERFACE descriptor type */ |
| 211 | __u8 bDescriptorSubtype; /* OUTPUT_TERMINAL descriptor subtype */ | 211 | __u8 bDescriptorSubtype; /* OUTPUT_TERMINAL descriptor subtype */ |
| @@ -395,7 +395,7 @@ static inline __u8 *uac_processing_unit_specific(struct uac_processing_unit_desc | |||
| 395 | } | 395 | } |
| 396 | 396 | ||
| 397 | /* 4.5.2 Class-Specific AS Interface Descriptor */ | 397 | /* 4.5.2 Class-Specific AS Interface Descriptor */ |
| 398 | struct uac_as_header_descriptor_v1 { | 398 | struct uac1_as_header_descriptor { |
| 399 | __u8 bLength; /* in bytes: 7 */ | 399 | __u8 bLength; /* in bytes: 7 */ |
| 400 | __u8 bDescriptorType; /* USB_DT_CS_INTERFACE */ | 400 | __u8 bDescriptorType; /* USB_DT_CS_INTERFACE */ |
| 401 | __u8 bDescriptorSubtype; /* AS_GENERAL */ | 401 | __u8 bDescriptorSubtype; /* AS_GENERAL */ |
diff --git a/include/linux/usb/cdc.h b/include/linux/usb/cdc.h index c117a68d04a7..5e86dc771da4 100644 --- a/include/linux/usb/cdc.h +++ b/include/linux/usb/cdc.h | |||
| @@ -32,6 +32,8 @@ | |||
| 32 | 32 | ||
| 33 | #define USB_CDC_PROTO_EEM 7 | 33 | #define USB_CDC_PROTO_EEM 7 |
| 34 | 34 | ||
| 35 | #define USB_CDC_NCM_PROTO_NTB 1 | ||
| 36 | |||
| 35 | /*-------------------------------------------------------------------------*/ | 37 | /*-------------------------------------------------------------------------*/ |
| 36 | 38 | ||
| 37 | /* | 39 | /* |
| @@ -274,13 +276,13 @@ struct usb_cdc_notification { | |||
| 274 | /* | 276 | /* |
| 275 | * Class Specific structures and constants | 277 | * Class Specific structures and constants |
| 276 | * | 278 | * |
| 277 | * CDC NCM parameter structure, CDC NCM subclass 6.2.1 | 279 | * CDC NCM NTB parameters structure, CDC NCM subclass 6.2.1 |
| 278 | * | 280 | * |
| 279 | */ | 281 | */ |
| 280 | 282 | ||
| 281 | struct usb_cdc_ncm_ntb_parameter { | 283 | struct usb_cdc_ncm_ntb_parameters { |
| 282 | __le16 wLength; | 284 | __le16 wLength; |
| 283 | __le16 bmNtbFormatSupported; | 285 | __le16 bmNtbFormatsSupported; |
| 284 | __le32 dwNtbInMaxSize; | 286 | __le32 dwNtbInMaxSize; |
| 285 | __le16 wNdpInDivisor; | 287 | __le16 wNdpInDivisor; |
| 286 | __le16 wNdpInPayloadRemainder; | 288 | __le16 wNdpInPayloadRemainder; |
| @@ -297,8 +299,8 @@ struct usb_cdc_ncm_ntb_parameter { | |||
| 297 | * CDC NCM transfer headers, CDC NCM subclass 3.2 | 299 | * CDC NCM transfer headers, CDC NCM subclass 3.2 |
| 298 | */ | 300 | */ |
| 299 | 301 | ||
| 300 | #define NCM_NTH16_SIGN 0x484D434E /* NCMH */ | 302 | #define USB_CDC_NCM_NTH16_SIGN 0x484D434E /* NCMH */ |
| 301 | #define NCM_NTH32_SIGN 0x686D636E /* ncmh */ | 303 | #define USB_CDC_NCM_NTH32_SIGN 0x686D636E /* ncmh */ |
| 302 | 304 | ||
| 303 | struct usb_cdc_ncm_nth16 { | 305 | struct usb_cdc_ncm_nth16 { |
| 304 | __le32 dwSignature; | 306 | __le32 dwSignature; |
| @@ -320,25 +322,78 @@ struct usb_cdc_ncm_nth32 { | |||
| 320 | * CDC NCM datagram pointers, CDC NCM subclass 3.3 | 322 | * CDC NCM datagram pointers, CDC NCM subclass 3.3 |
| 321 | */ | 323 | */ |
| 322 | 324 | ||
| 323 | #define NCM_NDP16_CRC_SIGN 0x314D434E /* NCM1 */ | 325 | #define USB_CDC_NCM_NDP16_CRC_SIGN 0x314D434E /* NCM1 */ |
| 324 | #define NCM_NDP16_NOCRC_SIGN 0x304D434E /* NCM0 */ | 326 | #define USB_CDC_NCM_NDP16_NOCRC_SIGN 0x304D434E /* NCM0 */ |
| 325 | #define NCM_NDP32_CRC_SIGN 0x316D636E /* ncm1 */ | 327 | #define USB_CDC_NCM_NDP32_CRC_SIGN 0x316D636E /* ncm1 */ |
| 326 | #define NCM_NDP32_NOCRC_SIGN 0x306D636E /* ncm0 */ | 328 | #define USB_CDC_NCM_NDP32_NOCRC_SIGN 0x306D636E /* ncm0 */ |
| 329 | |||
| 330 | /* 16-bit NCM Datagram Pointer Entry */ | ||
| 331 | struct usb_cdc_ncm_dpe16 { | ||
| 332 | __le16 wDatagramIndex; | ||
| 333 | __le16 wDatagramLength; | ||
| 334 | } __attribute__((__packed__)); | ||
| 327 | 335 | ||
| 336 | /* 16-bit NCM Datagram Pointer Table */ | ||
| 328 | struct usb_cdc_ncm_ndp16 { | 337 | struct usb_cdc_ncm_ndp16 { |
| 329 | __le32 dwSignature; | 338 | __le32 dwSignature; |
| 330 | __le16 wLength; | 339 | __le16 wLength; |
| 331 | __le16 wNextFpIndex; | 340 | __le16 wNextFpIndex; |
| 332 | __u8 data[0]; | 341 | struct usb_cdc_ncm_dpe16 dpe16[0]; |
| 333 | } __attribute__ ((packed)); | 342 | } __attribute__ ((packed)); |
| 334 | 343 | ||
| 344 | /* 32-bit NCM Datagram Pointer Entry */ | ||
| 345 | struct usb_cdc_ncm_dpe32 { | ||
| 346 | __le32 dwDatagramIndex; | ||
| 347 | __le32 dwDatagramLength; | ||
| 348 | } __attribute__((__packed__)); | ||
| 349 | |||
| 350 | /* 32-bit NCM Datagram Pointer Table */ | ||
| 335 | struct usb_cdc_ncm_ndp32 { | 351 | struct usb_cdc_ncm_ndp32 { |
| 336 | __le32 dwSignature; | 352 | __le32 dwSignature; |
| 337 | __le16 wLength; | 353 | __le16 wLength; |
| 338 | __le16 wReserved6; | 354 | __le16 wReserved6; |
| 339 | __le32 dwNextFpIndex; | 355 | __le32 dwNextNdpIndex; |
| 340 | __le32 dwReserved12; | 356 | __le32 dwReserved12; |
| 341 | __u8 data[0]; | 357 | struct usb_cdc_ncm_dpe32 dpe32[0]; |
| 342 | } __attribute__ ((packed)); | 358 | } __attribute__ ((packed)); |
| 343 | 359 | ||
| 360 | /* CDC NCM subclass 3.2.1 and 3.2.2 */ | ||
| 361 | #define USB_CDC_NCM_NDP16_INDEX_MIN 0x000C | ||
| 362 | #define USB_CDC_NCM_NDP32_INDEX_MIN 0x0010 | ||
| 363 | |||
| 364 | /* CDC NCM subclass 3.3.3 Datagram Formatting */ | ||
| 365 | #define USB_CDC_NCM_DATAGRAM_FORMAT_CRC 0x30 | ||
| 366 | #define USB_CDC_NCM_DATAGRAM_FORMAT_NOCRC 0X31 | ||
| 367 | |||
| 368 | /* CDC NCM subclass 4.2 NCM Communications Interface Protocol Code */ | ||
| 369 | #define USB_CDC_NCM_PROTO_CODE_NO_ENCAP_COMMANDS 0x00 | ||
| 370 | #define USB_CDC_NCM_PROTO_CODE_EXTERN_PROTO 0xFE | ||
| 371 | |||
| 372 | /* CDC NCM subclass 5.2.1 NCM Functional Descriptor, bmNetworkCapabilities */ | ||
| 373 | #define USB_CDC_NCM_NCAP_ETH_FILTER (1 << 0) | ||
| 374 | #define USB_CDC_NCM_NCAP_NET_ADDRESS (1 << 1) | ||
| 375 | #define USB_CDC_NCM_NCAP_ENCAP_COMMAND (1 << 2) | ||
| 376 | #define USB_CDC_NCM_NCAP_MAX_DATAGRAM_SIZE (1 << 3) | ||
| 377 | #define USB_CDC_NCM_NCAP_CRC_MODE (1 << 4) | ||
| 378 | |||
| 379 | /* CDC NCM subclass Table 6-3: NTB Parameter Structure */ | ||
| 380 | #define USB_CDC_NCM_NTB16_SUPPORTED (1 << 0) | ||
| 381 | #define USB_CDC_NCM_NTB32_SUPPORTED (1 << 1) | ||
| 382 | |||
| 383 | /* CDC NCM subclass Table 6-3: NTB Parameter Structure */ | ||
| 384 | #define USB_CDC_NCM_NDP_ALIGN_MIN_SIZE 0x04 | ||
| 385 | #define USB_CDC_NCM_NTB_MAX_LENGTH 0x1C | ||
| 386 | |||
| 387 | /* CDC NCM subclass 6.2.5 SetNtbFormat */ | ||
| 388 | #define USB_CDC_NCM_NTB16_FORMAT 0x00 | ||
| 389 | #define USB_CDC_NCM_NTB32_FORMAT 0x01 | ||
| 390 | |||
| 391 | /* CDC NCM subclass 6.2.7 SetNtbInputSize */ | ||
| 392 | #define USB_CDC_NCM_NTB_MIN_IN_SIZE 2048 | ||
| 393 | #define USB_CDC_NCM_NTB_MIN_OUT_SIZE 2048 | ||
| 394 | |||
| 395 | /* CDC NCM subclass 6.2.11 SetCrcMode */ | ||
| 396 | #define USB_CDC_NCM_CRC_NOT_APPENDED 0x00 | ||
| 397 | #define USB_CDC_NCM_CRC_APPENDED 0x01 | ||
| 398 | |||
| 344 | #endif /* __LINUX_USB_CDC_H */ | 399 | #endif /* __LINUX_USB_CDC_H */ |
diff --git a/include/linux/usb/ch9.h b/include/linux/usb/ch9.h index da2ed77d3e8d..f917bbbc8901 100644 --- a/include/linux/usb/ch9.h +++ b/include/linux/usb/ch9.h | |||
| @@ -123,8 +123,23 @@ | |||
| 123 | #define USB_DEVICE_A_ALT_HNP_SUPPORT 5 /* (otg) other RH port does */ | 123 | #define USB_DEVICE_A_ALT_HNP_SUPPORT 5 /* (otg) other RH port does */ |
| 124 | #define USB_DEVICE_DEBUG_MODE 6 /* (special devices only) */ | 124 | #define USB_DEVICE_DEBUG_MODE 6 /* (special devices only) */ |
| 125 | 125 | ||
| 126 | /* | ||
| 127 | * New Feature Selectors as added by USB 3.0 | ||
| 128 | * See USB 3.0 spec Table 9-6 | ||
| 129 | */ | ||
| 130 | #define USB_DEVICE_U1_ENABLE 48 /* dev may initiate U1 transition */ | ||
| 131 | #define USB_DEVICE_U2_ENABLE 49 /* dev may initiate U2 transition */ | ||
| 132 | #define USB_DEVICE_LTM_ENABLE 50 /* dev may send LTM */ | ||
| 133 | #define USB_INTRF_FUNC_SUSPEND 0 /* function suspend */ | ||
| 134 | |||
| 135 | #define USB_INTR_FUNC_SUSPEND_OPT_MASK 0xFF00 | ||
| 136 | |||
| 126 | #define USB_ENDPOINT_HALT 0 /* IN/OUT will STALL */ | 137 | #define USB_ENDPOINT_HALT 0 /* IN/OUT will STALL */ |
| 127 | 138 | ||
| 139 | /* Bit array elements as returned by the USB_REQ_GET_STATUS request. */ | ||
| 140 | #define USB_DEV_STAT_U1_ENABLED 2 /* transition into U1 state */ | ||
| 141 | #define USB_DEV_STAT_U2_ENABLED 3 /* transition into U2 state */ | ||
| 142 | #define USB_DEV_STAT_LTM_ENABLED 4 /* Latency tolerance messages */ | ||
| 128 | 143 | ||
| 129 | /** | 144 | /** |
| 130 | * struct usb_ctrlrequest - SETUP data for a USB device control request | 145 | * struct usb_ctrlrequest - SETUP data for a USB device control request |
| @@ -675,6 +690,7 @@ struct usb_bos_descriptor { | |||
| 675 | __u8 bNumDeviceCaps; | 690 | __u8 bNumDeviceCaps; |
| 676 | } __attribute__((packed)); | 691 | } __attribute__((packed)); |
| 677 | 692 | ||
| 693 | #define USB_DT_BOS_SIZE 5 | ||
| 678 | /*-------------------------------------------------------------------------*/ | 694 | /*-------------------------------------------------------------------------*/ |
| 679 | 695 | ||
| 680 | /* USB_DT_DEVICE_CAPABILITY: grouped with BOS */ | 696 | /* USB_DT_DEVICE_CAPABILITY: grouped with BOS */ |
| @@ -712,16 +728,56 @@ struct usb_wireless_cap_descriptor { /* Ultra Wide Band */ | |||
| 712 | __u8 bReserved; | 728 | __u8 bReserved; |
| 713 | } __attribute__((packed)); | 729 | } __attribute__((packed)); |
| 714 | 730 | ||
| 731 | /* USB 2.0 Extension descriptor */ | ||
| 715 | #define USB_CAP_TYPE_EXT 2 | 732 | #define USB_CAP_TYPE_EXT 2 |
| 716 | 733 | ||
| 717 | struct usb_ext_cap_descriptor { /* Link Power Management */ | 734 | struct usb_ext_cap_descriptor { /* Link Power Management */ |
| 718 | __u8 bLength; | 735 | __u8 bLength; |
| 719 | __u8 bDescriptorType; | 736 | __u8 bDescriptorType; |
| 720 | __u8 bDevCapabilityType; | 737 | __u8 bDevCapabilityType; |
| 721 | __u8 bmAttributes; | 738 | __le32 bmAttributes; |
| 722 | #define USB_LPM_SUPPORT (1 << 1) /* supports LPM */ | 739 | #define USB_LPM_SUPPORT (1 << 1) /* supports LPM */ |
| 723 | } __attribute__((packed)); | 740 | } __attribute__((packed)); |
| 724 | 741 | ||
| 742 | #define USB_DT_USB_EXT_CAP_SIZE 7 | ||
| 743 | |||
| 744 | /* | ||
| 745 | * SuperSpeed USB Capability descriptor: Defines the set of SuperSpeed USB | ||
| 746 | * specific device level capabilities | ||
| 747 | */ | ||
| 748 | #define USB_SS_CAP_TYPE 3 | ||
| 749 | struct usb_ss_cap_descriptor { /* Link Power Management */ | ||
| 750 | __u8 bLength; | ||
| 751 | __u8 bDescriptorType; | ||
| 752 | __u8 bDevCapabilityType; | ||
| 753 | __u8 bmAttributes; | ||
| 754 | #define USB_LTM_SUPPORT (1 << 1) /* supports LTM */ | ||
| 755 | __le16 wSpeedSupported; | ||
| 756 | #define USB_LOW_SPEED_OPERATION (1) /* Low speed operation */ | ||
| 757 | #define USB_FULL_SPEED_OPERATION (1 << 1) /* Full speed operation */ | ||
| 758 | #define USB_HIGH_SPEED_OPERATION (1 << 2) /* High speed operation */ | ||
| 759 | #define USB_5GBPS_OPERATION (1 << 3) /* Operation at 5Gbps */ | ||
| 760 | __u8 bFunctionalitySupport; | ||
| 761 | __u8 bU1devExitLat; | ||
| 762 | __le16 bU2DevExitLat; | ||
| 763 | } __attribute__((packed)); | ||
| 764 | |||
| 765 | #define USB_DT_USB_SS_CAP_SIZE 10 | ||
| 766 | |||
| 767 | /* | ||
| 768 | * Container ID Capability descriptor: Defines the instance unique ID used to | ||
| 769 | * identify the instance across all operating modes | ||
| 770 | */ | ||
| 771 | #define CONTAINER_ID_TYPE 4 | ||
| 772 | struct usb_ss_container_id_descriptor { | ||
| 773 | __u8 bLength; | ||
| 774 | __u8 bDescriptorType; | ||
| 775 | __u8 bDevCapabilityType; | ||
| 776 | __u8 bReserved; | ||
| 777 | __u8 ContainerID[16]; /* 128-bit number */ | ||
| 778 | } __attribute__((packed)); | ||
| 779 | |||
| 780 | #define USB_DT_USB_SS_CONTN_ID_SIZE 20 | ||
| 725 | /*-------------------------------------------------------------------------*/ | 781 | /*-------------------------------------------------------------------------*/ |
| 726 | 782 | ||
| 727 | /* USB_DT_WIRELESS_ENDPOINT_COMP: companion descriptor associated with | 783 | /* USB_DT_WIRELESS_ENDPOINT_COMP: companion descriptor associated with |
| @@ -808,4 +864,14 @@ enum usb_device_state { | |||
| 808 | */ | 864 | */ |
| 809 | }; | 865 | }; |
| 810 | 866 | ||
| 867 | /*-------------------------------------------------------------------------*/ | ||
| 868 | |||
| 869 | /* | ||
| 870 | * As per USB compliance update, a device that is actively drawing | ||
| 871 | * more than 100mA from USB must report itself as bus-powered in | ||
| 872 | * the GetStatus(DEVICE) call. | ||
| 873 | * http://compliance.usb.org/index.asp?UpdateFile=Electrical&Format=Standard#34 | ||
| 874 | */ | ||
| 875 | #define USB_SELF_POWER_VBUS_MAX_DRAW 100 | ||
| 876 | |||
| 811 | #endif /* __LINUX_USB_CH9_H */ | 877 | #endif /* __LINUX_USB_CH9_H */ |
diff --git a/include/linux/usb/composite.h b/include/linux/usb/composite.h index 139353efad34..3d29a7dcac2d 100644 --- a/include/linux/usb/composite.h +++ b/include/linux/usb/composite.h | |||
| @@ -161,8 +161,6 @@ ep_choose(struct usb_gadget *g, struct usb_endpoint_descriptor *hs, | |||
| 161 | * and by language IDs provided in control requests. | 161 | * and by language IDs provided in control requests. |
| 162 | * @descriptors: Table of descriptors preceding all function descriptors. | 162 | * @descriptors: Table of descriptors preceding all function descriptors. |
| 163 | * Examples include OTG and vendor-specific descriptors. | 163 | * Examples include OTG and vendor-specific descriptors. |
| 164 | * @bind: Called from @usb_add_config() to allocate resources unique to this | ||
| 165 | * configuration and to call @usb_add_function() for each function used. | ||
| 166 | * @unbind: Reverses @bind; called as a side effect of unregistering the | 164 | * @unbind: Reverses @bind; called as a side effect of unregistering the |
| 167 | * driver which added this configuration. | 165 | * driver which added this configuration. |
| 168 | * @setup: Used to delegate control requests that aren't handled by standard | 166 | * @setup: Used to delegate control requests that aren't handled by standard |
| @@ -207,8 +205,7 @@ struct usb_configuration { | |||
| 207 | * we can't restructure things to avoid mismatching... | 205 | * we can't restructure things to avoid mismatching... |
| 208 | */ | 206 | */ |
| 209 | 207 | ||
| 210 | /* configuration management: bind/unbind */ | 208 | /* configuration management: unbind/setup */ |
| 211 | int (*bind)(struct usb_configuration *); | ||
| 212 | void (*unbind)(struct usb_configuration *); | 209 | void (*unbind)(struct usb_configuration *); |
| 213 | int (*setup)(struct usb_configuration *, | 210 | int (*setup)(struct usb_configuration *, |
| 214 | const struct usb_ctrlrequest *); | 211 | const struct usb_ctrlrequest *); |
| @@ -232,21 +229,26 @@ struct usb_configuration { | |||
| 232 | }; | 229 | }; |
| 233 | 230 | ||
| 234 | int usb_add_config(struct usb_composite_dev *, | 231 | int usb_add_config(struct usb_composite_dev *, |
| 235 | struct usb_configuration *); | 232 | struct usb_configuration *, |
| 233 | int (*)(struct usb_configuration *)); | ||
| 236 | 234 | ||
| 237 | /** | 235 | /** |
| 238 | * struct usb_composite_driver - groups configurations into a gadget | 236 | * struct usb_composite_driver - groups configurations into a gadget |
| 239 | * @name: For diagnostics, identifies the driver. | 237 | * @name: For diagnostics, identifies the driver. |
| 238 | * @iProduct: Used as iProduct override if @dev->iProduct is not set. | ||
| 239 | * If NULL value of @name is taken. | ||
| 240 | * @iManufacturer: Used as iManufacturer override if @dev->iManufacturer is | ||
| 241 | * not set. If NULL a default "<system> <release> with <udc>" value | ||
| 242 | * will be used. | ||
| 240 | * @dev: Template descriptor for the device, including default device | 243 | * @dev: Template descriptor for the device, including default device |
| 241 | * identifiers. | 244 | * identifiers. |
| 242 | * @strings: tables of strings, keyed by identifiers assigned during bind() | 245 | * @strings: tables of strings, keyed by identifiers assigned during bind() |
| 243 | * and language IDs provided in control requests | 246 | * and language IDs provided in control requests |
| 244 | * @bind: (REQUIRED) Used to allocate resources that are shared across the | 247 | * @needs_serial: set to 1 if the gadget needs userspace to provide |
| 245 | * whole device, such as string IDs, and add its configurations using | 248 | * a serial number. If one is not provided, warning will be printed. |
| 246 | * @usb_add_config(). This may fail by returning a negative errno | 249 | * @unbind: Reverses bind; called as a side effect of unregistering |
| 247 | * value; it should return zero on successful initialization. | ||
| 248 | * @unbind: Reverses @bind(); called as a side effect of unregistering | ||
| 249 | * this driver. | 250 | * this driver. |
| 251 | * @disconnect: optional driver disconnect method | ||
| 250 | * @suspend: Notifies when the host stops sending USB traffic, | 252 | * @suspend: Notifies when the host stops sending USB traffic, |
| 251 | * after function notifications | 253 | * after function notifications |
| 252 | * @resume: Notifies configuration when the host restarts USB traffic, | 254 | * @resume: Notifies configuration when the host restarts USB traffic, |
| @@ -255,7 +257,7 @@ int usb_add_config(struct usb_composite_dev *, | |||
| 255 | * Devices default to reporting self powered operation. Devices which rely | 257 | * Devices default to reporting self powered operation. Devices which rely |
| 256 | * on bus powered operation should report this in their @bind() method. | 258 | * on bus powered operation should report this in their @bind() method. |
| 257 | * | 259 | * |
| 258 | * Before returning from @bind, various fields in the template descriptor | 260 | * Before returning from bind, various fields in the template descriptor |
| 259 | * may be overridden. These include the idVendor/idProduct/bcdDevice values | 261 | * may be overridden. These include the idVendor/idProduct/bcdDevice values |
| 260 | * normally to bind the appropriate host side driver, and the three strings | 262 | * normally to bind the appropriate host side driver, and the three strings |
| 261 | * (iManufacturer, iProduct, iSerialNumber) normally used to provide user | 263 | * (iManufacturer, iProduct, iSerialNumber) normally used to provide user |
| @@ -265,24 +267,24 @@ int usb_add_config(struct usb_composite_dev *, | |||
| 265 | */ | 267 | */ |
| 266 | struct usb_composite_driver { | 268 | struct usb_composite_driver { |
| 267 | const char *name; | 269 | const char *name; |
| 270 | const char *iProduct; | ||
| 271 | const char *iManufacturer; | ||
| 268 | const struct usb_device_descriptor *dev; | 272 | const struct usb_device_descriptor *dev; |
| 269 | struct usb_gadget_strings **strings; | 273 | struct usb_gadget_strings **strings; |
| 274 | unsigned needs_serial:1; | ||
| 270 | 275 | ||
| 271 | /* REVISIT: bind() functions can be marked __init, which | ||
| 272 | * makes trouble for section mismatch analysis. See if | ||
| 273 | * we can't restructure things to avoid mismatching... | ||
| 274 | */ | ||
| 275 | |||
| 276 | int (*bind)(struct usb_composite_dev *); | ||
| 277 | int (*unbind)(struct usb_composite_dev *); | 276 | int (*unbind)(struct usb_composite_dev *); |
| 278 | 277 | ||
| 278 | void (*disconnect)(struct usb_composite_dev *); | ||
| 279 | |||
| 279 | /* global suspend hooks */ | 280 | /* global suspend hooks */ |
| 280 | void (*suspend)(struct usb_composite_dev *); | 281 | void (*suspend)(struct usb_composite_dev *); |
| 281 | void (*resume)(struct usb_composite_dev *); | 282 | void (*resume)(struct usb_composite_dev *); |
| 282 | }; | 283 | }; |
| 283 | 284 | ||
| 284 | extern int usb_composite_register(struct usb_composite_driver *); | 285 | extern int usb_composite_probe(struct usb_composite_driver *driver, |
| 285 | extern void usb_composite_unregister(struct usb_composite_driver *); | 286 | int (*bind)(struct usb_composite_dev *cdev)); |
| 287 | extern void usb_composite_unregister(struct usb_composite_driver *driver); | ||
| 286 | 288 | ||
| 287 | 289 | ||
| 288 | /** | 290 | /** |
| @@ -331,6 +333,9 @@ struct usb_composite_dev { | |||
| 331 | struct list_head configs; | 333 | struct list_head configs; |
| 332 | struct usb_composite_driver *driver; | 334 | struct usb_composite_driver *driver; |
| 333 | u8 next_string_id; | 335 | u8 next_string_id; |
| 336 | u8 manufacturer_override; | ||
| 337 | u8 product_override; | ||
| 338 | u8 serial_override; | ||
| 334 | 339 | ||
| 335 | /* the gadget driver won't enable the data pullup | 340 | /* the gadget driver won't enable the data pullup |
| 336 | * while the deactivation count is nonzero. | 341 | * while the deactivation count is nonzero. |
| @@ -342,6 +347,10 @@ struct usb_composite_dev { | |||
| 342 | }; | 347 | }; |
| 343 | 348 | ||
| 344 | extern int usb_string_id(struct usb_composite_dev *c); | 349 | extern int usb_string_id(struct usb_composite_dev *c); |
| 350 | extern int usb_string_ids_tab(struct usb_composite_dev *c, | ||
| 351 | struct usb_string *str); | ||
| 352 | extern int usb_string_ids_n(struct usb_composite_dev *c, unsigned n); | ||
| 353 | |||
| 345 | 354 | ||
| 346 | /* messaging utils */ | 355 | /* messaging utils */ |
| 347 | #define DBG(d, fmt, args...) \ | 356 | #define DBG(d, fmt, args...) \ |
diff --git a/include/linux/usb/ehci_def.h b/include/linux/usb/ehci_def.h index 80287af2a738..2e262cb15425 100644 --- a/include/linux/usb/ehci_def.h +++ b/include/linux/usb/ehci_def.h | |||
| @@ -39,6 +39,12 @@ struct ehci_caps { | |||
| 39 | #define HCS_N_PORTS(p) (((p)>>0)&0xf) /* bits 3:0, ports on HC */ | 39 | #define HCS_N_PORTS(p) (((p)>>0)&0xf) /* bits 3:0, ports on HC */ |
| 40 | 40 | ||
| 41 | u32 hcc_params; /* HCCPARAMS - offset 0x8 */ | 41 | u32 hcc_params; /* HCCPARAMS - offset 0x8 */ |
| 42 | /* EHCI 1.1 addendum */ | ||
| 43 | #define HCC_32FRAME_PERIODIC_LIST(p) ((p)&(1 << 19)) | ||
| 44 | #define HCC_PER_PORT_CHANGE_EVENT(p) ((p)&(1 << 18)) | ||
| 45 | #define HCC_LPM(p) ((p)&(1 << 17)) | ||
| 46 | #define HCC_HW_PREFETCH(p) ((p)&(1 << 16)) | ||
| 47 | |||
| 42 | #define HCC_EXT_CAPS(p) (((p)>>8)&0xff) /* for pci extended caps */ | 48 | #define HCC_EXT_CAPS(p) (((p)>>8)&0xff) /* for pci extended caps */ |
| 43 | #define HCC_ISOC_CACHE(p) ((p)&(1 << 7)) /* true: can cache isoc frame */ | 49 | #define HCC_ISOC_CACHE(p) ((p)&(1 << 7)) /* true: can cache isoc frame */ |
| 44 | #define HCC_ISOC_THRES(p) (((p)>>4)&0x7) /* bits 6:4, uframes cached */ | 50 | #define HCC_ISOC_THRES(p) (((p)>>4)&0x7) /* bits 6:4, uframes cached */ |
| @@ -54,6 +60,13 @@ struct ehci_regs { | |||
| 54 | 60 | ||
| 55 | /* USBCMD: offset 0x00 */ | 61 | /* USBCMD: offset 0x00 */ |
| 56 | u32 command; | 62 | u32 command; |
| 63 | |||
| 64 | /* EHCI 1.1 addendum */ | ||
| 65 | #define CMD_HIRD (0xf<<24) /* host initiated resume duration */ | ||
| 66 | #define CMD_PPCEE (1<<15) /* per port change event enable */ | ||
| 67 | #define CMD_FSP (1<<14) /* fully synchronized prefetch */ | ||
| 68 | #define CMD_ASPE (1<<13) /* async schedule prefetch enable */ | ||
| 69 | #define CMD_PSPE (1<<12) /* periodic schedule prefetch enable */ | ||
| 57 | /* 23:16 is r/w intr rate, in microframes; default "8" == 1/msec */ | 70 | /* 23:16 is r/w intr rate, in microframes; default "8" == 1/msec */ |
| 58 | #define CMD_PARK (1<<11) /* enable "park" on async qh */ | 71 | #define CMD_PARK (1<<11) /* enable "park" on async qh */ |
| 59 | #define CMD_PARK_CNT(c) (((c)>>8)&3) /* how many transfers to park for */ | 72 | #define CMD_PARK_CNT(c) (((c)>>8)&3) /* how many transfers to park for */ |
| @@ -67,6 +80,7 @@ struct ehci_regs { | |||
| 67 | 80 | ||
| 68 | /* USBSTS: offset 0x04 */ | 81 | /* USBSTS: offset 0x04 */ |
| 69 | u32 status; | 82 | u32 status; |
| 83 | #define STS_PPCE_MASK (0xff<<16) /* Per-Port change event 1-16 */ | ||
| 70 | #define STS_ASS (1<<15) /* Async Schedule Status */ | 84 | #define STS_ASS (1<<15) /* Async Schedule Status */ |
| 71 | #define STS_PSS (1<<14) /* Periodic Schedule Status */ | 85 | #define STS_PSS (1<<14) /* Periodic Schedule Status */ |
| 72 | #define STS_RECL (1<<13) /* Reclamation */ | 86 | #define STS_RECL (1<<13) /* Reclamation */ |
| @@ -100,6 +114,14 @@ struct ehci_regs { | |||
| 100 | 114 | ||
| 101 | /* PORTSC: offset 0x44 */ | 115 | /* PORTSC: offset 0x44 */ |
| 102 | u32 port_status[0]; /* up to N_PORTS */ | 116 | u32 port_status[0]; /* up to N_PORTS */ |
| 117 | /* EHCI 1.1 addendum */ | ||
| 118 | #define PORTSC_SUSPEND_STS_ACK 0 | ||
| 119 | #define PORTSC_SUSPEND_STS_NYET 1 | ||
| 120 | #define PORTSC_SUSPEND_STS_STALL 2 | ||
| 121 | #define PORTSC_SUSPEND_STS_ERR 3 | ||
| 122 | |||
| 123 | #define PORT_DEV_ADDR (0x7f<<25) /* device address */ | ||
| 124 | #define PORT_SSTS (0x3<<23) /* suspend status */ | ||
| 103 | /* 31:23 reserved */ | 125 | /* 31:23 reserved */ |
| 104 | #define PORT_WKOC_E (1<<22) /* wake on overcurrent (enable) */ | 126 | #define PORT_WKOC_E (1<<22) /* wake on overcurrent (enable) */ |
| 105 | #define PORT_WKDISC_E (1<<21) /* wake on disconnect (enable) */ | 127 | #define PORT_WKDISC_E (1<<21) /* wake on disconnect (enable) */ |
| @@ -115,6 +137,7 @@ struct ehci_regs { | |||
| 115 | #define PORT_USB11(x) (((x)&(3<<10)) == (1<<10)) /* USB 1.1 device */ | 137 | #define PORT_USB11(x) (((x)&(3<<10)) == (1<<10)) /* USB 1.1 device */ |
| 116 | /* 11:10 for detecting lowspeed devices (reset vs release ownership) */ | 138 | /* 11:10 for detecting lowspeed devices (reset vs release ownership) */ |
| 117 | /* 9 reserved */ | 139 | /* 9 reserved */ |
| 140 | #define PORT_LPM (1<<9) /* LPM transaction */ | ||
| 118 | #define PORT_RESET (1<<8) /* reset port */ | 141 | #define PORT_RESET (1<<8) /* reset port */ |
| 119 | #define PORT_SUSPEND (1<<7) /* suspend port */ | 142 | #define PORT_SUSPEND (1<<7) /* suspend port */ |
| 120 | #define PORT_RESUME (1<<6) /* resume it */ | 143 | #define PORT_RESUME (1<<6) /* resume it */ |
diff --git a/include/linux/usb/functionfs.h b/include/linux/usb/functionfs.h index a34a2a043b21..6f649c13193b 100644 --- a/include/linux/usb/functionfs.h +++ b/include/linux/usb/functionfs.h | |||
| @@ -180,9 +180,9 @@ static int functionfs_bind(struct ffs_data *ffs, struct usb_composite_dev *cdev) | |||
| 180 | static void functionfs_unbind(struct ffs_data *ffs) | 180 | static void functionfs_unbind(struct ffs_data *ffs) |
| 181 | __attribute__((nonnull)); | 181 | __attribute__((nonnull)); |
| 182 | 182 | ||
| 183 | static int functionfs_add(struct usb_composite_dev *cdev, | 183 | static int functionfs_bind_config(struct usb_composite_dev *cdev, |
| 184 | struct usb_configuration *c, | 184 | struct usb_configuration *c, |
| 185 | struct ffs_data *ffs) | 185 | struct ffs_data *ffs) |
| 186 | __attribute__((warn_unused_result, nonnull)); | 186 | __attribute__((warn_unused_result, nonnull)); |
| 187 | 187 | ||
| 188 | 188 | ||
diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h index d3ef42d7d2f0..006412ce2303 100644 --- a/include/linux/usb/gadget.h +++ b/include/linux/usb/gadget.h | |||
| @@ -705,11 +705,6 @@ static inline int usb_gadget_disconnect(struct usb_gadget *gadget) | |||
| 705 | * struct usb_gadget_driver - driver for usb 'slave' devices | 705 | * struct usb_gadget_driver - driver for usb 'slave' devices |
| 706 | * @function: String describing the gadget's function | 706 | * @function: String describing the gadget's function |
| 707 | * @speed: Highest speed the driver handles. | 707 | * @speed: Highest speed the driver handles. |
| 708 | * @bind: Invoked when the driver is bound to a gadget, usually | ||
| 709 | * after registering the driver. | ||
| 710 | * At that point, ep0 is fully initialized, and ep_list holds | ||
| 711 | * the currently-available endpoints. | ||
| 712 | * Called in a context that permits sleeping. | ||
| 713 | * @setup: Invoked for ep0 control requests that aren't handled by | 708 | * @setup: Invoked for ep0 control requests that aren't handled by |
| 714 | * the hardware level driver. Most calls must be handled by | 709 | * the hardware level driver. Most calls must be handled by |
| 715 | * the gadget driver, including descriptor and configuration | 710 | * the gadget driver, including descriptor and configuration |
| @@ -774,7 +769,6 @@ static inline int usb_gadget_disconnect(struct usb_gadget *gadget) | |||
| 774 | struct usb_gadget_driver { | 769 | struct usb_gadget_driver { |
| 775 | char *function; | 770 | char *function; |
| 776 | enum usb_device_speed speed; | 771 | enum usb_device_speed speed; |
| 777 | int (*bind)(struct usb_gadget *); | ||
| 778 | void (*unbind)(struct usb_gadget *); | 772 | void (*unbind)(struct usb_gadget *); |
| 779 | int (*setup)(struct usb_gadget *, | 773 | int (*setup)(struct usb_gadget *, |
| 780 | const struct usb_ctrlrequest *); | 774 | const struct usb_ctrlrequest *); |
| @@ -798,17 +792,19 @@ struct usb_gadget_driver { | |||
| 798 | */ | 792 | */ |
| 799 | 793 | ||
| 800 | /** | 794 | /** |
| 801 | * usb_gadget_register_driver - register a gadget driver | 795 | * usb_gadget_probe_driver - probe a gadget driver |
| 802 | * @driver:the driver being registered | 796 | * @driver: the driver being registered |
| 797 | * @bind: the driver's bind callback | ||
| 803 | * Context: can sleep | 798 | * Context: can sleep |
| 804 | * | 799 | * |
| 805 | * Call this in your gadget driver's module initialization function, | 800 | * Call this in your gadget driver's module initialization function, |
| 806 | * to tell the underlying usb controller driver about your driver. | 801 | * to tell the underlying usb controller driver about your driver. |
| 807 | * The driver's bind() function will be called to bind it to a | 802 | * The @bind() function will be called to bind it to a gadget before this |
| 808 | * gadget before this registration call returns. It's expected that | 803 | * registration call returns. It's expected that the @bind() function will |
| 809 | * the bind() functions will be in init sections. | 804 | * be in init sections. |
| 810 | */ | 805 | */ |
| 811 | int usb_gadget_register_driver(struct usb_gadget_driver *driver); | 806 | int usb_gadget_probe_driver(struct usb_gadget_driver *driver, |
| 807 | int (*bind)(struct usb_gadget *)); | ||
| 812 | 808 | ||
| 813 | /** | 809 | /** |
| 814 | * usb_gadget_unregister_driver - unregister a gadget driver | 810 | * usb_gadget_unregister_driver - unregister a gadget driver |
diff --git a/include/linux/usb/hcd.h b/include/linux/usb/hcd.h index 2e3a4ea1a3da..0b6e751ea0b1 100644 --- a/include/linux/usb/hcd.h +++ b/include/linux/usb/hcd.h | |||
| @@ -89,18 +89,33 @@ struct usb_hcd { | |||
| 89 | */ | 89 | */ |
| 90 | const struct hc_driver *driver; /* hw-specific hooks */ | 90 | const struct hc_driver *driver; /* hw-specific hooks */ |
| 91 | 91 | ||
| 92 | /* Flags that need to be manipulated atomically */ | 92 | /* Flags that need to be manipulated atomically because they can |
| 93 | * change while the host controller is running. Always use | ||
| 94 | * set_bit() or clear_bit() to change their values. | ||
| 95 | */ | ||
| 93 | unsigned long flags; | 96 | unsigned long flags; |
| 94 | #define HCD_FLAG_HW_ACCESSIBLE 0x00000001 | 97 | #define HCD_FLAG_HW_ACCESSIBLE 0 /* at full power */ |
| 95 | #define HCD_FLAG_SAW_IRQ 0x00000002 | 98 | #define HCD_FLAG_SAW_IRQ 1 |
| 99 | #define HCD_FLAG_POLL_RH 2 /* poll for rh status? */ | ||
| 100 | #define HCD_FLAG_POLL_PENDING 3 /* status has changed? */ | ||
| 101 | #define HCD_FLAG_WAKEUP_PENDING 4 /* root hub is resuming? */ | ||
| 102 | |||
| 103 | /* The flags can be tested using these macros; they are likely to | ||
| 104 | * be slightly faster than test_bit(). | ||
| 105 | */ | ||
| 106 | #define HCD_HW_ACCESSIBLE(hcd) ((hcd)->flags & (1U << HCD_FLAG_HW_ACCESSIBLE)) | ||
| 107 | #define HCD_SAW_IRQ(hcd) ((hcd)->flags & (1U << HCD_FLAG_SAW_IRQ)) | ||
| 108 | #define HCD_POLL_RH(hcd) ((hcd)->flags & (1U << HCD_FLAG_POLL_RH)) | ||
| 109 | #define HCD_POLL_PENDING(hcd) ((hcd)->flags & (1U << HCD_FLAG_POLL_PENDING)) | ||
| 110 | #define HCD_WAKEUP_PENDING(hcd) ((hcd)->flags & (1U << HCD_FLAG_WAKEUP_PENDING)) | ||
| 96 | 111 | ||
| 112 | /* Flags that get set only during HCD registration or removal. */ | ||
| 97 | unsigned rh_registered:1;/* is root hub registered? */ | 113 | unsigned rh_registered:1;/* is root hub registered? */ |
| 114 | unsigned rh_pollable:1; /* may we poll the root hub? */ | ||
| 98 | 115 | ||
| 99 | /* The next flag is a stopgap, to be removed when all the HCDs | 116 | /* The next flag is a stopgap, to be removed when all the HCDs |
| 100 | * support the new root-hub polling mechanism. */ | 117 | * support the new root-hub polling mechanism. */ |
| 101 | unsigned uses_new_polling:1; | 118 | unsigned uses_new_polling:1; |
| 102 | unsigned poll_rh:1; /* poll for rh status? */ | ||
| 103 | unsigned poll_pending:1; /* status has changed? */ | ||
| 104 | unsigned wireless:1; /* Wireless USB HCD */ | 119 | unsigned wireless:1; /* Wireless USB HCD */ |
| 105 | unsigned authorized_default:1; | 120 | unsigned authorized_default:1; |
| 106 | unsigned has_tt:1; /* Integrated TT in root hub */ | 121 | unsigned has_tt:1; /* Integrated TT in root hub */ |
| @@ -198,7 +213,7 @@ struct hc_driver { | |||
| 198 | * a whole, not just the root hub; they're for PCI bus glue. | 213 | * a whole, not just the root hub; they're for PCI bus glue. |
| 199 | */ | 214 | */ |
| 200 | /* called after suspending the hub, before entering D3 etc */ | 215 | /* called after suspending the hub, before entering D3 etc */ |
| 201 | int (*pci_suspend)(struct usb_hcd *hcd); | 216 | int (*pci_suspend)(struct usb_hcd *hcd, bool do_wakeup); |
| 202 | 217 | ||
| 203 | /* called after entering D0 (etc), before resuming the hub */ | 218 | /* called after entering D0 (etc), before resuming the hub */ |
| 204 | int (*pci_resume)(struct usb_hcd *hcd, bool hibernated); | 219 | int (*pci_resume)(struct usb_hcd *hcd, bool hibernated); |
| @@ -299,6 +314,10 @@ struct hc_driver { | |||
| 299 | int (*update_hub_device)(struct usb_hcd *, struct usb_device *hdev, | 314 | int (*update_hub_device)(struct usb_hcd *, struct usb_device *hdev, |
| 300 | struct usb_tt *tt, gfp_t mem_flags); | 315 | struct usb_tt *tt, gfp_t mem_flags); |
| 301 | int (*reset_device)(struct usb_hcd *, struct usb_device *); | 316 | int (*reset_device)(struct usb_hcd *, struct usb_device *); |
| 317 | /* Notifies the HCD after a device is connected and its | ||
| 318 | * address is set | ||
| 319 | */ | ||
| 320 | int (*update_device)(struct usb_hcd *, struct usb_device *); | ||
| 302 | }; | 321 | }; |
| 303 | 322 | ||
| 304 | extern int usb_hcd_link_urb_to_ep(struct usb_hcd *hcd, struct urb *urb); | 323 | extern int usb_hcd_link_urb_to_ep(struct usb_hcd *hcd, struct urb *urb); |
| @@ -310,6 +329,8 @@ extern int usb_hcd_submit_urb(struct urb *urb, gfp_t mem_flags); | |||
| 310 | extern int usb_hcd_unlink_urb(struct urb *urb, int status); | 329 | extern int usb_hcd_unlink_urb(struct urb *urb, int status); |
| 311 | extern void usb_hcd_giveback_urb(struct usb_hcd *hcd, struct urb *urb, | 330 | extern void usb_hcd_giveback_urb(struct usb_hcd *hcd, struct urb *urb, |
| 312 | int status); | 331 | int status); |
| 332 | extern void unmap_urb_setup_for_dma(struct usb_hcd *, struct urb *); | ||
| 333 | extern void unmap_urb_for_dma(struct usb_hcd *, struct urb *); | ||
| 313 | extern void usb_hcd_flush_endpoint(struct usb_device *udev, | 334 | extern void usb_hcd_flush_endpoint(struct usb_device *udev, |
| 314 | struct usb_host_endpoint *ep); | 335 | struct usb_host_endpoint *ep); |
| 315 | extern void usb_hcd_disable_endpoint(struct usb_device *udev, | 336 | extern void usb_hcd_disable_endpoint(struct usb_device *udev, |
diff --git a/include/linux/usb/intel_mid_otg.h b/include/linux/usb/intel_mid_otg.h new file mode 100644 index 000000000000..a0ccf795f362 --- /dev/null +++ b/include/linux/usb/intel_mid_otg.h | |||
| @@ -0,0 +1,180 @@ | |||
| 1 | /* | ||
| 2 | * Intel MID (Langwell/Penwell) USB OTG Transceiver driver | ||
| 3 | * Copyright (C) 2008 - 2010, Intel Corporation. | ||
| 4 | * | ||
| 5 | * This program is free software; you can redistribute it and/or modify it | ||
| 6 | * under the terms and conditions of the GNU General Public License, | ||
| 7 | * version 2, as published by the Free Software Foundation. | ||
| 8 | * | ||
| 9 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
| 10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
| 11 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
| 12 | * more details. | ||
| 13 | * | ||
| 14 | * You should have received a copy of the GNU General Public License along with | ||
| 15 | * this program; if not, write to the Free Software Foundation, Inc., | ||
| 16 | * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. | ||
| 17 | * | ||
| 18 | */ | ||
| 19 | |||
| 20 | #ifndef __INTEL_MID_OTG_H | ||
| 21 | #define __INTEL_MID_OTG_H | ||
| 22 | |||
| 23 | #include <linux/pm.h> | ||
| 24 | #include <linux/usb/otg.h> | ||
| 25 | #include <linux/notifier.h> | ||
| 26 | |||
| 27 | struct intel_mid_otg_xceiv; | ||
| 28 | |||
| 29 | /* This is a common data structure for Intel MID platform to | ||
| 30 | * save values of the OTG state machine */ | ||
| 31 | struct otg_hsm { | ||
| 32 | /* Input */ | ||
| 33 | int a_bus_resume; | ||
| 34 | int a_bus_suspend; | ||
| 35 | int a_conn; | ||
| 36 | int a_sess_vld; | ||
| 37 | int a_srp_det; | ||
| 38 | int a_vbus_vld; | ||
| 39 | int b_bus_resume; | ||
| 40 | int b_bus_suspend; | ||
| 41 | int b_conn; | ||
| 42 | int b_se0_srp; | ||
| 43 | int b_ssend_srp; | ||
| 44 | int b_sess_end; | ||
| 45 | int b_sess_vld; | ||
| 46 | int id; | ||
| 47 | /* id values */ | ||
| 48 | #define ID_B 0x05 | ||
| 49 | #define ID_A 0x04 | ||
| 50 | #define ID_ACA_C 0x03 | ||
| 51 | #define ID_ACA_B 0x02 | ||
| 52 | #define ID_ACA_A 0x01 | ||
| 53 | int power_up; | ||
| 54 | int adp_change; | ||
| 55 | int test_device; | ||
| 56 | |||
| 57 | /* Internal variables */ | ||
| 58 | int a_set_b_hnp_en; | ||
| 59 | int b_srp_done; | ||
| 60 | int b_hnp_enable; | ||
| 61 | int hnp_poll_enable; | ||
| 62 | |||
| 63 | /* Timeout indicator for timers */ | ||
| 64 | int a_wait_vrise_tmout; | ||
| 65 | int a_wait_bcon_tmout; | ||
| 66 | int a_aidl_bdis_tmout; | ||
| 67 | int a_bidl_adis_tmout; | ||
| 68 | int a_bidl_adis_tmr; | ||
| 69 | int a_wait_vfall_tmout; | ||
| 70 | int b_ase0_brst_tmout; | ||
| 71 | int b_bus_suspend_tmout; | ||
| 72 | int b_srp_init_tmout; | ||
| 73 | int b_srp_fail_tmout; | ||
| 74 | int b_srp_fail_tmr; | ||
| 75 | int b_adp_sense_tmout; | ||
| 76 | |||
| 77 | /* Informative variables */ | ||
| 78 | int a_bus_drop; | ||
| 79 | int a_bus_req; | ||
| 80 | int a_clr_err; | ||
| 81 | int b_bus_req; | ||
| 82 | int a_suspend_req; | ||
| 83 | int b_bus_suspend_vld; | ||
| 84 | |||
| 85 | /* Output */ | ||
| 86 | int drv_vbus; | ||
| 87 | int loc_conn; | ||
| 88 | int loc_sof; | ||
| 89 | |||
| 90 | /* Others */ | ||
| 91 | int vbus_srp_up; | ||
| 92 | }; | ||
| 93 | |||
| 94 | /* must provide ULPI access function to read/write registers implemented in | ||
| 95 | * ULPI address space */ | ||
| 96 | struct iotg_ulpi_access_ops { | ||
| 97 | int (*read)(struct intel_mid_otg_xceiv *iotg, u8 reg, u8 *val); | ||
| 98 | int (*write)(struct intel_mid_otg_xceiv *iotg, u8 reg, u8 val); | ||
| 99 | }; | ||
| 100 | |||
| 101 | #define OTG_A_DEVICE 0x0 | ||
| 102 | #define OTG_B_DEVICE 0x1 | ||
| 103 | |||
| 104 | /* | ||
| 105 | * the Intel MID (Langwell/Penwell) otg transceiver driver needs to interact | ||
| 106 | * with device and host drivers to implement the USB OTG related feature. More | ||
| 107 | * function members are added based on otg_transceiver data structure for this | ||
| 108 | * purpose. | ||
| 109 | */ | ||
| 110 | struct intel_mid_otg_xceiv { | ||
| 111 | struct otg_transceiver otg; | ||
| 112 | struct otg_hsm hsm; | ||
| 113 | |||
| 114 | /* base address */ | ||
| 115 | void __iomem *base; | ||
| 116 | |||
| 117 | /* ops to access ulpi */ | ||
| 118 | struct iotg_ulpi_access_ops ulpi_ops; | ||
| 119 | |||
| 120 | /* atomic notifier for interrupt context */ | ||
| 121 | struct atomic_notifier_head iotg_notifier; | ||
| 122 | |||
| 123 | /* start/stop USB Host function */ | ||
| 124 | int (*start_host)(struct intel_mid_otg_xceiv *iotg); | ||
| 125 | int (*stop_host)(struct intel_mid_otg_xceiv *iotg); | ||
| 126 | |||
| 127 | /* start/stop USB Peripheral function */ | ||
| 128 | int (*start_peripheral)(struct intel_mid_otg_xceiv *iotg); | ||
| 129 | int (*stop_peripheral)(struct intel_mid_otg_xceiv *iotg); | ||
| 130 | |||
| 131 | /* start/stop ADP sense/probe function */ | ||
| 132 | int (*set_adp_probe)(struct intel_mid_otg_xceiv *iotg, | ||
| 133 | bool enabled, int dev); | ||
| 134 | int (*set_adp_sense)(struct intel_mid_otg_xceiv *iotg, | ||
| 135 | bool enabled); | ||
| 136 | |||
| 137 | #ifdef CONFIG_PM | ||
| 138 | /* suspend/resume USB host function */ | ||
| 139 | int (*suspend_host)(struct intel_mid_otg_xceiv *iotg, | ||
| 140 | pm_message_t message); | ||
| 141 | int (*resume_host)(struct intel_mid_otg_xceiv *iotg); | ||
| 142 | |||
| 143 | int (*suspend_peripheral)(struct intel_mid_otg_xceiv *iotg, | ||
| 144 | pm_message_t message); | ||
| 145 | int (*resume_peripheral)(struct intel_mid_otg_xceiv *iotg); | ||
| 146 | #endif | ||
| 147 | |||
| 148 | }; | ||
| 149 | static inline | ||
| 150 | struct intel_mid_otg_xceiv *otg_to_mid_xceiv(struct otg_transceiver *otg) | ||
| 151 | { | ||
| 152 | return container_of(otg, struct intel_mid_otg_xceiv, otg); | ||
| 153 | } | ||
| 154 | |||
| 155 | #define MID_OTG_NOTIFY_CONNECT 0x0001 | ||
| 156 | #define MID_OTG_NOTIFY_DISCONN 0x0002 | ||
| 157 | #define MID_OTG_NOTIFY_HSUSPEND 0x0003 | ||
| 158 | #define MID_OTG_NOTIFY_HRESUME 0x0004 | ||
| 159 | #define MID_OTG_NOTIFY_CSUSPEND 0x0005 | ||
| 160 | #define MID_OTG_NOTIFY_CRESUME 0x0006 | ||
| 161 | #define MID_OTG_NOTIFY_HOSTADD 0x0007 | ||
| 162 | #define MID_OTG_NOTIFY_HOSTREMOVE 0x0008 | ||
| 163 | #define MID_OTG_NOTIFY_CLIENTADD 0x0009 | ||
| 164 | #define MID_OTG_NOTIFY_CLIENTREMOVE 0x000a | ||
| 165 | |||
| 166 | static inline int | ||
| 167 | intel_mid_otg_register_notifier(struct intel_mid_otg_xceiv *iotg, | ||
| 168 | struct notifier_block *nb) | ||
| 169 | { | ||
| 170 | return atomic_notifier_chain_register(&iotg->iotg_notifier, nb); | ||
| 171 | } | ||
| 172 | |||
| 173 | static inline void | ||
| 174 | intel_mid_otg_unregister_notifier(struct intel_mid_otg_xceiv *iotg, | ||
| 175 | struct notifier_block *nb) | ||
| 176 | { | ||
| 177 | atomic_notifier_chain_unregister(&iotg->iotg_notifier, nb); | ||
| 178 | } | ||
| 179 | |||
| 180 | #endif /* __INTEL_MID_OTG_H */ | ||
diff --git a/include/linux/usb/langwell_otg.h b/include/linux/usb/langwell_otg.h new file mode 100644 index 000000000000..51f17b16d312 --- /dev/null +++ b/include/linux/usb/langwell_otg.h | |||
| @@ -0,0 +1,139 @@ | |||
| 1 | /* | ||
| 2 | * Intel Langwell USB OTG transceiver driver | ||
| 3 | * Copyright (C) 2008 - 2010, Intel Corporation. | ||
| 4 | * | ||
| 5 | * This program is free software; you can redistribute it and/or modify it | ||
| 6 | * under the terms and conditions of the GNU General Public License, | ||
| 7 | * version 2, as published by the Free Software Foundation. | ||
| 8 | * | ||
| 9 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
| 10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
| 11 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
| 12 | * more details. | ||
| 13 | * | ||
| 14 | * You should have received a copy of the GNU General Public License along with | ||
| 15 | * this program; if not, write to the Free Software Foundation, Inc., | ||
| 16 | * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. | ||
| 17 | * | ||
| 18 | */ | ||
| 19 | |||
| 20 | #ifndef __LANGWELL_OTG_H | ||
| 21 | #define __LANGWELL_OTG_H | ||
| 22 | |||
| 23 | #include <linux/usb/intel_mid_otg.h> | ||
| 24 | |||
| 25 | #define CI_USBCMD 0x30 | ||
| 26 | # define USBCMD_RST BIT(1) | ||
| 27 | # define USBCMD_RS BIT(0) | ||
| 28 | #define CI_USBSTS 0x34 | ||
| 29 | # define USBSTS_SLI BIT(8) | ||
| 30 | # define USBSTS_URI BIT(6) | ||
| 31 | # define USBSTS_PCI BIT(2) | ||
| 32 | #define CI_PORTSC1 0x74 | ||
| 33 | # define PORTSC_PP BIT(12) | ||
| 34 | # define PORTSC_LS (BIT(11) | BIT(10)) | ||
| 35 | # define PORTSC_SUSP BIT(7) | ||
| 36 | # define PORTSC_CCS BIT(0) | ||
| 37 | #define CI_HOSTPC1 0xb4 | ||
| 38 | # define HOSTPC1_PHCD BIT(22) | ||
| 39 | #define CI_OTGSC 0xf4 | ||
| 40 | # define OTGSC_DPIE BIT(30) | ||
| 41 | # define OTGSC_1MSE BIT(29) | ||
| 42 | # define OTGSC_BSEIE BIT(28) | ||
| 43 | # define OTGSC_BSVIE BIT(27) | ||
| 44 | # define OTGSC_ASVIE BIT(26) | ||
| 45 | # define OTGSC_AVVIE BIT(25) | ||
| 46 | # define OTGSC_IDIE BIT(24) | ||
| 47 | # define OTGSC_DPIS BIT(22) | ||
| 48 | # define OTGSC_1MSS BIT(21) | ||
| 49 | # define OTGSC_BSEIS BIT(20) | ||
| 50 | # define OTGSC_BSVIS BIT(19) | ||
| 51 | # define OTGSC_ASVIS BIT(18) | ||
| 52 | # define OTGSC_AVVIS BIT(17) | ||
| 53 | # define OTGSC_IDIS BIT(16) | ||
| 54 | # define OTGSC_DPS BIT(14) | ||
| 55 | # define OTGSC_1MST BIT(13) | ||
| 56 | # define OTGSC_BSE BIT(12) | ||
| 57 | # define OTGSC_BSV BIT(11) | ||
| 58 | # define OTGSC_ASV BIT(10) | ||
| 59 | # define OTGSC_AVV BIT(9) | ||
| 60 | # define OTGSC_ID BIT(8) | ||
| 61 | # define OTGSC_HABA BIT(7) | ||
| 62 | # define OTGSC_HADP BIT(6) | ||
| 63 | # define OTGSC_IDPU BIT(5) | ||
| 64 | # define OTGSC_DP BIT(4) | ||
| 65 | # define OTGSC_OT BIT(3) | ||
| 66 | # define OTGSC_HAAR BIT(2) | ||
| 67 | # define OTGSC_VC BIT(1) | ||
| 68 | # define OTGSC_VD BIT(0) | ||
| 69 | # define OTGSC_INTEN_MASK (0x7f << 24) | ||
| 70 | # define OTGSC_INT_MASK (0x5f << 24) | ||
| 71 | # define OTGSC_INTSTS_MASK (0x7f << 16) | ||
| 72 | #define CI_USBMODE 0xf8 | ||
| 73 | # define USBMODE_CM (BIT(1) | BIT(0)) | ||
| 74 | # define USBMODE_IDLE 0 | ||
| 75 | # define USBMODE_DEVICE 0x2 | ||
| 76 | # define USBMODE_HOST 0x3 | ||
| 77 | #define USBCFG_ADDR 0xff10801c | ||
| 78 | #define USBCFG_LEN 4 | ||
| 79 | # define USBCFG_VBUSVAL BIT(14) | ||
| 80 | # define USBCFG_AVALID BIT(13) | ||
| 81 | # define USBCFG_BVALID BIT(12) | ||
| 82 | # define USBCFG_SESEND BIT(11) | ||
| 83 | |||
| 84 | #define INTR_DUMMY_MASK (USBSTS_SLI | USBSTS_URI | USBSTS_PCI) | ||
| 85 | |||
| 86 | enum langwell_otg_timer_type { | ||
| 87 | TA_WAIT_VRISE_TMR, | ||
| 88 | TA_WAIT_BCON_TMR, | ||
| 89 | TA_AIDL_BDIS_TMR, | ||
| 90 | TB_ASE0_BRST_TMR, | ||
| 91 | TB_SE0_SRP_TMR, | ||
| 92 | TB_SRP_INIT_TMR, | ||
| 93 | TB_SRP_FAIL_TMR, | ||
| 94 | TB_BUS_SUSPEND_TMR | ||
| 95 | }; | ||
| 96 | |||
| 97 | #define TA_WAIT_VRISE 100 | ||
| 98 | #define TA_WAIT_BCON 30000 | ||
| 99 | #define TA_AIDL_BDIS 15000 | ||
| 100 | #define TB_ASE0_BRST 5000 | ||
| 101 | #define TB_SE0_SRP 2 | ||
| 102 | #define TB_SRP_INIT 100 | ||
| 103 | #define TB_SRP_FAIL 5500 | ||
| 104 | #define TB_BUS_SUSPEND 500 | ||
| 105 | |||
| 106 | struct langwell_otg_timer { | ||
| 107 | unsigned long expires; /* Number of count increase to timeout */ | ||
| 108 | unsigned long count; /* Tick counter */ | ||
| 109 | void (*function)(unsigned long); /* Timeout function */ | ||
| 110 | unsigned long data; /* Data passed to function */ | ||
| 111 | struct list_head list; | ||
| 112 | }; | ||
| 113 | |||
| 114 | struct langwell_otg { | ||
| 115 | struct intel_mid_otg_xceiv iotg; | ||
| 116 | struct device *dev; | ||
| 117 | |||
| 118 | void __iomem *usbcfg; /* SCCBUSB config Reg */ | ||
| 119 | |||
| 120 | unsigned region; | ||
| 121 | unsigned cfg_region; | ||
| 122 | |||
| 123 | struct work_struct work; | ||
| 124 | struct workqueue_struct *qwork; | ||
| 125 | struct timer_list hsm_timer; | ||
| 126 | |||
| 127 | spinlock_t lock; | ||
| 128 | spinlock_t wq_lock; | ||
| 129 | |||
| 130 | struct notifier_block iotg_notifier; | ||
| 131 | }; | ||
| 132 | |||
| 133 | static inline | ||
| 134 | struct langwell_otg *mid_xceiv_to_lnw(struct intel_mid_otg_xceiv *iotg) | ||
| 135 | { | ||
| 136 | return container_of(iotg, struct langwell_otg, iotg); | ||
| 137 | } | ||
| 138 | |||
| 139 | #endif /* __LANGWELL_OTG_H__ */ | ||
diff --git a/include/linux/usb/ncm.h b/include/linux/usb/ncm.h deleted file mode 100644 index 006d1064c8b2..000000000000 --- a/include/linux/usb/ncm.h +++ /dev/null | |||
| @@ -1,114 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * USB CDC NCM auxiliary definitions | ||
| 3 | */ | ||
| 4 | |||
| 5 | #ifndef __LINUX_USB_NCM_H | ||
| 6 | #define __LINUX_USB_NCM_H | ||
| 7 | |||
| 8 | #include <linux/types.h> | ||
| 9 | #include <linux/usb/cdc.h> | ||
| 10 | #include <asm/unaligned.h> | ||
| 11 | |||
| 12 | #define NCM_NTB_MIN_IN_SIZE 2048 | ||
| 13 | #define NCM_NTB_MIN_OUT_SIZE 2048 | ||
| 14 | |||
| 15 | #define NCM_CONTROL_TIMEOUT (5 * 1000) | ||
| 16 | |||
| 17 | /* bmNetworkCapabilities */ | ||
| 18 | |||
| 19 | #define NCM_NCAP_ETH_FILTER (1 << 0) | ||
| 20 | #define NCM_NCAP_NET_ADDRESS (1 << 1) | ||
| 21 | #define NCM_NCAP_ENCAP_COMM (1 << 2) | ||
| 22 | #define NCM_NCAP_MAX_DGRAM (1 << 3) | ||
| 23 | #define NCM_NCAP_CRC_MODE (1 << 4) | ||
| 24 | |||
| 25 | /* | ||
| 26 | * Here are options for NCM Datagram Pointer table (NDP) parser. | ||
| 27 | * There are 2 different formats: NDP16 and NDP32 in the spec (ch. 3), | ||
| 28 | * in NDP16 offsets and sizes fields are 1 16bit word wide, | ||
| 29 | * in NDP32 -- 2 16bit words wide. Also signatures are different. | ||
| 30 | * To make the parser code the same, put the differences in the structure, | ||
| 31 | * and switch pointers to the structures when the format is changed. | ||
| 32 | */ | ||
| 33 | |||
| 34 | struct ndp_parser_opts { | ||
| 35 | u32 nth_sign; | ||
| 36 | u32 ndp_sign; | ||
| 37 | unsigned nth_size; | ||
| 38 | unsigned ndp_size; | ||
| 39 | unsigned ndplen_align; | ||
| 40 | /* sizes in u16 units */ | ||
| 41 | unsigned dgram_item_len; /* index or length */ | ||
| 42 | unsigned block_length; | ||
| 43 | unsigned fp_index; | ||
| 44 | unsigned reserved1; | ||
| 45 | unsigned reserved2; | ||
| 46 | unsigned next_fp_index; | ||
| 47 | }; | ||
| 48 | |||
| 49 | #define INIT_NDP16_OPTS { \ | ||
| 50 | .nth_sign = NCM_NTH16_SIGN, \ | ||
| 51 | .ndp_sign = NCM_NDP16_NOCRC_SIGN, \ | ||
| 52 | .nth_size = sizeof(struct usb_cdc_ncm_nth16), \ | ||
| 53 | .ndp_size = sizeof(struct usb_cdc_ncm_ndp16), \ | ||
| 54 | .ndplen_align = 4, \ | ||
| 55 | .dgram_item_len = 1, \ | ||
| 56 | .block_length = 1, \ | ||
| 57 | .fp_index = 1, \ | ||
| 58 | .reserved1 = 0, \ | ||
| 59 | .reserved2 = 0, \ | ||
| 60 | .next_fp_index = 1, \ | ||
| 61 | } | ||
| 62 | |||
| 63 | |||
| 64 | #define INIT_NDP32_OPTS { \ | ||
| 65 | .nth_sign = NCM_NTH32_SIGN, \ | ||
| 66 | .ndp_sign = NCM_NDP32_NOCRC_SIGN, \ | ||
| 67 | .nth_size = sizeof(struct usb_cdc_ncm_nth32), \ | ||
| 68 | .ndp_size = sizeof(struct usb_cdc_ncm_ndp32), \ | ||
| 69 | .ndplen_align = 8, \ | ||
| 70 | .dgram_item_len = 2, \ | ||
| 71 | .block_length = 2, \ | ||
| 72 | .fp_index = 2, \ | ||
| 73 | .reserved1 = 1, \ | ||
| 74 | .reserved2 = 2, \ | ||
| 75 | .next_fp_index = 2, \ | ||
| 76 | } | ||
| 77 | |||
| 78 | static inline void put_ncm(__le16 **p, unsigned size, unsigned val) | ||
| 79 | { | ||
| 80 | switch (size) { | ||
| 81 | case 1: | ||
| 82 | put_unaligned_le16((u16)val, *p); | ||
| 83 | break; | ||
| 84 | case 2: | ||
| 85 | put_unaligned_le32((u32)val, *p); | ||
| 86 | |||
| 87 | break; | ||
| 88 | default: | ||
| 89 | BUG(); | ||
| 90 | } | ||
| 91 | |||
| 92 | *p += size; | ||
| 93 | } | ||
| 94 | |||
| 95 | static inline unsigned get_ncm(__le16 **p, unsigned size) | ||
| 96 | { | ||
| 97 | unsigned tmp; | ||
| 98 | |||
| 99 | switch (size) { | ||
| 100 | case 1: | ||
| 101 | tmp = get_unaligned_le16(*p); | ||
| 102 | break; | ||
| 103 | case 2: | ||
| 104 | tmp = get_unaligned_le32(*p); | ||
| 105 | break; | ||
| 106 | default: | ||
| 107 | BUG(); | ||
| 108 | } | ||
| 109 | |||
| 110 | *p += size; | ||
| 111 | return tmp; | ||
| 112 | } | ||
| 113 | |||
| 114 | #endif /* __LINUX_USB_NCM_H */ | ||
diff --git a/include/linux/usb/otg.h b/include/linux/usb/otg.h index f8302d036a76..0a5b3711e502 100644 --- a/include/linux/usb/otg.h +++ b/include/linux/usb/otg.h | |||
| @@ -43,13 +43,6 @@ enum usb_xceiv_events { | |||
| 43 | USB_EVENT_ENUMERATED, /* gadget driver enumerated */ | 43 | USB_EVENT_ENUMERATED, /* gadget driver enumerated */ |
| 44 | }; | 44 | }; |
| 45 | 45 | ||
| 46 | #define USB_OTG_PULLUP_ID (1 << 0) | ||
| 47 | #define USB_OTG_PULLDOWN_DP (1 << 1) | ||
| 48 | #define USB_OTG_PULLDOWN_DM (1 << 2) | ||
| 49 | #define USB_OTG_EXT_VBUS_INDICATOR (1 << 3) | ||
| 50 | #define USB_OTG_DRV_VBUS (1 << 4) | ||
| 51 | #define USB_OTG_DRV_VBUS_EXT (1 << 5) | ||
| 52 | |||
| 53 | struct otg_transceiver; | 46 | struct otg_transceiver; |
| 54 | 47 | ||
| 55 | /* for transceivers connected thru an ULPI interface, the user must | 48 | /* for transceivers connected thru an ULPI interface, the user must |
| @@ -146,10 +139,10 @@ static inline int otg_io_read(struct otg_transceiver *otg, u32 reg) | |||
| 146 | return -EINVAL; | 139 | return -EINVAL; |
| 147 | } | 140 | } |
| 148 | 141 | ||
| 149 | static inline int otg_io_write(struct otg_transceiver *otg, u32 reg, u32 val) | 142 | static inline int otg_io_write(struct otg_transceiver *otg, u32 val, u32 reg) |
| 150 | { | 143 | { |
| 151 | if (otg->io_ops && otg->io_ops->write) | 144 | if (otg->io_ops && otg->io_ops->write) |
| 152 | return otg->io_ops->write(otg, reg, val); | 145 | return otg->io_ops->write(otg, val, reg); |
| 153 | 146 | ||
| 154 | return -EINVAL; | 147 | return -EINVAL; |
| 155 | } | 148 | } |
| @@ -171,8 +164,19 @@ otg_shutdown(struct otg_transceiver *otg) | |||
| 171 | } | 164 | } |
| 172 | 165 | ||
| 173 | /* for usb host and peripheral controller drivers */ | 166 | /* for usb host and peripheral controller drivers */ |
| 167 | #ifdef CONFIG_USB_OTG_UTILS | ||
| 174 | extern struct otg_transceiver *otg_get_transceiver(void); | 168 | extern struct otg_transceiver *otg_get_transceiver(void); |
| 175 | extern void otg_put_transceiver(struct otg_transceiver *); | 169 | extern void otg_put_transceiver(struct otg_transceiver *); |
| 170 | #else | ||
| 171 | static inline struct otg_transceiver *otg_get_transceiver(void) | ||
| 172 | { | ||
| 173 | return NULL; | ||
| 174 | } | ||
| 175 | |||
| 176 | static inline void otg_put_transceiver(struct otg_transceiver *x) | ||
| 177 | { | ||
| 178 | } | ||
| 179 | #endif | ||
| 176 | 180 | ||
| 177 | /* Context: can sleep */ | 181 | /* Context: can sleep */ |
| 178 | static inline int | 182 | static inline int |
diff --git a/include/linux/usb/quirks.h b/include/linux/usb/quirks.h index 16b7f3347545..3e93de7ecbc3 100644 --- a/include/linux/usb/quirks.h +++ b/include/linux/usb/quirks.h | |||
| @@ -26,4 +26,8 @@ | |||
| 26 | and can't handle talking to these interfaces */ | 26 | and can't handle talking to these interfaces */ |
| 27 | #define USB_QUIRK_HONOR_BNUMINTERFACES 0x00000020 | 27 | #define USB_QUIRK_HONOR_BNUMINTERFACES 0x00000020 |
| 28 | 28 | ||
| 29 | /* device needs a pause during initialization, after we read the device | ||
| 30 | descriptor */ | ||
| 31 | #define USB_QUIRK_DELAY_INIT 0x00000040 | ||
| 32 | |||
| 29 | #endif /* __LINUX_USB_QUIRKS_H */ | 33 | #endif /* __LINUX_USB_QUIRKS_H */ |
diff --git a/include/linux/usb/serial.h b/include/linux/usb/serial.h index 84a4c44c208b..16d682f4f7c3 100644 --- a/include/linux/usb/serial.h +++ b/include/linux/usb/serial.h | |||
| @@ -271,6 +271,8 @@ struct usb_serial_driver { | |||
| 271 | int (*tiocmget)(struct tty_struct *tty, struct file *file); | 271 | int (*tiocmget)(struct tty_struct *tty, struct file *file); |
| 272 | int (*tiocmset)(struct tty_struct *tty, struct file *file, | 272 | int (*tiocmset)(struct tty_struct *tty, struct file *file, |
| 273 | unsigned int set, unsigned int clear); | 273 | unsigned int set, unsigned int clear); |
| 274 | int (*get_icount)(struct tty_struct *tty, | ||
| 275 | struct serial_icounter_struct *icount); | ||
| 274 | /* Called by the tty layer for port level work. There may or may not | 276 | /* Called by the tty layer for port level work. There may or may not |
| 275 | be an attached tty at this point */ | 277 | be an attached tty at this point */ |
| 276 | void (*dtr_rts)(struct usb_serial_port *port, int on); | 278 | void (*dtr_rts)(struct usb_serial_port *port, int on); |
| @@ -342,8 +344,7 @@ extern int usb_serial_generic_submit_read_urb(struct usb_serial_port *port, | |||
| 342 | extern void usb_serial_generic_process_read_urb(struct urb *urb); | 344 | extern void usb_serial_generic_process_read_urb(struct urb *urb); |
| 343 | extern int usb_serial_generic_prepare_write_buffer(struct usb_serial_port *port, | 345 | extern int usb_serial_generic_prepare_write_buffer(struct usb_serial_port *port, |
| 344 | void *dest, size_t size); | 346 | void *dest, size_t size); |
| 345 | extern int usb_serial_handle_sysrq_char(struct tty_struct *tty, | 347 | extern int usb_serial_handle_sysrq_char(struct usb_serial_port *port, |
| 346 | struct usb_serial_port *port, | ||
| 347 | unsigned int ch); | 348 | unsigned int ch); |
| 348 | extern int usb_serial_handle_break(struct usb_serial_port *port); | 349 | extern int usb_serial_handle_break(struct usb_serial_port *port); |
| 349 | 350 | ||
diff --git a/include/linux/usb/storage.h b/include/linux/usb/storage.h new file mode 100644 index 000000000000..d7fc910f1dc4 --- /dev/null +++ b/include/linux/usb/storage.h | |||
| @@ -0,0 +1,48 @@ | |||
| 1 | #ifndef __LINUX_USB_STORAGE_H | ||
| 2 | #define __LINUX_USB_STORAGE_H | ||
| 3 | |||
| 4 | /* | ||
| 5 | * linux/usb/storage.h | ||
| 6 | * | ||
| 7 | * Copyright Matthew Wilcox for Intel Corp, 2010 | ||
| 8 | * | ||
| 9 | * This file contains definitions taken from the | ||
| 10 | * USB Mass Storage Class Specification Overview | ||
| 11 | * | ||
| 12 | * Distributed under the terms of the GNU GPL, version two. | ||
| 13 | */ | ||
| 14 | |||
| 15 | /* Storage subclass codes */ | ||
| 16 | |||
| 17 | #define USB_SC_RBC 0x01 /* Typically, flash devices */ | ||
| 18 | #define USB_SC_8020 0x02 /* CD-ROM */ | ||
| 19 | #define USB_SC_QIC 0x03 /* QIC-157 Tapes */ | ||
| 20 | #define USB_SC_UFI 0x04 /* Floppy */ | ||
| 21 | #define USB_SC_8070 0x05 /* Removable media */ | ||
| 22 | #define USB_SC_SCSI 0x06 /* Transparent */ | ||
| 23 | #define USB_SC_LOCKABLE 0x07 /* Password-protected */ | ||
| 24 | |||
| 25 | #define USB_SC_ISD200 0xf0 /* ISD200 ATA */ | ||
| 26 | #define USB_SC_CYP_ATACB 0xf1 /* Cypress ATACB */ | ||
| 27 | #define USB_SC_DEVICE 0xff /* Use device's value */ | ||
| 28 | |||
| 29 | /* Storage protocol codes */ | ||
| 30 | |||
| 31 | #define USB_PR_CBI 0x00 /* Control/Bulk/Interrupt */ | ||
| 32 | #define USB_PR_CB 0x01 /* Control/Bulk w/o interrupt */ | ||
| 33 | #define USB_PR_BULK 0x50 /* bulk only */ | ||
| 34 | #define USB_PR_UAS 0x62 /* USB Attached SCSI */ | ||
| 35 | |||
| 36 | #define USB_PR_USBAT 0x80 /* SCM-ATAPI bridge */ | ||
| 37 | #define USB_PR_EUSB_SDDR09 0x81 /* SCM-SCSI bridge for SDDR-09 */ | ||
| 38 | #define USB_PR_SDDR55 0x82 /* SDDR-55 (made up) */ | ||
| 39 | #define USB_PR_DPCM_USB 0xf0 /* Combination CB/SDDR09 */ | ||
| 40 | #define USB_PR_FREECOM 0xf1 /* Freecom */ | ||
| 41 | #define USB_PR_DATAFAB 0xf2 /* Datafab chipsets */ | ||
| 42 | #define USB_PR_JUMPSHOT 0xf3 /* Lexar Jumpshot */ | ||
| 43 | #define USB_PR_ALAUDA 0xf4 /* Alauda chipsets */ | ||
| 44 | #define USB_PR_KARMA 0xf5 /* Rio Karma */ | ||
| 45 | |||
| 46 | #define USB_PR_DEVICE 0xff /* Use device's value */ | ||
| 47 | |||
| 48 | #endif | ||
diff --git a/include/linux/usb/ulpi.h b/include/linux/usb/ulpi.h index 2369d07c3c87..82b1507f4735 100644 --- a/include/linux/usb/ulpi.h +++ b/include/linux/usb/ulpi.h | |||
| @@ -11,6 +11,42 @@ | |||
| 11 | #ifndef __LINUX_USB_ULPI_H | 11 | #ifndef __LINUX_USB_ULPI_H |
| 12 | #define __LINUX_USB_ULPI_H | 12 | #define __LINUX_USB_ULPI_H |
| 13 | 13 | ||
| 14 | #include <linux/usb/otg.h> | ||
| 15 | /*-------------------------------------------------------------------------*/ | ||
| 16 | |||
| 17 | /* | ||
| 18 | * ULPI Flags | ||
| 19 | */ | ||
| 20 | #define ULPI_OTG_ID_PULLUP (1 << 0) | ||
| 21 | #define ULPI_OTG_DP_PULLDOWN_DIS (1 << 1) | ||
| 22 | #define ULPI_OTG_DM_PULLDOWN_DIS (1 << 2) | ||
| 23 | #define ULPI_OTG_DISCHRGVBUS (1 << 3) | ||
| 24 | #define ULPI_OTG_CHRGVBUS (1 << 4) | ||
| 25 | #define ULPI_OTG_DRVVBUS (1 << 5) | ||
| 26 | #define ULPI_OTG_DRVVBUS_EXT (1 << 6) | ||
| 27 | #define ULPI_OTG_EXTVBUSIND (1 << 7) | ||
| 28 | |||
| 29 | #define ULPI_IC_6PIN_SERIAL (1 << 8) | ||
| 30 | #define ULPI_IC_3PIN_SERIAL (1 << 9) | ||
| 31 | #define ULPI_IC_CARKIT (1 << 10) | ||
| 32 | #define ULPI_IC_CLKSUSPM (1 << 11) | ||
| 33 | #define ULPI_IC_AUTORESUME (1 << 12) | ||
| 34 | #define ULPI_IC_EXTVBUS_INDINV (1 << 13) | ||
| 35 | #define ULPI_IC_IND_PASSTHRU (1 << 14) | ||
| 36 | #define ULPI_IC_PROTECT_DIS (1 << 15) | ||
| 37 | |||
| 38 | #define ULPI_FC_HS (1 << 16) | ||
| 39 | #define ULPI_FC_FS (1 << 17) | ||
| 40 | #define ULPI_FC_LS (1 << 18) | ||
| 41 | #define ULPI_FC_FS4LS (1 << 19) | ||
| 42 | #define ULPI_FC_TERMSEL (1 << 20) | ||
| 43 | #define ULPI_FC_OP_NORM (1 << 21) | ||
| 44 | #define ULPI_FC_OP_NODRV (1 << 22) | ||
| 45 | #define ULPI_FC_OP_DIS_NRZI (1 << 23) | ||
| 46 | #define ULPI_FC_OP_NSYNC_NEOP (1 << 24) | ||
| 47 | #define ULPI_FC_RST (1 << 25) | ||
| 48 | #define ULPI_FC_SUSPM (1 << 26) | ||
| 49 | |||
| 14 | /*-------------------------------------------------------------------------*/ | 50 | /*-------------------------------------------------------------------------*/ |
| 15 | 51 | ||
| 16 | /* | 52 | /* |
| @@ -58,6 +94,10 @@ | |||
| 58 | 94 | ||
| 59 | /*-------------------------------------------------------------------------*/ | 95 | /*-------------------------------------------------------------------------*/ |
| 60 | 96 | ||
| 97 | /* | ||
| 98 | * Register Bits | ||
| 99 | */ | ||
| 100 | |||
| 61 | /* Function Control */ | 101 | /* Function Control */ |
| 62 | #define ULPI_FUNC_CTRL_XCVRSEL (1 << 0) | 102 | #define ULPI_FUNC_CTRL_XCVRSEL (1 << 0) |
| 63 | #define ULPI_FUNC_CTRL_XCVRSEL_MASK (3 << 0) | 103 | #define ULPI_FUNC_CTRL_XCVRSEL_MASK (3 << 0) |
diff --git a/include/linux/usb/video.h b/include/linux/usb/video.h index be436d9ee479..3b3b95e01f71 100644 --- a/include/linux/usb/video.h +++ b/include/linux/usb/video.h | |||
| @@ -160,5 +160,409 @@ | |||
| 160 | #define UVC_STATUS_TYPE_CONTROL 1 | 160 | #define UVC_STATUS_TYPE_CONTROL 1 |
| 161 | #define UVC_STATUS_TYPE_STREAMING 2 | 161 | #define UVC_STATUS_TYPE_STREAMING 2 |
| 162 | 162 | ||
| 163 | /* 2.4.3.3. Payload Header Information */ | ||
| 164 | #define UVC_STREAM_EOH (1 << 7) | ||
| 165 | #define UVC_STREAM_ERR (1 << 6) | ||
| 166 | #define UVC_STREAM_STI (1 << 5) | ||
| 167 | #define UVC_STREAM_RES (1 << 4) | ||
| 168 | #define UVC_STREAM_SCR (1 << 3) | ||
| 169 | #define UVC_STREAM_PTS (1 << 2) | ||
| 170 | #define UVC_STREAM_EOF (1 << 1) | ||
| 171 | #define UVC_STREAM_FID (1 << 0) | ||
| 172 | |||
| 173 | /* 4.1.2. Control Capabilities */ | ||
| 174 | #define UVC_CONTROL_CAP_GET (1 << 0) | ||
| 175 | #define UVC_CONTROL_CAP_SET (1 << 1) | ||
| 176 | #define UVC_CONTROL_CAP_DISABLED (1 << 2) | ||
| 177 | #define UVC_CONTROL_CAP_AUTOUPDATE (1 << 3) | ||
| 178 | #define UVC_CONTROL_CAP_ASYNCHRONOUS (1 << 4) | ||
| 179 | |||
| 180 | /* ------------------------------------------------------------------------ | ||
| 181 | * UVC structures | ||
| 182 | */ | ||
| 183 | |||
| 184 | /* All UVC descriptors have these 3 fields at the beginning */ | ||
| 185 | struct uvc_descriptor_header { | ||
| 186 | __u8 bLength; | ||
| 187 | __u8 bDescriptorType; | ||
| 188 | __u8 bDescriptorSubType; | ||
| 189 | } __attribute__((packed)); | ||
| 190 | |||
| 191 | /* 3.7.2. Video Control Interface Header Descriptor */ | ||
| 192 | struct uvc_header_descriptor { | ||
| 193 | __u8 bLength; | ||
| 194 | __u8 bDescriptorType; | ||
| 195 | __u8 bDescriptorSubType; | ||
| 196 | __u16 bcdUVC; | ||
| 197 | __u16 wTotalLength; | ||
| 198 | __u32 dwClockFrequency; | ||
| 199 | __u8 bInCollection; | ||
| 200 | __u8 baInterfaceNr[]; | ||
| 201 | } __attribute__((__packed__)); | ||
| 202 | |||
| 203 | #define UVC_DT_HEADER_SIZE(n) (12+(n)) | ||
| 204 | |||
| 205 | #define UVC_HEADER_DESCRIPTOR(n) \ | ||
| 206 | uvc_header_descriptor_##n | ||
| 207 | |||
| 208 | #define DECLARE_UVC_HEADER_DESCRIPTOR(n) \ | ||
| 209 | struct UVC_HEADER_DESCRIPTOR(n) { \ | ||
| 210 | __u8 bLength; \ | ||
| 211 | __u8 bDescriptorType; \ | ||
| 212 | __u8 bDescriptorSubType; \ | ||
| 213 | __u16 bcdUVC; \ | ||
| 214 | __u16 wTotalLength; \ | ||
| 215 | __u32 dwClockFrequency; \ | ||
| 216 | __u8 bInCollection; \ | ||
| 217 | __u8 baInterfaceNr[n]; \ | ||
| 218 | } __attribute__ ((packed)) | ||
| 219 | |||
| 220 | /* 3.7.2.1. Input Terminal Descriptor */ | ||
| 221 | struct uvc_input_terminal_descriptor { | ||
| 222 | __u8 bLength; | ||
| 223 | __u8 bDescriptorType; | ||
| 224 | __u8 bDescriptorSubType; | ||
| 225 | __u8 bTerminalID; | ||
| 226 | __u16 wTerminalType; | ||
| 227 | __u8 bAssocTerminal; | ||
| 228 | __u8 iTerminal; | ||
| 229 | } __attribute__((__packed__)); | ||
| 230 | |||
| 231 | #define UVC_DT_INPUT_TERMINAL_SIZE 8 | ||
| 232 | |||
| 233 | /* 3.7.2.2. Output Terminal Descriptor */ | ||
| 234 | struct uvc_output_terminal_descriptor { | ||
| 235 | __u8 bLength; | ||
| 236 | __u8 bDescriptorType; | ||
| 237 | __u8 bDescriptorSubType; | ||
| 238 | __u8 bTerminalID; | ||
| 239 | __u16 wTerminalType; | ||
| 240 | __u8 bAssocTerminal; | ||
| 241 | __u8 bSourceID; | ||
| 242 | __u8 iTerminal; | ||
| 243 | } __attribute__((__packed__)); | ||
| 244 | |||
| 245 | #define UVC_DT_OUTPUT_TERMINAL_SIZE 9 | ||
| 246 | |||
| 247 | /* 3.7.2.3. Camera Terminal Descriptor */ | ||
| 248 | struct uvc_camera_terminal_descriptor { | ||
| 249 | __u8 bLength; | ||
| 250 | __u8 bDescriptorType; | ||
| 251 | __u8 bDescriptorSubType; | ||
| 252 | __u8 bTerminalID; | ||
| 253 | __u16 wTerminalType; | ||
| 254 | __u8 bAssocTerminal; | ||
| 255 | __u8 iTerminal; | ||
| 256 | __u16 wObjectiveFocalLengthMin; | ||
| 257 | __u16 wObjectiveFocalLengthMax; | ||
| 258 | __u16 wOcularFocalLength; | ||
| 259 | __u8 bControlSize; | ||
| 260 | __u8 bmControls[3]; | ||
| 261 | } __attribute__((__packed__)); | ||
| 262 | |||
| 263 | #define UVC_DT_CAMERA_TERMINAL_SIZE(n) (15+(n)) | ||
| 264 | |||
| 265 | /* 3.7.2.4. Selector Unit Descriptor */ | ||
| 266 | struct uvc_selector_unit_descriptor { | ||
| 267 | __u8 bLength; | ||
| 268 | __u8 bDescriptorType; | ||
| 269 | __u8 bDescriptorSubType; | ||
| 270 | __u8 bUnitID; | ||
| 271 | __u8 bNrInPins; | ||
| 272 | __u8 baSourceID[0]; | ||
| 273 | __u8 iSelector; | ||
| 274 | } __attribute__((__packed__)); | ||
| 275 | |||
| 276 | #define UVC_DT_SELECTOR_UNIT_SIZE(n) (6+(n)) | ||
| 277 | |||
| 278 | #define UVC_SELECTOR_UNIT_DESCRIPTOR(n) \ | ||
| 279 | uvc_selector_unit_descriptor_##n | ||
| 280 | |||
| 281 | #define DECLARE_UVC_SELECTOR_UNIT_DESCRIPTOR(n) \ | ||
| 282 | struct UVC_SELECTOR_UNIT_DESCRIPTOR(n) { \ | ||
| 283 | __u8 bLength; \ | ||
| 284 | __u8 bDescriptorType; \ | ||
| 285 | __u8 bDescriptorSubType; \ | ||
| 286 | __u8 bUnitID; \ | ||
| 287 | __u8 bNrInPins; \ | ||
| 288 | __u8 baSourceID[n]; \ | ||
| 289 | __u8 iSelector; \ | ||
| 290 | } __attribute__ ((packed)) | ||
| 291 | |||
| 292 | /* 3.7.2.5. Processing Unit Descriptor */ | ||
| 293 | struct uvc_processing_unit_descriptor { | ||
| 294 | __u8 bLength; | ||
| 295 | __u8 bDescriptorType; | ||
| 296 | __u8 bDescriptorSubType; | ||
| 297 | __u8 bUnitID; | ||
| 298 | __u8 bSourceID; | ||
| 299 | __u16 wMaxMultiplier; | ||
| 300 | __u8 bControlSize; | ||
| 301 | __u8 bmControls[2]; | ||
| 302 | __u8 iProcessing; | ||
| 303 | } __attribute__((__packed__)); | ||
| 304 | |||
| 305 | #define UVC_DT_PROCESSING_UNIT_SIZE(n) (9+(n)) | ||
| 306 | |||
| 307 | /* 3.7.2.6. Extension Unit Descriptor */ | ||
| 308 | struct uvc_extension_unit_descriptor { | ||
| 309 | __u8 bLength; | ||
| 310 | __u8 bDescriptorType; | ||
| 311 | __u8 bDescriptorSubType; | ||
| 312 | __u8 bUnitID; | ||
| 313 | __u8 guidExtensionCode[16]; | ||
| 314 | __u8 bNumControls; | ||
| 315 | __u8 bNrInPins; | ||
| 316 | __u8 baSourceID[0]; | ||
| 317 | __u8 bControlSize; | ||
| 318 | __u8 bmControls[0]; | ||
| 319 | __u8 iExtension; | ||
| 320 | } __attribute__((__packed__)); | ||
| 321 | |||
| 322 | #define UVC_DT_EXTENSION_UNIT_SIZE(p, n) (24+(p)+(n)) | ||
| 323 | |||
| 324 | #define UVC_EXTENSION_UNIT_DESCRIPTOR(p, n) \ | ||
| 325 | uvc_extension_unit_descriptor_##p_##n | ||
| 326 | |||
| 327 | #define DECLARE_UVC_EXTENSION_UNIT_DESCRIPTOR(p, n) \ | ||
| 328 | struct UVC_EXTENSION_UNIT_DESCRIPTOR(p, n) { \ | ||
| 329 | __u8 bLength; \ | ||
| 330 | __u8 bDescriptorType; \ | ||
| 331 | __u8 bDescriptorSubType; \ | ||
| 332 | __u8 bUnitID; \ | ||
| 333 | __u8 guidExtensionCode[16]; \ | ||
| 334 | __u8 bNumControls; \ | ||
| 335 | __u8 bNrInPins; \ | ||
| 336 | __u8 baSourceID[p]; \ | ||
| 337 | __u8 bControlSize; \ | ||
| 338 | __u8 bmControls[n]; \ | ||
| 339 | __u8 iExtension; \ | ||
| 340 | } __attribute__ ((packed)) | ||
| 341 | |||
| 342 | /* 3.8.2.2. Video Control Interrupt Endpoint Descriptor */ | ||
| 343 | struct uvc_control_endpoint_descriptor { | ||
| 344 | __u8 bLength; | ||
| 345 | __u8 bDescriptorType; | ||
| 346 | __u8 bDescriptorSubType; | ||
| 347 | __u16 wMaxTransferSize; | ||
| 348 | } __attribute__((__packed__)); | ||
| 349 | |||
| 350 | #define UVC_DT_CONTROL_ENDPOINT_SIZE 5 | ||
| 351 | |||
| 352 | /* 3.9.2.1. Input Header Descriptor */ | ||
| 353 | struct uvc_input_header_descriptor { | ||
| 354 | __u8 bLength; | ||
| 355 | __u8 bDescriptorType; | ||
| 356 | __u8 bDescriptorSubType; | ||
| 357 | __u8 bNumFormats; | ||
| 358 | __u16 wTotalLength; | ||
| 359 | __u8 bEndpointAddress; | ||
| 360 | __u8 bmInfo; | ||
| 361 | __u8 bTerminalLink; | ||
| 362 | __u8 bStillCaptureMethod; | ||
| 363 | __u8 bTriggerSupport; | ||
| 364 | __u8 bTriggerUsage; | ||
| 365 | __u8 bControlSize; | ||
| 366 | __u8 bmaControls[]; | ||
| 367 | } __attribute__((__packed__)); | ||
| 368 | |||
| 369 | #define UVC_DT_INPUT_HEADER_SIZE(n, p) (13+(n*p)) | ||
| 370 | |||
| 371 | #define UVC_INPUT_HEADER_DESCRIPTOR(n, p) \ | ||
| 372 | uvc_input_header_descriptor_##n_##p | ||
| 373 | |||
| 374 | #define DECLARE_UVC_INPUT_HEADER_DESCRIPTOR(n, p) \ | ||
| 375 | struct UVC_INPUT_HEADER_DESCRIPTOR(n, p) { \ | ||
| 376 | __u8 bLength; \ | ||
| 377 | __u8 bDescriptorType; \ | ||
| 378 | __u8 bDescriptorSubType; \ | ||
| 379 | __u8 bNumFormats; \ | ||
| 380 | __u16 wTotalLength; \ | ||
| 381 | __u8 bEndpointAddress; \ | ||
| 382 | __u8 bmInfo; \ | ||
| 383 | __u8 bTerminalLink; \ | ||
| 384 | __u8 bStillCaptureMethod; \ | ||
| 385 | __u8 bTriggerSupport; \ | ||
| 386 | __u8 bTriggerUsage; \ | ||
| 387 | __u8 bControlSize; \ | ||
| 388 | __u8 bmaControls[p][n]; \ | ||
| 389 | } __attribute__ ((packed)) | ||
| 390 | |||
| 391 | /* 3.9.2.2. Output Header Descriptor */ | ||
| 392 | struct uvc_output_header_descriptor { | ||
| 393 | __u8 bLength; | ||
| 394 | __u8 bDescriptorType; | ||
| 395 | __u8 bDescriptorSubType; | ||
| 396 | __u8 bNumFormats; | ||
| 397 | __u16 wTotalLength; | ||
| 398 | __u8 bEndpointAddress; | ||
| 399 | __u8 bTerminalLink; | ||
| 400 | __u8 bControlSize; | ||
| 401 | __u8 bmaControls[]; | ||
| 402 | } __attribute__((__packed__)); | ||
| 403 | |||
| 404 | #define UVC_DT_OUTPUT_HEADER_SIZE(n, p) (9+(n*p)) | ||
| 405 | |||
| 406 | #define UVC_OUTPUT_HEADER_DESCRIPTOR(n, p) \ | ||
| 407 | uvc_output_header_descriptor_##n_##p | ||
| 408 | |||
| 409 | #define DECLARE_UVC_OUTPUT_HEADER_DESCRIPTOR(n, p) \ | ||
| 410 | struct UVC_OUTPUT_HEADER_DESCRIPTOR(n, p) { \ | ||
| 411 | __u8 bLength; \ | ||
| 412 | __u8 bDescriptorType; \ | ||
| 413 | __u8 bDescriptorSubType; \ | ||
| 414 | __u8 bNumFormats; \ | ||
| 415 | __u16 wTotalLength; \ | ||
| 416 | __u8 bEndpointAddress; \ | ||
| 417 | __u8 bTerminalLink; \ | ||
| 418 | __u8 bControlSize; \ | ||
| 419 | __u8 bmaControls[p][n]; \ | ||
| 420 | } __attribute__ ((packed)) | ||
| 421 | |||
| 422 | /* 3.9.2.6. Color matching descriptor */ | ||
| 423 | struct uvc_color_matching_descriptor { | ||
| 424 | __u8 bLength; | ||
| 425 | __u8 bDescriptorType; | ||
| 426 | __u8 bDescriptorSubType; | ||
| 427 | __u8 bColorPrimaries; | ||
| 428 | __u8 bTransferCharacteristics; | ||
| 429 | __u8 bMatrixCoefficients; | ||
| 430 | } __attribute__((__packed__)); | ||
| 431 | |||
| 432 | #define UVC_DT_COLOR_MATCHING_SIZE 6 | ||
| 433 | |||
| 434 | /* 4.3.1.1. Video Probe and Commit Controls */ | ||
| 435 | struct uvc_streaming_control { | ||
| 436 | __u16 bmHint; | ||
| 437 | __u8 bFormatIndex; | ||
| 438 | __u8 bFrameIndex; | ||
| 439 | __u32 dwFrameInterval; | ||
| 440 | __u16 wKeyFrameRate; | ||
| 441 | __u16 wPFrameRate; | ||
| 442 | __u16 wCompQuality; | ||
| 443 | __u16 wCompWindowSize; | ||
| 444 | __u16 wDelay; | ||
| 445 | __u32 dwMaxVideoFrameSize; | ||
| 446 | __u32 dwMaxPayloadTransferSize; | ||
| 447 | __u32 dwClockFrequency; | ||
| 448 | __u8 bmFramingInfo; | ||
| 449 | __u8 bPreferedVersion; | ||
| 450 | __u8 bMinVersion; | ||
| 451 | __u8 bMaxVersion; | ||
| 452 | } __attribute__((__packed__)); | ||
| 453 | |||
| 454 | /* Uncompressed Payload - 3.1.1. Uncompressed Video Format Descriptor */ | ||
| 455 | struct uvc_format_uncompressed { | ||
| 456 | __u8 bLength; | ||
| 457 | __u8 bDescriptorType; | ||
| 458 | __u8 bDescriptorSubType; | ||
| 459 | __u8 bFormatIndex; | ||
| 460 | __u8 bNumFrameDescriptors; | ||
| 461 | __u8 guidFormat[16]; | ||
| 462 | __u8 bBitsPerPixel; | ||
| 463 | __u8 bDefaultFrameIndex; | ||
| 464 | __u8 bAspectRatioX; | ||
| 465 | __u8 bAspectRatioY; | ||
| 466 | __u8 bmInterfaceFlags; | ||
| 467 | __u8 bCopyProtect; | ||
| 468 | } __attribute__((__packed__)); | ||
| 469 | |||
| 470 | #define UVC_DT_FORMAT_UNCOMPRESSED_SIZE 27 | ||
| 471 | |||
| 472 | /* Uncompressed Payload - 3.1.2. Uncompressed Video Frame Descriptor */ | ||
| 473 | struct uvc_frame_uncompressed { | ||
| 474 | __u8 bLength; | ||
| 475 | __u8 bDescriptorType; | ||
| 476 | __u8 bDescriptorSubType; | ||
| 477 | __u8 bFrameIndex; | ||
| 478 | __u8 bmCapabilities; | ||
| 479 | __u16 wWidth; | ||
| 480 | __u16 wHeight; | ||
| 481 | __u32 dwMinBitRate; | ||
| 482 | __u32 dwMaxBitRate; | ||
| 483 | __u32 dwMaxVideoFrameBufferSize; | ||
| 484 | __u32 dwDefaultFrameInterval; | ||
| 485 | __u8 bFrameIntervalType; | ||
| 486 | __u32 dwFrameInterval[]; | ||
| 487 | } __attribute__((__packed__)); | ||
| 488 | |||
| 489 | #define UVC_DT_FRAME_UNCOMPRESSED_SIZE(n) (26+4*(n)) | ||
| 490 | |||
| 491 | #define UVC_FRAME_UNCOMPRESSED(n) \ | ||
| 492 | uvc_frame_uncompressed_##n | ||
| 493 | |||
| 494 | #define DECLARE_UVC_FRAME_UNCOMPRESSED(n) \ | ||
| 495 | struct UVC_FRAME_UNCOMPRESSED(n) { \ | ||
| 496 | __u8 bLength; \ | ||
| 497 | __u8 bDescriptorType; \ | ||
| 498 | __u8 bDescriptorSubType; \ | ||
| 499 | __u8 bFrameIndex; \ | ||
| 500 | __u8 bmCapabilities; \ | ||
| 501 | __u16 wWidth; \ | ||
| 502 | __u16 wHeight; \ | ||
| 503 | __u32 dwMinBitRate; \ | ||
| 504 | __u32 dwMaxBitRate; \ | ||
| 505 | __u32 dwMaxVideoFrameBufferSize; \ | ||
| 506 | __u32 dwDefaultFrameInterval; \ | ||
| 507 | __u8 bFrameIntervalType; \ | ||
| 508 | __u32 dwFrameInterval[n]; \ | ||
| 509 | } __attribute__ ((packed)) | ||
| 510 | |||
| 511 | /* MJPEG Payload - 3.1.1. MJPEG Video Format Descriptor */ | ||
| 512 | struct uvc_format_mjpeg { | ||
| 513 | __u8 bLength; | ||
| 514 | __u8 bDescriptorType; | ||
| 515 | __u8 bDescriptorSubType; | ||
| 516 | __u8 bFormatIndex; | ||
| 517 | __u8 bNumFrameDescriptors; | ||
| 518 | __u8 bmFlags; | ||
| 519 | __u8 bDefaultFrameIndex; | ||
| 520 | __u8 bAspectRatioX; | ||
| 521 | __u8 bAspectRatioY; | ||
| 522 | __u8 bmInterfaceFlags; | ||
| 523 | __u8 bCopyProtect; | ||
| 524 | } __attribute__((__packed__)); | ||
| 525 | |||
| 526 | #define UVC_DT_FORMAT_MJPEG_SIZE 11 | ||
| 527 | |||
| 528 | /* MJPEG Payload - 3.1.2. MJPEG Video Frame Descriptor */ | ||
| 529 | struct uvc_frame_mjpeg { | ||
| 530 | __u8 bLength; | ||
| 531 | __u8 bDescriptorType; | ||
| 532 | __u8 bDescriptorSubType; | ||
| 533 | __u8 bFrameIndex; | ||
| 534 | __u8 bmCapabilities; | ||
| 535 | __u16 wWidth; | ||
| 536 | __u16 wHeight; | ||
| 537 | __u32 dwMinBitRate; | ||
| 538 | __u32 dwMaxBitRate; | ||
| 539 | __u32 dwMaxVideoFrameBufferSize; | ||
| 540 | __u32 dwDefaultFrameInterval; | ||
| 541 | __u8 bFrameIntervalType; | ||
| 542 | __u32 dwFrameInterval[]; | ||
| 543 | } __attribute__((__packed__)); | ||
| 544 | |||
| 545 | #define UVC_DT_FRAME_MJPEG_SIZE(n) (26+4*(n)) | ||
| 546 | |||
| 547 | #define UVC_FRAME_MJPEG(n) \ | ||
| 548 | uvc_frame_mjpeg_##n | ||
| 549 | |||
| 550 | #define DECLARE_UVC_FRAME_MJPEG(n) \ | ||
| 551 | struct UVC_FRAME_MJPEG(n) { \ | ||
| 552 | __u8 bLength; \ | ||
| 553 | __u8 bDescriptorType; \ | ||
| 554 | __u8 bDescriptorSubType; \ | ||
| 555 | __u8 bFrameIndex; \ | ||
| 556 | __u8 bmCapabilities; \ | ||
| 557 | __u16 wWidth; \ | ||
| 558 | __u16 wHeight; \ | ||
| 559 | __u32 dwMinBitRate; \ | ||
| 560 | __u32 dwMaxBitRate; \ | ||
| 561 | __u32 dwMaxVideoFrameBufferSize; \ | ||
| 562 | __u32 dwDefaultFrameInterval; \ | ||
| 563 | __u8 bFrameIntervalType; \ | ||
| 564 | __u32 dwFrameInterval[n]; \ | ||
| 565 | } __attribute__ ((packed)) | ||
| 566 | |||
| 163 | #endif /* __LINUX_USB_VIDEO_H */ | 567 | #endif /* __LINUX_USB_VIDEO_H */ |
| 164 | 568 | ||
diff --git a/include/linux/usb_usual.h b/include/linux/usb_usual.h index a4b947e470a5..71693d4a4fe1 100644 --- a/include/linux/usb_usual.h +++ b/include/linux/usb_usual.h | |||
| @@ -58,7 +58,11 @@ | |||
| 58 | US_FLAG(CAPACITY_OK, 0x00010000) \ | 58 | US_FLAG(CAPACITY_OK, 0x00010000) \ |
| 59 | /* READ CAPACITY response is correct */ \ | 59 | /* READ CAPACITY response is correct */ \ |
| 60 | US_FLAG(BAD_SENSE, 0x00020000) \ | 60 | US_FLAG(BAD_SENSE, 0x00020000) \ |
| 61 | /* Bad Sense (never more than 18 bytes) */ | 61 | /* Bad Sense (never more than 18 bytes) */ \ |
| 62 | US_FLAG(NO_READ_DISC_INFO, 0x00040000) \ | ||
| 63 | /* cannot handle READ_DISC_INFO */ \ | ||
| 64 | US_FLAG(NO_READ_CAPACITY_16, 0x00080000) \ | ||
| 65 | /* cannot handle READ_CAPACITY_16 */ | ||
| 62 | 66 | ||
| 63 | #define US_FLAG(name, value) US_FL_##name = value , | 67 | #define US_FLAG(name, value) US_FL_##name = value , |
| 64 | enum { US_DO_ALL_FLAGS }; | 68 | enum { US_DO_ALL_FLAGS }; |
| @@ -74,42 +78,7 @@ enum { US_DO_ALL_FLAGS }; | |||
| 74 | #define USB_US_TYPE(flags) (((flags) >> 24) & 0xFF) | 78 | #define USB_US_TYPE(flags) (((flags) >> 24) & 0xFF) |
| 75 | #define USB_US_ORIG_FLAGS(flags) ((flags) & 0x00FFFFFF) | 79 | #define USB_US_ORIG_FLAGS(flags) ((flags) & 0x00FFFFFF) |
| 76 | 80 | ||
| 77 | /* | 81 | #include <linux/usb/storage.h> |
| 78 | * This is probably not the best place to keep these constants, conceptually. | ||
| 79 | * But it's the only header included into all places which need them. | ||
| 80 | */ | ||
| 81 | |||
| 82 | /* Sub Classes */ | ||
| 83 | |||
| 84 | #define US_SC_RBC 0x01 /* Typically, flash devices */ | ||
| 85 | #define US_SC_8020 0x02 /* CD-ROM */ | ||
| 86 | #define US_SC_QIC 0x03 /* QIC-157 Tapes */ | ||
| 87 | #define US_SC_UFI 0x04 /* Floppy */ | ||
| 88 | #define US_SC_8070 0x05 /* Removable media */ | ||
| 89 | #define US_SC_SCSI 0x06 /* Transparent */ | ||
| 90 | #define US_SC_LOCKABLE 0x07 /* Password-protected */ | ||
| 91 | |||
| 92 | #define US_SC_ISD200 0xf0 /* ISD200 ATA */ | ||
| 93 | #define US_SC_CYP_ATACB 0xf1 /* Cypress ATACB */ | ||
| 94 | #define US_SC_DEVICE 0xff /* Use device's value */ | ||
| 95 | |||
| 96 | /* Protocols */ | ||
| 97 | |||
| 98 | #define US_PR_CBI 0x00 /* Control/Bulk/Interrupt */ | ||
| 99 | #define US_PR_CB 0x01 /* Control/Bulk w/o interrupt */ | ||
| 100 | #define US_PR_BULK 0x50 /* bulk only */ | ||
| 101 | |||
| 102 | #define US_PR_USBAT 0x80 /* SCM-ATAPI bridge */ | ||
| 103 | #define US_PR_EUSB_SDDR09 0x81 /* SCM-SCSI bridge for SDDR-09 */ | ||
| 104 | #define US_PR_SDDR55 0x82 /* SDDR-55 (made up) */ | ||
| 105 | #define US_PR_DPCM_USB 0xf0 /* Combination CB/SDDR09 */ | ||
| 106 | #define US_PR_FREECOM 0xf1 /* Freecom */ | ||
| 107 | #define US_PR_DATAFAB 0xf2 /* Datafab chipsets */ | ||
| 108 | #define US_PR_JUMPSHOT 0xf3 /* Lexar Jumpshot */ | ||
| 109 | #define US_PR_ALAUDA 0xf4 /* Alauda chipsets */ | ||
| 110 | #define US_PR_KARMA 0xf5 /* Rio Karma */ | ||
| 111 | |||
| 112 | #define US_PR_DEVICE 0xff /* Use device's value */ | ||
| 113 | 82 | ||
| 114 | /* | 83 | /* |
| 115 | */ | 84 | */ |
diff --git a/include/linux/user_namespace.h b/include/linux/user_namespace.h index cc4f45361dbb..8178156711f9 100644 --- a/include/linux/user_namespace.h +++ b/include/linux/user_namespace.h | |||
| @@ -36,6 +36,9 @@ static inline void put_user_ns(struct user_namespace *ns) | |||
| 36 | kref_put(&ns->kref, free_user_ns); | 36 | kref_put(&ns->kref, free_user_ns); |
| 37 | } | 37 | } |
| 38 | 38 | ||
| 39 | uid_t user_ns_map_uid(struct user_namespace *to, const struct cred *cred, uid_t uid); | ||
| 40 | gid_t user_ns_map_gid(struct user_namespace *to, const struct cred *cred, gid_t gid); | ||
| 41 | |||
| 39 | #else | 42 | #else |
| 40 | 43 | ||
| 41 | static inline struct user_namespace *get_user_ns(struct user_namespace *ns) | 44 | static inline struct user_namespace *get_user_ns(struct user_namespace *ns) |
| @@ -52,6 +55,17 @@ static inline void put_user_ns(struct user_namespace *ns) | |||
| 52 | { | 55 | { |
| 53 | } | 56 | } |
| 54 | 57 | ||
| 58 | static inline uid_t user_ns_map_uid(struct user_namespace *to, | ||
| 59 | const struct cred *cred, uid_t uid) | ||
| 60 | { | ||
| 61 | return uid; | ||
| 62 | } | ||
| 63 | static inline gid_t user_ns_map_gid(struct user_namespace *to, | ||
| 64 | const struct cred *cred, gid_t gid) | ||
| 65 | { | ||
| 66 | return gid; | ||
| 67 | } | ||
| 68 | |||
| 55 | #endif | 69 | #endif |
| 56 | 70 | ||
| 57 | #endif /* _LINUX_USER_H */ | 71 | #endif /* _LINUX_USER_H */ |
diff --git a/include/linux/vgaarb.h b/include/linux/vgaarb.h index 814f294d4cd0..e9e1524b582c 100644 --- a/include/linux/vgaarb.h +++ b/include/linux/vgaarb.h | |||
| @@ -31,7 +31,6 @@ | |||
| 31 | #ifndef LINUX_VGA_H | 31 | #ifndef LINUX_VGA_H |
| 32 | #define LINUX_VGA_H | 32 | #define LINUX_VGA_H |
| 33 | 33 | ||
| 34 | #include <asm/vga.h> | ||
| 35 | 34 | ||
| 36 | /* Legacy VGA regions */ | 35 | /* Legacy VGA regions */ |
| 37 | #define VGA_RSRC_NONE 0x00 | 36 | #define VGA_RSRC_NONE 0x00 |
| @@ -94,8 +93,11 @@ extern void vga_set_legacy_decoding(struct pci_dev *pdev, | |||
| 94 | * Nested calls are supported (a per-resource counter is maintained) | 93 | * Nested calls are supported (a per-resource counter is maintained) |
| 95 | */ | 94 | */ |
| 96 | 95 | ||
| 97 | extern int vga_get(struct pci_dev *pdev, unsigned int rsrc, | 96 | #if defined(CONFIG_VGA_ARB) |
| 98 | int interruptible); | 97 | extern int vga_get(struct pci_dev *pdev, unsigned int rsrc, int interruptible); |
| 98 | #else | ||
| 99 | static inline int vga_get(struct pci_dev *pdev, unsigned int rsrc, int interruptible) { return 0; } | ||
| 100 | #endif | ||
| 99 | 101 | ||
| 100 | /** | 102 | /** |
| 101 | * vga_get_interruptible | 103 | * vga_get_interruptible |
| @@ -132,7 +134,11 @@ static inline int vga_get_uninterruptible(struct pci_dev *pdev, | |||
| 132 | * are already locked by another card. It can be called in any context | 134 | * are already locked by another card. It can be called in any context |
| 133 | */ | 135 | */ |
| 134 | 136 | ||
| 137 | #if defined(CONFIG_VGA_ARB) | ||
| 135 | extern int vga_tryget(struct pci_dev *pdev, unsigned int rsrc); | 138 | extern int vga_tryget(struct pci_dev *pdev, unsigned int rsrc); |
| 139 | #else | ||
| 140 | static inline int vga_tryget(struct pci_dev *pdev, unsigned int rsrc) { return 0; } | ||
| 141 | #endif | ||
| 136 | 142 | ||
| 137 | /** | 143 | /** |
| 138 | * vga_put - release lock on legacy VGA resources | 144 | * vga_put - release lock on legacy VGA resources |
| @@ -147,7 +153,11 @@ extern int vga_tryget(struct pci_dev *pdev, unsigned int rsrc); | |||
| 147 | * released if the counter reaches 0. | 153 | * released if the counter reaches 0. |
| 148 | */ | 154 | */ |
| 149 | 155 | ||
| 156 | #if defined(CONFIG_VGA_ARB) | ||
| 150 | extern void vga_put(struct pci_dev *pdev, unsigned int rsrc); | 157 | extern void vga_put(struct pci_dev *pdev, unsigned int rsrc); |
| 158 | #else | ||
| 159 | #define vga_put(pdev, rsrc) | ||
| 160 | #endif | ||
| 151 | 161 | ||
| 152 | 162 | ||
| 153 | /** | 163 | /** |
diff --git a/include/linux/via-core.h b/include/linux/via-core.h index 7ffb521e1a7a..38bffd8ccca5 100644 --- a/include/linux/via-core.h +++ b/include/linux/via-core.h | |||
| @@ -81,7 +81,7 @@ struct viafb_dev { | |||
| 81 | unsigned long fbmem_start; | 81 | unsigned long fbmem_start; |
| 82 | long fbmem_len; | 82 | long fbmem_len; |
| 83 | void __iomem *fbmem; | 83 | void __iomem *fbmem; |
| 84 | #if defined(CONFIG_FB_VIA_CAMERA) || defined(CONFIG_FB_VIA_CAMERA_MODULE) | 84 | #if defined(CONFIG_VIDEO_VIA_CAMERA) || defined(CONFIG_VIDEO_VIA_CAMERA_MODULE) |
| 85 | long camera_fbmem_offset; | 85 | long camera_fbmem_offset; |
| 86 | long camera_fbmem_size; | 86 | long camera_fbmem_size; |
| 87 | #endif | 87 | #endif |
| @@ -138,6 +138,7 @@ void viafb_irq_disable(u32 mask); | |||
| 138 | #define VDE_I_LVDSSIEN 0x40000000 /* LVDS Sense enable */ | 138 | #define VDE_I_LVDSSIEN 0x40000000 /* LVDS Sense enable */ |
| 139 | #define VDE_I_ENABLE 0x80000000 /* Global interrupt enable */ | 139 | #define VDE_I_ENABLE 0x80000000 /* Global interrupt enable */ |
| 140 | 140 | ||
| 141 | #if defined(CONFIG_VIDEO_VIA_CAMERA) || defined(CONFIG_VIDEO_VIA_CAMERA_MODULE) | ||
| 141 | /* | 142 | /* |
| 142 | * DMA management. | 143 | * DMA management. |
| 143 | */ | 144 | */ |
| @@ -172,6 +173,7 @@ int viafb_dma_copy_out_sg(unsigned int offset, struct scatterlist *sg, int nsg); | |||
| 172 | */ | 173 | */ |
| 173 | #define VGA_WIDTH 640 | 174 | #define VGA_WIDTH 640 |
| 174 | #define VGA_HEIGHT 480 | 175 | #define VGA_HEIGHT 480 |
| 176 | #endif /* CONFIG_VIDEO_VIA_CAMERA */ | ||
| 175 | 177 | ||
| 176 | /* | 178 | /* |
| 177 | * Indexed port operations. Note that these are all multi-op | 179 | * Indexed port operations. Note that these are all multi-op |
diff --git a/include/linux/videodev2.h b/include/linux/videodev2.h index 047f7e6edb86..5f6f47044abf 100644 --- a/include/linux/videodev2.h +++ b/include/linux/videodev2.h | |||
| @@ -277,6 +277,7 @@ struct v4l2_pix_format { | |||
| 277 | #define V4L2_PIX_FMT_RGB565 v4l2_fourcc('R', 'G', 'B', 'P') /* 16 RGB-5-6-5 */ | 277 | #define V4L2_PIX_FMT_RGB565 v4l2_fourcc('R', 'G', 'B', 'P') /* 16 RGB-5-6-5 */ |
| 278 | #define V4L2_PIX_FMT_RGB555X v4l2_fourcc('R', 'G', 'B', 'Q') /* 16 RGB-5-5-5 BE */ | 278 | #define V4L2_PIX_FMT_RGB555X v4l2_fourcc('R', 'G', 'B', 'Q') /* 16 RGB-5-5-5 BE */ |
| 279 | #define V4L2_PIX_FMT_RGB565X v4l2_fourcc('R', 'G', 'B', 'R') /* 16 RGB-5-6-5 BE */ | 279 | #define V4L2_PIX_FMT_RGB565X v4l2_fourcc('R', 'G', 'B', 'R') /* 16 RGB-5-6-5 BE */ |
| 280 | #define V4L2_PIX_FMT_BGR666 v4l2_fourcc('B', 'G', 'R', 'H') /* 18 BGR-6-6-6 */ | ||
| 280 | #define V4L2_PIX_FMT_BGR24 v4l2_fourcc('B', 'G', 'R', '3') /* 24 BGR-8-8-8 */ | 281 | #define V4L2_PIX_FMT_BGR24 v4l2_fourcc('B', 'G', 'R', '3') /* 24 BGR-8-8-8 */ |
| 281 | #define V4L2_PIX_FMT_RGB24 v4l2_fourcc('R', 'G', 'B', '3') /* 24 RGB-8-8-8 */ | 282 | #define V4L2_PIX_FMT_RGB24 v4l2_fourcc('R', 'G', 'B', '3') /* 24 RGB-8-8-8 */ |
| 282 | #define V4L2_PIX_FMT_BGR32 v4l2_fourcc('B', 'G', 'R', '4') /* 32 BGR-8-8-8-8 */ | 283 | #define V4L2_PIX_FMT_BGR32 v4l2_fourcc('B', 'G', 'R', '4') /* 32 BGR-8-8-8-8 */ |
| @@ -362,6 +363,8 @@ struct v4l2_pix_format { | |||
| 362 | #define V4L2_PIX_FMT_OV518 v4l2_fourcc('O', '5', '1', '8') /* ov518 JPEG */ | 363 | #define V4L2_PIX_FMT_OV518 v4l2_fourcc('O', '5', '1', '8') /* ov518 JPEG */ |
| 363 | #define V4L2_PIX_FMT_STV0680 v4l2_fourcc('S', '6', '8', '0') /* stv0680 bayer */ | 364 | #define V4L2_PIX_FMT_STV0680 v4l2_fourcc('S', '6', '8', '0') /* stv0680 bayer */ |
| 364 | #define V4L2_PIX_FMT_TM6000 v4l2_fourcc('T', 'M', '6', '0') /* tm5600/tm60x0 */ | 365 | #define V4L2_PIX_FMT_TM6000 v4l2_fourcc('T', 'M', '6', '0') /* tm5600/tm60x0 */ |
| 366 | #define V4L2_PIX_FMT_CIT_YYVYUY v4l2_fourcc('C', 'I', 'T', 'V') /* one line of Y then 1 line of VYUY */ | ||
| 367 | #define V4L2_PIX_FMT_KONICA420 v4l2_fourcc('K', 'O', 'N', 'I') /* YUV420 planar in blocks of 256 pixels */ | ||
| 365 | 368 | ||
| 366 | /* | 369 | /* |
| 367 | * F O R M A T E N U M E R A T I O N | 370 | * F O R M A T E N U M E R A T I O N |
| @@ -1044,8 +1047,11 @@ enum v4l2_colorfx { | |||
| 1044 | 1047 | ||
| 1045 | #define V4L2_CID_CHROMA_GAIN (V4L2_CID_BASE+36) | 1048 | #define V4L2_CID_CHROMA_GAIN (V4L2_CID_BASE+36) |
| 1046 | 1049 | ||
| 1050 | #define V4L2_CID_ILLUMINATORS_1 (V4L2_CID_BASE+37) | ||
| 1051 | #define V4L2_CID_ILLUMINATORS_2 (V4L2_CID_BASE+38) | ||
| 1052 | |||
| 1047 | /* last CID + 1 */ | 1053 | /* last CID + 1 */ |
| 1048 | #define V4L2_CID_LASTP1 (V4L2_CID_BASE+37) | 1054 | #define V4L2_CID_LASTP1 (V4L2_CID_BASE+39) |
| 1049 | 1055 | ||
| 1050 | /* MPEG-class control IDs defined by V4L2 */ | 1056 | /* MPEG-class control IDs defined by V4L2 */ |
| 1051 | #define V4L2_CID_MPEG_BASE (V4L2_CTRL_CLASS_MPEG | 0x900) | 1057 | #define V4L2_CID_MPEG_BASE (V4L2_CTRL_CLASS_MPEG | 0x900) |
| @@ -1362,6 +1368,8 @@ struct v4l2_modulator { | |||
| 1362 | #define V4L2_TUNER_CAP_SAP 0x0020 | 1368 | #define V4L2_TUNER_CAP_SAP 0x0020 |
| 1363 | #define V4L2_TUNER_CAP_LANG1 0x0040 | 1369 | #define V4L2_TUNER_CAP_LANG1 0x0040 |
| 1364 | #define V4L2_TUNER_CAP_RDS 0x0080 | 1370 | #define V4L2_TUNER_CAP_RDS 0x0080 |
| 1371 | #define V4L2_TUNER_CAP_RDS_BLOCK_IO 0x0100 | ||
| 1372 | #define V4L2_TUNER_CAP_RDS_CONTROLS 0x0200 | ||
| 1365 | 1373 | ||
| 1366 | /* Flags for the 'rxsubchans' field */ | 1374 | /* Flags for the 'rxsubchans' field */ |
| 1367 | #define V4L2_TUNER_SUB_MONO 0x0001 | 1375 | #define V4L2_TUNER_SUB_MONO 0x0001 |
| @@ -1391,7 +1399,8 @@ struct v4l2_hw_freq_seek { | |||
| 1391 | enum v4l2_tuner_type type; | 1399 | enum v4l2_tuner_type type; |
| 1392 | __u32 seek_upward; | 1400 | __u32 seek_upward; |
| 1393 | __u32 wrap_around; | 1401 | __u32 wrap_around; |
| 1394 | __u32 reserved[8]; | 1402 | __u32 spacing; |
| 1403 | __u32 reserved[7]; | ||
| 1395 | }; | 1404 | }; |
| 1396 | 1405 | ||
| 1397 | /* | 1406 | /* |
diff --git a/include/linux/videotext.h b/include/linux/videotext.h deleted file mode 100644 index 3e68c8d1c7f7..000000000000 --- a/include/linux/videotext.h +++ /dev/null | |||
| @@ -1,125 +0,0 @@ | |||
| 1 | #ifndef _VTX_H | ||
| 2 | #define _VTX_H | ||
| 3 | |||
| 4 | /* | ||
| 5 | * Teletext (=Videotext) hardware decoders using interface /dev/vtx | ||
| 6 | * Do not confuse with drivers using /dev/vbi which decode videotext by software | ||
| 7 | * | ||
| 8 | * Videotext IOCTLs changed in order to use _IO() macros defined in <linux/ioctl.h>, | ||
| 9 | * unused tuner IOCTLs cleaned up by | ||
| 10 | * Michael Geng <linux@MichaelGeng.de> | ||
| 11 | * | ||
| 12 | * Copyright (c) 1994-97 Martin Buck <martin-2.buck@student.uni-ulm.de> | ||
| 13 | * Read COPYING for more information | ||
| 14 | * | ||
| 15 | */ | ||
| 16 | |||
| 17 | |||
| 18 | /* | ||
| 19 | * Videotext ioctls | ||
| 20 | */ | ||
| 21 | #define VTXIOCGETINFO _IOR (0x81, 1, vtx_info_t) | ||
| 22 | #define VTXIOCCLRPAGE _IOW (0x81, 2, vtx_pagereq_t) | ||
| 23 | #define VTXIOCCLRFOUND _IOW (0x81, 3, vtx_pagereq_t) | ||
| 24 | #define VTXIOCPAGEREQ _IOW (0x81, 4, vtx_pagereq_t) | ||
| 25 | #define VTXIOCGETSTAT _IOW (0x81, 5, vtx_pagereq_t) | ||
| 26 | #define VTXIOCGETPAGE _IOW (0x81, 6, vtx_pagereq_t) | ||
| 27 | #define VTXIOCSTOPDAU _IOW (0x81, 7, vtx_pagereq_t) | ||
| 28 | #define VTXIOCPUTPAGE _IO (0x81, 8) | ||
| 29 | #define VTXIOCSETDISP _IO (0x81, 9) | ||
| 30 | #define VTXIOCPUTSTAT _IO (0x81, 10) | ||
| 31 | #define VTXIOCCLRCACHE _IO (0x81, 11) | ||
| 32 | #define VTXIOCSETVIRT _IOW (0x81, 12, long) | ||
| 33 | |||
| 34 | /* for compatibility, will go away some day */ | ||
| 35 | #define VTXIOCGETINFO_OLD 0x7101 /* get version of driver & capabilities of vtx-chipset */ | ||
| 36 | #define VTXIOCCLRPAGE_OLD 0x7102 /* clear page-buffer */ | ||
| 37 | #define VTXIOCCLRFOUND_OLD 0x7103 /* clear bits indicating that page was found */ | ||
| 38 | #define VTXIOCPAGEREQ_OLD 0x7104 /* search for page */ | ||
| 39 | #define VTXIOCGETSTAT_OLD 0x7105 /* get status of page-buffer */ | ||
| 40 | #define VTXIOCGETPAGE_OLD 0x7106 /* get contents of page-buffer */ | ||
| 41 | #define VTXIOCSTOPDAU_OLD 0x7107 /* stop data acquisition unit */ | ||
| 42 | #define VTXIOCPUTPAGE_OLD 0x7108 /* display page on TV-screen */ | ||
| 43 | #define VTXIOCSETDISP_OLD 0x7109 /* set TV-mode */ | ||
| 44 | #define VTXIOCPUTSTAT_OLD 0x710a /* set status of TV-output-buffer */ | ||
| 45 | #define VTXIOCCLRCACHE_OLD 0x710b /* clear cache on VTX-interface (if avail.) */ | ||
| 46 | #define VTXIOCSETVIRT_OLD 0x710c /* turn on virtual mode (this disables TV-display) */ | ||
| 47 | |||
| 48 | /* | ||
| 49 | * Definitions for VTXIOCGETINFO | ||
| 50 | */ | ||
| 51 | |||
| 52 | #define SAA5243 0 | ||
| 53 | #define SAA5246 1 | ||
| 54 | #define SAA5249 2 | ||
| 55 | #define SAA5248 3 | ||
| 56 | #define XSTV5346 4 | ||
| 57 | |||
| 58 | typedef struct { | ||
| 59 | int version_major, version_minor; /* version of driver; if version_major changes, driver */ | ||
| 60 | /* is not backward compatible!!! CHECK THIS!!! */ | ||
| 61 | int numpages; /* number of page-buffers of vtx-chipset */ | ||
| 62 | int cct_type; /* type of vtx-chipset (SAA5243, SAA5246, SAA5248 or | ||
| 63 | * SAA5249) */ | ||
| 64 | } | ||
| 65 | vtx_info_t; | ||
| 66 | |||
| 67 | |||
| 68 | /* | ||
| 69 | * Definitions for VTXIOC{CLRPAGE,CLRFOUND,PAGEREQ,GETSTAT,GETPAGE,STOPDAU,PUTPAGE,SETDISP} | ||
| 70 | */ | ||
| 71 | |||
| 72 | #define MIN_UNIT (1<<0) | ||
| 73 | #define MIN_TEN (1<<1) | ||
| 74 | #define HR_UNIT (1<<2) | ||
| 75 | #define HR_TEN (1<<3) | ||
| 76 | #define PG_UNIT (1<<4) | ||
| 77 | #define PG_TEN (1<<5) | ||
| 78 | #define PG_HUND (1<<6) | ||
| 79 | #define PGMASK_MAX (1<<7) | ||
| 80 | #define PGMASK_PAGE (PG_HUND | PG_TEN | PG_UNIT) | ||
| 81 | #define PGMASK_HOUR (HR_TEN | HR_UNIT) | ||
| 82 | #define PGMASK_MINUTE (MIN_TEN | MIN_UNIT) | ||
| 83 | |||
| 84 | typedef struct | ||
| 85 | { | ||
| 86 | int page; /* number of requested page (hexadecimal) */ | ||
| 87 | int hour; /* requested hour (hexadecimal) */ | ||
| 88 | int minute; /* requested minute (hexadecimal) */ | ||
| 89 | int pagemask; /* mask defining which values of the above are set */ | ||
| 90 | int pgbuf; /* buffer where page will be stored */ | ||
| 91 | int start; /* start of requested part of page */ | ||
| 92 | int end; /* end of requested part of page */ | ||
| 93 | void __user *buffer; /* pointer to beginning of destination buffer */ | ||
| 94 | } | ||
| 95 | vtx_pagereq_t; | ||
| 96 | |||
| 97 | |||
| 98 | /* | ||
| 99 | * Definitions for VTXIOC{GETSTAT,PUTSTAT} | ||
| 100 | */ | ||
| 101 | |||
| 102 | #define VTX_PAGESIZE (40 * 24) | ||
| 103 | #define VTX_VIRTUALSIZE (40 * 49) | ||
| 104 | |||
| 105 | typedef struct | ||
| 106 | { | ||
| 107 | int pagenum; /* number of page (hexadecimal) */ | ||
| 108 | int hour; /* hour (hexadecimal) */ | ||
| 109 | int minute; /* minute (hexadecimal) */ | ||
| 110 | int charset; /* national charset */ | ||
| 111 | unsigned delete : 1; /* delete page (C4) */ | ||
| 112 | unsigned headline : 1; /* insert headline (C5) */ | ||
| 113 | unsigned subtitle : 1; /* insert subtitle (C6) */ | ||
| 114 | unsigned supp_header : 1; /* suppress header (C7) */ | ||
| 115 | unsigned update : 1; /* update page (C8) */ | ||
| 116 | unsigned inter_seq : 1; /* interrupted sequence (C9) */ | ||
| 117 | unsigned dis_disp : 1; /* disable/suppress display (C10) */ | ||
| 118 | unsigned serial : 1; /* serial mode (C11) */ | ||
| 119 | unsigned notfound : 1; /* /FOUND */ | ||
| 120 | unsigned pblf : 1; /* PBLF */ | ||
| 121 | unsigned hamming : 1; /* hamming-error occurred */ | ||
| 122 | } | ||
| 123 | vtx_pageinfo_t; | ||
| 124 | |||
| 125 | #endif /* _VTX_H */ | ||
diff --git a/include/linux/virtio_9p.h b/include/linux/virtio_9p.h index 5cf11765146b..e68b439b2860 100644 --- a/include/linux/virtio_9p.h +++ b/include/linux/virtio_9p.h | |||
| @@ -2,6 +2,7 @@ | |||
| 2 | #define _LINUX_VIRTIO_9P_H | 2 | #define _LINUX_VIRTIO_9P_H |
| 3 | /* This header is BSD licensed so anyone can use the definitions to implement | 3 | /* This header is BSD licensed so anyone can use the definitions to implement |
| 4 | * compatible drivers/servers. */ | 4 | * compatible drivers/servers. */ |
| 5 | #include <linux/types.h> | ||
| 5 | #include <linux/virtio_ids.h> | 6 | #include <linux/virtio_ids.h> |
| 6 | #include <linux/virtio_config.h> | 7 | #include <linux/virtio_config.h> |
| 7 | 8 | ||
diff --git a/include/linux/vmalloc.h b/include/linux/vmalloc.h index 227c2a585e4f..a03dcf62ca9d 100644 --- a/include/linux/vmalloc.h +++ b/include/linux/vmalloc.h | |||
| @@ -7,6 +7,8 @@ | |||
| 7 | 7 | ||
| 8 | struct vm_area_struct; /* vma defining user mapping in mm_types.h */ | 8 | struct vm_area_struct; /* vma defining user mapping in mm_types.h */ |
| 9 | 9 | ||
| 10 | extern bool vmap_lazy_unmap; | ||
| 11 | |||
| 10 | /* bits in flags of vmalloc's vm_struct below */ | 12 | /* bits in flags of vmalloc's vm_struct below */ |
| 11 | #define VM_IOREMAP 0x00000001 /* ioremap() and friends */ | 13 | #define VM_IOREMAP 0x00000001 /* ioremap() and friends */ |
| 12 | #define VM_ALLOC 0x00000002 /* vmalloc() */ | 14 | #define VM_ALLOC 0x00000002 /* vmalloc() */ |
| @@ -30,7 +32,7 @@ struct vm_struct { | |||
| 30 | unsigned long flags; | 32 | unsigned long flags; |
| 31 | struct page **pages; | 33 | struct page **pages; |
| 32 | unsigned int nr_pages; | 34 | unsigned int nr_pages; |
| 33 | unsigned long phys_addr; | 35 | phys_addr_t phys_addr; |
| 34 | void *caller; | 36 | void *caller; |
| 35 | }; | 37 | }; |
| 36 | 38 | ||
| @@ -51,8 +53,10 @@ static inline void vmalloc_init(void) | |||
| 51 | #endif | 53 | #endif |
| 52 | 54 | ||
| 53 | extern void *vmalloc(unsigned long size); | 55 | extern void *vmalloc(unsigned long size); |
| 56 | extern void *vzalloc(unsigned long size); | ||
| 54 | extern void *vmalloc_user(unsigned long size); | 57 | extern void *vmalloc_user(unsigned long size); |
| 55 | extern void *vmalloc_node(unsigned long size, int node); | 58 | extern void *vmalloc_node(unsigned long size, int node); |
| 59 | extern void *vzalloc_node(unsigned long size, int node); | ||
| 56 | extern void *vmalloc_exec(unsigned long size); | 60 | extern void *vmalloc_exec(unsigned long size); |
| 57 | extern void *vmalloc_32(unsigned long size); | 61 | extern void *vmalloc_32(unsigned long size); |
| 58 | extern void *vmalloc_32_user(unsigned long size); | 62 | extern void *vmalloc_32_user(unsigned long size); |
| @@ -115,10 +119,12 @@ extern rwlock_t vmlist_lock; | |||
| 115 | extern struct vm_struct *vmlist; | 119 | extern struct vm_struct *vmlist; |
| 116 | extern __init void vm_area_register_early(struct vm_struct *vm, size_t align); | 120 | extern __init void vm_area_register_early(struct vm_struct *vm, size_t align); |
| 117 | 121 | ||
| 122 | #ifdef CONFIG_SMP | ||
| 118 | struct vm_struct **pcpu_get_vm_areas(const unsigned long *offsets, | 123 | struct vm_struct **pcpu_get_vm_areas(const unsigned long *offsets, |
| 119 | const size_t *sizes, int nr_vms, | 124 | const size_t *sizes, int nr_vms, |
| 120 | size_t align, gfp_t gfp_mask); | 125 | size_t align, gfp_t gfp_mask); |
| 121 | 126 | ||
| 122 | void pcpu_free_vm_areas(struct vm_struct **vms, int nr_vms); | 127 | void pcpu_free_vm_areas(struct vm_struct **vms, int nr_vms); |
| 128 | #endif | ||
| 123 | 129 | ||
| 124 | #endif /* _LINUX_VMALLOC_H */ | 130 | #endif /* _LINUX_VMALLOC_H */ |
diff --git a/include/linux/vmstat.h b/include/linux/vmstat.h index 7f43ccdc1d38..eaaea37b3b75 100644 --- a/include/linux/vmstat.h +++ b/include/linux/vmstat.h | |||
| @@ -170,6 +170,28 @@ static inline unsigned long zone_page_state(struct zone *zone, | |||
| 170 | return x; | 170 | return x; |
| 171 | } | 171 | } |
| 172 | 172 | ||
| 173 | /* | ||
| 174 | * More accurate version that also considers the currently pending | ||
| 175 | * deltas. For that we need to loop over all cpus to find the current | ||
| 176 | * deltas. There is no synchronization so the result cannot be | ||
| 177 | * exactly accurate either. | ||
| 178 | */ | ||
| 179 | static inline unsigned long zone_page_state_snapshot(struct zone *zone, | ||
| 180 | enum zone_stat_item item) | ||
| 181 | { | ||
| 182 | long x = atomic_long_read(&zone->vm_stat[item]); | ||
| 183 | |||
| 184 | #ifdef CONFIG_SMP | ||
| 185 | int cpu; | ||
| 186 | for_each_online_cpu(cpu) | ||
| 187 | x += per_cpu_ptr(zone->pageset, cpu)->vm_stat_diff[item]; | ||
| 188 | |||
| 189 | if (x < 0) | ||
| 190 | x = 0; | ||
| 191 | #endif | ||
| 192 | return x; | ||
| 193 | } | ||
| 194 | |||
| 173 | extern unsigned long global_reclaimable_pages(void); | 195 | extern unsigned long global_reclaimable_pages(void); |
| 174 | extern unsigned long zone_reclaimable_pages(struct zone *zone); | 196 | extern unsigned long zone_reclaimable_pages(struct zone *zone); |
| 175 | 197 | ||
diff --git a/include/linux/vt_kern.h b/include/linux/vt_kern.h index 7f56db4a79f0..6625cc1ab758 100644 --- a/include/linux/vt_kern.h +++ b/include/linux/vt_kern.h | |||
| @@ -76,17 +76,52 @@ int con_copy_unimap(struct vc_data *dst_vc, struct vc_data *src_vc); | |||
| 76 | #define vc_translate(vc, c) ((vc)->vc_translate[(c) | \ | 76 | #define vc_translate(vc, c) ((vc)->vc_translate[(c) | \ |
| 77 | ((vc)->vc_toggle_meta ? 0x80 : 0)]) | 77 | ((vc)->vc_toggle_meta ? 0x80 : 0)]) |
| 78 | #else | 78 | #else |
| 79 | #define con_set_trans_old(arg) (0) | 79 | static inline int con_set_trans_old(unsigned char __user *table) |
| 80 | #define con_get_trans_old(arg) (-EINVAL) | 80 | { |
| 81 | #define con_set_trans_new(arg) (0) | 81 | return 0; |
| 82 | #define con_get_trans_new(arg) (-EINVAL) | 82 | } |
| 83 | #define con_clear_unimap(vc, ui) (0) | 83 | static inline int con_get_trans_old(unsigned char __user *table) |
| 84 | #define con_set_unimap(vc, ct, list) (0) | 84 | { |
| 85 | #define con_set_default_unimap(vc) (0) | 85 | return -EINVAL; |
| 86 | #define con_copy_unimap(d, s) (0) | 86 | } |
| 87 | #define con_get_unimap(vc, ct, uct, list) (-EINVAL) | 87 | static inline int con_set_trans_new(unsigned short __user *table) |
| 88 | #define con_free_unimap(vc) do { ; } while (0) | 88 | { |
| 89 | #define con_protect_unimap(vc, rdonly) do { ; } while (0) | 89 | return 0; |
| 90 | } | ||
| 91 | static inline int con_get_trans_new(unsigned short __user *table) | ||
| 92 | { | ||
| 93 | return -EINVAL; | ||
| 94 | } | ||
| 95 | static inline int con_clear_unimap(struct vc_data *vc, struct unimapinit *ui) | ||
| 96 | { | ||
| 97 | return 0; | ||
| 98 | } | ||
| 99 | static inline | ||
| 100 | int con_set_unimap(struct vc_data *vc, ushort ct, struct unipair __user *list) | ||
| 101 | { | ||
| 102 | return 0; | ||
| 103 | } | ||
| 104 | static inline | ||
| 105 | int con_get_unimap(struct vc_data *vc, ushort ct, ushort __user *uct, | ||
| 106 | struct unipair __user *list) | ||
| 107 | { | ||
| 108 | return -EINVAL; | ||
| 109 | } | ||
| 110 | static inline int con_set_default_unimap(struct vc_data *vc) | ||
| 111 | { | ||
| 112 | return 0; | ||
| 113 | } | ||
| 114 | static inline void con_free_unimap(struct vc_data *vc) | ||
| 115 | { | ||
| 116 | } | ||
| 117 | static inline void con_protect_unimap(struct vc_data *vc, int rdonly) | ||
| 118 | { | ||
| 119 | } | ||
| 120 | static inline | ||
| 121 | int con_copy_unimap(struct vc_data *dst_vc, struct vc_data *src_vc) | ||
| 122 | { | ||
| 123 | return 0; | ||
| 124 | } | ||
| 90 | 125 | ||
| 91 | #define vc_translate(vc, c) (c) | 126 | #define vc_translate(vc, c) (c) |
| 92 | #endif | 127 | #endif |
| @@ -100,6 +135,13 @@ extern int unbind_con_driver(const struct consw *csw, int first, int last, | |||
| 100 | int deflt); | 135 | int deflt); |
| 101 | int vty_init(const struct file_operations *console_fops); | 136 | int vty_init(const struct file_operations *console_fops); |
| 102 | 137 | ||
| 138 | static inline bool vt_force_oops_output(struct vc_data *vc) | ||
| 139 | { | ||
| 140 | if (oops_in_progress && vc->vc_panic_force_write) | ||
| 141 | return true; | ||
| 142 | return false; | ||
| 143 | } | ||
| 144 | |||
| 103 | /* | 145 | /* |
| 104 | * vc_screen.c shares this temporary buffer with the console write code so that | 146 | * vc_screen.c shares this temporary buffer with the console write code so that |
| 105 | * we can easily avoid touching user space while holding the console spinlock. | 147 | * we can easily avoid touching user space while holding the console spinlock. |
diff --git a/include/linux/wait.h b/include/linux/wait.h index 0836ccc57121..3efc9f3f43a0 100644 --- a/include/linux/wait.h +++ b/include/linux/wait.h | |||
| @@ -614,6 +614,7 @@ int wake_bit_function(wait_queue_t *wait, unsigned mode, int sync, void *key); | |||
| 614 | (wait)->private = current; \ | 614 | (wait)->private = current; \ |
| 615 | (wait)->func = autoremove_wake_function; \ | 615 | (wait)->func = autoremove_wake_function; \ |
| 616 | INIT_LIST_HEAD(&(wait)->task_list); \ | 616 | INIT_LIST_HEAD(&(wait)->task_list); \ |
| 617 | (wait)->flags = 0; \ | ||
| 617 | } while (0) | 618 | } while (0) |
| 618 | 619 | ||
| 619 | /** | 620 | /** |
diff --git a/include/linux/wireless.h b/include/linux/wireless.h index e6827eedf18b..4395b28bb86c 100644 --- a/include/linux/wireless.h +++ b/include/linux/wireless.h | |||
| @@ -1157,6 +1157,6 @@ struct __compat_iw_event { | |||
| 1157 | #define IW_EV_PARAM_PK_LEN (IW_EV_LCP_PK_LEN + sizeof(struct iw_param)) | 1157 | #define IW_EV_PARAM_PK_LEN (IW_EV_LCP_PK_LEN + sizeof(struct iw_param)) |
| 1158 | #define IW_EV_ADDR_PK_LEN (IW_EV_LCP_PK_LEN + sizeof(struct sockaddr)) | 1158 | #define IW_EV_ADDR_PK_LEN (IW_EV_LCP_PK_LEN + sizeof(struct sockaddr)) |
| 1159 | #define IW_EV_QUAL_PK_LEN (IW_EV_LCP_PK_LEN + sizeof(struct iw_quality)) | 1159 | #define IW_EV_QUAL_PK_LEN (IW_EV_LCP_PK_LEN + sizeof(struct iw_quality)) |
| 1160 | #define IW_EV_POINT_PK_LEN (IW_EV_LCP_LEN + 4) | 1160 | #define IW_EV_POINT_PK_LEN (IW_EV_LCP_PK_LEN + 4) |
| 1161 | 1161 | ||
| 1162 | #endif /* _LINUX_WIRELESS_H */ | 1162 | #endif /* _LINUX_WIRELESS_H */ |
diff --git a/include/linux/spi/wl12xx.h b/include/linux/wl12xx.h index a223ecbc71ef..4f902e1908aa 100644 --- a/include/linux/spi/wl12xx.h +++ b/include/linux/wl12xx.h | |||
| @@ -3,7 +3,7 @@ | |||
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2009 Nokia Corporation | 4 | * Copyright (C) 2009 Nokia Corporation |
| 5 | * | 5 | * |
| 6 | * Contact: Kalle Valo <kalle.valo@nokia.com> | 6 | * Contact: Luciano Coelho <luciano.coelho@nokia.com> |
| 7 | * | 7 | * |
| 8 | * This program is free software; you can redistribute it and/or | 8 | * This program is free software; you can redistribute it and/or |
| 9 | * modify it under the terms of the GNU General Public License | 9 | * modify it under the terms of the GNU General Public License |
| @@ -21,14 +21,31 @@ | |||
| 21 | * | 21 | * |
| 22 | */ | 22 | */ |
| 23 | 23 | ||
| 24 | #ifndef _LINUX_SPI_WL12XX_H | 24 | #ifndef _LINUX_WL12XX_H |
| 25 | #define _LINUX_SPI_WL12XX_H | 25 | #define _LINUX_WL12XX_H |
| 26 | 26 | ||
| 27 | struct wl12xx_platform_data { | 27 | struct wl12xx_platform_data { |
| 28 | void (*set_power)(bool enable); | 28 | void (*set_power)(bool enable); |
| 29 | /* SDIO only: IRQ number if WLAN_IRQ line is used, 0 for SDIO IRQs */ | 29 | /* SDIO only: IRQ number if WLAN_IRQ line is used, 0 for SDIO IRQs */ |
| 30 | int irq; | 30 | int irq; |
| 31 | bool use_eeprom; | 31 | bool use_eeprom; |
| 32 | int board_ref_clock; | ||
| 32 | }; | 33 | }; |
| 33 | 34 | ||
| 35 | #ifdef CONFIG_WL12XX_PLATFORM_DATA | ||
| 36 | |||
| 37 | int wl12xx_set_platform_data(const struct wl12xx_platform_data *data); | ||
| 38 | |||
| 39 | #else | ||
| 40 | |||
| 41 | static inline | ||
| 42 | int wl12xx_set_platform_data(const struct wl12xx_platform_data *data) | ||
| 43 | { | ||
| 44 | return -ENOSYS; | ||
| 45 | } | ||
| 46 | |||
| 47 | #endif | ||
| 48 | |||
| 49 | const struct wl12xx_platform_data *wl12xx_get_platform_data(void); | ||
| 50 | |||
| 34 | #endif | 51 | #endif |
diff --git a/include/linux/wlp.h b/include/linux/wlp.h deleted file mode 100644 index ac95ce6606ac..000000000000 --- a/include/linux/wlp.h +++ /dev/null | |||
| @@ -1,736 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * WiMedia Logical Link Control Protocol (WLP) | ||
| 3 | * | ||
| 4 | * Copyright (C) 2005-2006 Intel Corporation | ||
| 5 | * Reinette Chatre <reinette.chatre@intel.com> | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or | ||
| 8 | * modify it under the terms of the GNU General Public License version | ||
| 9 | * 2 as published by the Free Software Foundation. | ||
| 10 | * | ||
| 11 | * This program is distributed in the hope that it will be useful, | ||
| 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 14 | * GNU General Public License for more details. | ||
| 15 | * | ||
| 16 | * You should have received a copy of the GNU General Public License | ||
| 17 | * along with this program; if not, write to the Free Software | ||
| 18 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA | ||
| 19 | * 02110-1301, USA. | ||
| 20 | * | ||
| 21 | * | ||
| 22 | * FIXME: docs | ||
| 23 | * | ||
| 24 | * - Does not (yet) include support for WLP control frames | ||
| 25 | * WLP Draft 0.99 [6.5]. | ||
| 26 | * | ||
| 27 | * A visual representation of the data structures. | ||
| 28 | * | ||
| 29 | * wssidB wssidB | ||
| 30 | * ^ ^ | ||
| 31 | * | | | ||
| 32 | * wssidA wssidA | ||
| 33 | * wlp interface { ^ ^ | ||
| 34 | * ... | | | ||
| 35 | * ... ... wssid wssid ... | ||
| 36 | * wlp --- ... | | | ||
| 37 | * }; neighbors --> neighbA --> neighbB | ||
| 38 | * ... | ||
| 39 | * wss | ||
| 40 | * ... | ||
| 41 | * eda cache --> neighborA --> neighborB --> neighborC ... | ||
| 42 | */ | ||
| 43 | |||
| 44 | #ifndef __LINUX__WLP_H_ | ||
| 45 | #define __LINUX__WLP_H_ | ||
| 46 | |||
| 47 | #include <linux/netdevice.h> | ||
| 48 | #include <linux/skbuff.h> | ||
| 49 | #include <linux/list.h> | ||
| 50 | #include <linux/uwb.h> | ||
| 51 | |||
| 52 | /** | ||
| 53 | * WLP Protocol ID | ||
| 54 | * WLP Draft 0.99 [6.2] | ||
| 55 | * | ||
| 56 | * The MUX header for all WLP frames | ||
| 57 | */ | ||
| 58 | #define WLP_PROTOCOL_ID 0x0100 | ||
| 59 | |||
| 60 | /** | ||
| 61 | * WLP Version | ||
| 62 | * WLP version placed in the association frames (WLP 0.99 [6.6]) | ||
| 63 | */ | ||
| 64 | #define WLP_VERSION 0x10 | ||
| 65 | |||
| 66 | /** | ||
| 67 | * Bytes needed to print UUID as string | ||
| 68 | */ | ||
| 69 | #define WLP_WSS_UUID_STRSIZE 48 | ||
| 70 | |||
| 71 | /** | ||
| 72 | * Bytes needed to print nonce as string | ||
| 73 | */ | ||
| 74 | #define WLP_WSS_NONCE_STRSIZE 48 | ||
| 75 | |||
| 76 | |||
| 77 | /** | ||
| 78 | * Size used for WLP name size | ||
| 79 | * | ||
| 80 | * The WSS name is set to 65 bytes, 1 byte larger than the maximum | ||
| 81 | * allowed by the WLP spec. This is to have a null terminated string | ||
| 82 | * for display to the user. A maximum of 64 bytes will still be used | ||
| 83 | * when placing the WSS name field in association frames. | ||
| 84 | */ | ||
| 85 | #define WLP_WSS_NAME_SIZE 65 | ||
| 86 | |||
| 87 | /** | ||
| 88 | * Number of bytes added by WLP to data frame | ||
| 89 | * | ||
| 90 | * A data frame transmitted from a host will be placed in a Standard or | ||
| 91 | * Abbreviated WLP frame. These have an extra 4 bytes of header (struct | ||
| 92 | * wlp_frame_std_abbrv_hdr). | ||
| 93 | * When the stack sends this data frame for transmission it needs to ensure | ||
| 94 | * there is enough headroom for this header. | ||
| 95 | */ | ||
| 96 | #define WLP_DATA_HLEN 4 | ||
| 97 | |||
| 98 | /** | ||
| 99 | * State of device regarding WLP Service Set | ||
| 100 | * | ||
| 101 | * WLP_WSS_STATE_NONE: the host does not participate in any WSS | ||
| 102 | * WLP_WSS_STATE_PART_ENROLLED: used as part of the enrollment sequence | ||
| 103 | * ("Partial Enroll"). This state is used to | ||
| 104 | * indicate the first part of enrollment that is | ||
| 105 | * unsecure. If the WSS is unsecure then the | ||
| 106 | * state will promptly go to WLP_WSS_STATE_ENROLLED, | ||
| 107 | * if the WSS is not secure then the enrollment | ||
| 108 | * procedure is a few more steps before we are | ||
| 109 | * enrolled. | ||
| 110 | * WLP_WSS_STATE_ENROLLED: the host is enrolled in a WSS | ||
| 111 | * WLP_WSS_STATE_ACTIVE: WSS is activated | ||
| 112 | * WLP_WSS_STATE_CONNECTED: host is connected to neighbor in WSS | ||
| 113 | * | ||
| 114 | */ | ||
| 115 | enum wlp_wss_state { | ||
| 116 | WLP_WSS_STATE_NONE = 0, | ||
| 117 | WLP_WSS_STATE_PART_ENROLLED, | ||
| 118 | WLP_WSS_STATE_ENROLLED, | ||
| 119 | WLP_WSS_STATE_ACTIVE, | ||
| 120 | WLP_WSS_STATE_CONNECTED, | ||
| 121 | }; | ||
| 122 | |||
| 123 | /** | ||
| 124 | * WSS Secure status | ||
| 125 | * WLP 0.99 Table 6 | ||
| 126 | * | ||
| 127 | * Set to one if the WSS is secure, zero if it is not secure | ||
| 128 | */ | ||
| 129 | enum wlp_wss_sec_status { | ||
| 130 | WLP_WSS_UNSECURE = 0, | ||
| 131 | WLP_WSS_SECURE, | ||
| 132 | }; | ||
| 133 | |||
| 134 | /** | ||
| 135 | * WLP frame type | ||
| 136 | * WLP Draft 0.99 [6.2 Table 1] | ||
| 137 | */ | ||
| 138 | enum wlp_frame_type { | ||
| 139 | WLP_FRAME_STANDARD = 0, | ||
| 140 | WLP_FRAME_ABBREVIATED, | ||
| 141 | WLP_FRAME_CONTROL, | ||
| 142 | WLP_FRAME_ASSOCIATION, | ||
| 143 | }; | ||
| 144 | |||
| 145 | /** | ||
| 146 | * WLP Association Message Type | ||
| 147 | * WLP Draft 0.99 [6.6.1.2 Table 8] | ||
| 148 | */ | ||
| 149 | enum wlp_assoc_type { | ||
| 150 | WLP_ASSOC_D1 = 2, | ||
| 151 | WLP_ASSOC_D2 = 3, | ||
| 152 | WLP_ASSOC_M1 = 4, | ||
| 153 | WLP_ASSOC_M2 = 5, | ||
| 154 | WLP_ASSOC_M3 = 7, | ||
| 155 | WLP_ASSOC_M4 = 8, | ||
| 156 | WLP_ASSOC_M5 = 9, | ||
| 157 | WLP_ASSOC_M6 = 10, | ||
| 158 | WLP_ASSOC_M7 = 11, | ||
| 159 | WLP_ASSOC_M8 = 12, | ||
| 160 | WLP_ASSOC_F0 = 14, | ||
| 161 | WLP_ASSOC_E1 = 32, | ||
| 162 | WLP_ASSOC_E2 = 33, | ||
| 163 | WLP_ASSOC_C1 = 34, | ||
| 164 | WLP_ASSOC_C2 = 35, | ||
| 165 | WLP_ASSOC_C3 = 36, | ||
| 166 | WLP_ASSOC_C4 = 37, | ||
| 167 | }; | ||
| 168 | |||
| 169 | /** | ||
| 170 | * WLP Attribute Type | ||
| 171 | * WLP Draft 0.99 [6.6.1 Table 6] | ||
| 172 | */ | ||
| 173 | enum wlp_attr_type { | ||
| 174 | WLP_ATTR_AUTH = 0x1005, /* Authenticator */ | ||
| 175 | WLP_ATTR_DEV_NAME = 0x1011, /* Device Name */ | ||
| 176 | WLP_ATTR_DEV_PWD_ID = 0x1012, /* Device Password ID */ | ||
| 177 | WLP_ATTR_E_HASH1 = 0x1014, /* E-Hash1 */ | ||
| 178 | WLP_ATTR_E_HASH2 = 0x1015, /* E-Hash2 */ | ||
| 179 | WLP_ATTR_E_SNONCE1 = 0x1016, /* E-SNonce1 */ | ||
| 180 | WLP_ATTR_E_SNONCE2 = 0x1017, /* E-SNonce2 */ | ||
| 181 | WLP_ATTR_ENCR_SET = 0x1018, /* Encrypted Settings */ | ||
| 182 | WLP_ATTR_ENRL_NONCE = 0x101A, /* Enrollee Nonce */ | ||
| 183 | WLP_ATTR_KEYWRAP_AUTH = 0x101E, /* Key Wrap Authenticator */ | ||
| 184 | WLP_ATTR_MANUF = 0x1021, /* Manufacturer */ | ||
| 185 | WLP_ATTR_MSG_TYPE = 0x1022, /* Message Type */ | ||
| 186 | WLP_ATTR_MODEL_NAME = 0x1023, /* Model Name */ | ||
| 187 | WLP_ATTR_MODEL_NR = 0x1024, /* Model Number */ | ||
| 188 | WLP_ATTR_PUB_KEY = 0x1032, /* Public Key */ | ||
| 189 | WLP_ATTR_REG_NONCE = 0x1039, /* Registrar Nonce */ | ||
| 190 | WLP_ATTR_R_HASH1 = 0x103D, /* R-Hash1 */ | ||
| 191 | WLP_ATTR_R_HASH2 = 0x103E, /* R-Hash2 */ | ||
| 192 | WLP_ATTR_R_SNONCE1 = 0x103F, /* R-SNonce1 */ | ||
| 193 | WLP_ATTR_R_SNONCE2 = 0x1040, /* R-SNonce2 */ | ||
| 194 | WLP_ATTR_SERIAL = 0x1042, /* Serial number */ | ||
| 195 | WLP_ATTR_UUID_E = 0x1047, /* UUID-E */ | ||
| 196 | WLP_ATTR_UUID_R = 0x1048, /* UUID-R */ | ||
| 197 | WLP_ATTR_PRI_DEV_TYPE = 0x1054, /* Primary Device Type */ | ||
| 198 | WLP_ATTR_SEC_DEV_TYPE = 0x1055, /* Secondary Device Type */ | ||
| 199 | WLP_ATTR_PORT_DEV = 0x1056, /* Portable Device */ | ||
| 200 | WLP_ATTR_APP_EXT = 0x1058, /* Application Extension */ | ||
| 201 | WLP_ATTR_WLP_VER = 0x2000, /* WLP Version */ | ||
| 202 | WLP_ATTR_WSSID = 0x2001, /* WSSID */ | ||
| 203 | WLP_ATTR_WSS_NAME = 0x2002, /* WSS Name */ | ||
| 204 | WLP_ATTR_WSS_SEC_STAT = 0x2003, /* WSS Secure Status */ | ||
| 205 | WLP_ATTR_WSS_BCAST = 0x2004, /* WSS Broadcast Address */ | ||
| 206 | WLP_ATTR_WSS_M_KEY = 0x2005, /* WSS Master Key */ | ||
| 207 | WLP_ATTR_ACC_ENRL = 0x2006, /* Accepting Enrollment */ | ||
| 208 | WLP_ATTR_WSS_INFO = 0x2007, /* WSS Information */ | ||
| 209 | WLP_ATTR_WSS_SEL_MTHD = 0x2008, /* WSS Selection Method */ | ||
| 210 | WLP_ATTR_ASSC_MTHD_LIST = 0x2009, /* Association Methods List */ | ||
| 211 | WLP_ATTR_SEL_ASSC_MTHD = 0x200A, /* Selected Association Method */ | ||
| 212 | WLP_ATTR_ENRL_HASH_COMM = 0x200B, /* Enrollee Hash Commitment */ | ||
| 213 | WLP_ATTR_WSS_TAG = 0x200C, /* WSS Tag */ | ||
| 214 | WLP_ATTR_WSS_VIRT = 0x200D, /* WSS Virtual EUI-48 */ | ||
| 215 | WLP_ATTR_WLP_ASSC_ERR = 0x200E, /* WLP Association Error */ | ||
| 216 | WLP_ATTR_VNDR_EXT = 0x200F, /* Vendor Extension */ | ||
| 217 | }; | ||
| 218 | |||
| 219 | /** | ||
| 220 | * WLP Category ID of primary/secondary device | ||
| 221 | * WLP Draft 0.99 [6.6.1.8 Table 12] | ||
| 222 | */ | ||
| 223 | enum wlp_dev_category_id { | ||
| 224 | WLP_DEV_CAT_COMPUTER = 1, | ||
| 225 | WLP_DEV_CAT_INPUT, | ||
| 226 | WLP_DEV_CAT_PRINT_SCAN_FAX_COPIER, | ||
| 227 | WLP_DEV_CAT_CAMERA, | ||
| 228 | WLP_DEV_CAT_STORAGE, | ||
| 229 | WLP_DEV_CAT_INFRASTRUCTURE, | ||
| 230 | WLP_DEV_CAT_DISPLAY, | ||
| 231 | WLP_DEV_CAT_MULTIM, | ||
| 232 | WLP_DEV_CAT_GAMING, | ||
| 233 | WLP_DEV_CAT_TELEPHONE, | ||
| 234 | WLP_DEV_CAT_OTHER = 65535, | ||
| 235 | }; | ||
| 236 | |||
| 237 | /** | ||
| 238 | * WLP WSS selection method | ||
| 239 | * WLP Draft 0.99 [6.6.1.6 Table 10] | ||
| 240 | */ | ||
| 241 | enum wlp_wss_sel_mthd { | ||
| 242 | WLP_WSS_ENRL_SELECT = 1, /* Enrollee selects */ | ||
| 243 | WLP_WSS_REG_SELECT, /* Registrar selects */ | ||
| 244 | }; | ||
| 245 | |||
| 246 | /** | ||
| 247 | * WLP association error values | ||
| 248 | * WLP Draft 0.99 [6.6.1.5 Table 9] | ||
| 249 | */ | ||
| 250 | enum wlp_assc_error { | ||
| 251 | WLP_ASSOC_ERROR_NONE, | ||
| 252 | WLP_ASSOC_ERROR_AUTH, /* Authenticator Failure */ | ||
| 253 | WLP_ASSOC_ERROR_ROGUE, /* Rogue activity suspected */ | ||
| 254 | WLP_ASSOC_ERROR_BUSY, /* Device busy */ | ||
| 255 | WLP_ASSOC_ERROR_LOCK, /* Setup Locked */ | ||
| 256 | WLP_ASSOC_ERROR_NOT_READY, /* Registrar not ready */ | ||
| 257 | WLP_ASSOC_ERROR_INV, /* Invalid WSS selection */ | ||
| 258 | WLP_ASSOC_ERROR_MSG_TIME, /* Message timeout */ | ||
| 259 | WLP_ASSOC_ERROR_ENR_TIME, /* Enrollment session timeout */ | ||
| 260 | WLP_ASSOC_ERROR_PW, /* Device password invalid */ | ||
| 261 | WLP_ASSOC_ERROR_VER, /* Unsupported version */ | ||
| 262 | WLP_ASSOC_ERROR_INT, /* Internal error */ | ||
| 263 | WLP_ASSOC_ERROR_UNDEF, /* Undefined error */ | ||
| 264 | WLP_ASSOC_ERROR_NUM, /* Numeric comparison failure */ | ||
| 265 | WLP_ASSOC_ERROR_WAIT, /* Waiting for user input */ | ||
| 266 | }; | ||
| 267 | |||
| 268 | /** | ||
| 269 | * WLP Parameters | ||
| 270 | * WLP 0.99 [7.7] | ||
| 271 | */ | ||
| 272 | enum wlp_parameters { | ||
| 273 | WLP_PER_MSG_TIMEOUT = 15, /* Seconds to wait for response to | ||
| 274 | association message. */ | ||
| 275 | }; | ||
| 276 | |||
| 277 | /** | ||
| 278 | * WLP IE | ||
| 279 | * | ||
| 280 | * The WLP IE should be included in beacons by all devices. | ||
| 281 | * | ||
| 282 | * The driver can set only a few of the fields in this information element, | ||
| 283 | * most fields are managed by the device self. When the driver needs to set | ||
| 284 | * a field it will only provide values for the fields of interest, the rest | ||
| 285 | * will be filled with zeroes. The fields of interest are: | ||
| 286 | * | ||
| 287 | * Element ID | ||
| 288 | * Length | ||
| 289 | * Capabilities (only to include WSSID Hash list length) | ||
| 290 | * WSSID Hash List fields | ||
| 291 | * | ||
| 292 | * WLP 0.99 [6.7] | ||
| 293 | * | ||
| 294 | * Only the fields that will be used are detailed in this structure, rest | ||
| 295 | * are not detailed or marked as "notused". | ||
| 296 | */ | ||
| 297 | struct wlp_ie { | ||
| 298 | struct uwb_ie_hdr hdr; | ||
| 299 | __le16 capabilities; | ||
| 300 | __le16 cycle_param; | ||
| 301 | __le16 acw_anchor_addr; | ||
| 302 | u8 wssid_hash_list[]; | ||
| 303 | } __attribute__((packed)); | ||
| 304 | |||
| 305 | static inline int wlp_ie_hash_length(struct wlp_ie *ie) | ||
| 306 | { | ||
| 307 | return (le16_to_cpu(ie->capabilities) >> 12) & 0xf; | ||
| 308 | } | ||
| 309 | |||
| 310 | static inline void wlp_ie_set_hash_length(struct wlp_ie *ie, int hash_length) | ||
| 311 | { | ||
| 312 | u16 caps = le16_to_cpu(ie->capabilities); | ||
| 313 | caps = (caps & ~(0xf << 12)) | (hash_length << 12); | ||
| 314 | ie->capabilities = cpu_to_le16(caps); | ||
| 315 | } | ||
| 316 | |||
| 317 | /** | ||
| 318 | * WLP nonce | ||
| 319 | * WLP Draft 0.99 [6.6.1 Table 6] | ||
| 320 | * | ||
| 321 | * A 128-bit random number often used (E-SNonce1, E-SNonce2, Enrollee | ||
| 322 | * Nonce, Registrar Nonce, R-SNonce1, R-SNonce2). It is passed to HW so | ||
| 323 | * it is packed. | ||
| 324 | */ | ||
| 325 | struct wlp_nonce { | ||
| 326 | u8 data[16]; | ||
| 327 | } __attribute__((packed)); | ||
| 328 | |||
| 329 | /** | ||
| 330 | * WLP UUID | ||
| 331 | * WLP Draft 0.99 [6.6.1 Table 6] | ||
| 332 | * | ||
| 333 | * Universally Unique Identifier (UUID) encoded as an octet string in the | ||
| 334 | * order the octets are shown in string representation in RFC4122. A UUID | ||
| 335 | * is often used (UUID-E, UUID-R, WSSID). It is passed to HW so it is packed. | ||
| 336 | */ | ||
| 337 | struct wlp_uuid { | ||
| 338 | u8 data[16]; | ||
| 339 | } __attribute__((packed)); | ||
| 340 | |||
| 341 | |||
| 342 | /** | ||
| 343 | * Primary and secondary device type attributes | ||
| 344 | * WLP Draft 0.99 [6.6.1.8] | ||
| 345 | */ | ||
| 346 | struct wlp_dev_type { | ||
| 347 | enum wlp_dev_category_id category:16; | ||
| 348 | u8 OUI[3]; | ||
| 349 | u8 OUIsubdiv; | ||
| 350 | __le16 subID; | ||
| 351 | } __attribute__((packed)); | ||
| 352 | |||
| 353 | /** | ||
| 354 | * WLP frame header | ||
| 355 | * WLP Draft 0.99 [6.2] | ||
| 356 | */ | ||
| 357 | struct wlp_frame_hdr { | ||
| 358 | __le16 mux_hdr; /* WLP_PROTOCOL_ID */ | ||
| 359 | enum wlp_frame_type type:8; | ||
| 360 | } __attribute__((packed)); | ||
| 361 | |||
| 362 | /** | ||
| 363 | * WLP attribute field header | ||
| 364 | * WLP Draft 0.99 [6.6.1] | ||
| 365 | * | ||
| 366 | * Header of each attribute found in an association frame | ||
| 367 | */ | ||
| 368 | struct wlp_attr_hdr { | ||
| 369 | __le16 type; | ||
| 370 | __le16 length; | ||
| 371 | } __attribute__((packed)); | ||
| 372 | |||
| 373 | /** | ||
| 374 | * Device information commonly used together | ||
| 375 | * | ||
| 376 | * Each of these device information elements has a specified range in which it | ||
| 377 | * should fit (WLP 0.99 [Table 6]). This range provided in the spec does not | ||
| 378 | * include the termination null '\0' character (when used in the | ||
| 379 | * association protocol the attribute fields are accompanied | ||
| 380 | * with a "length" field so the full range from the spec can be used for | ||
| 381 | * the value). We thus allocate an extra byte to be able to store a string | ||
| 382 | * of max length with a terminating '\0'. | ||
| 383 | */ | ||
| 384 | struct wlp_device_info { | ||
| 385 | char name[33]; | ||
| 386 | char model_name[33]; | ||
| 387 | char manufacturer[65]; | ||
| 388 | char model_nr[33]; | ||
| 389 | char serial[33]; | ||
| 390 | struct wlp_dev_type prim_dev_type; | ||
| 391 | }; | ||
| 392 | |||
| 393 | /** | ||
| 394 | * Macros for the WLP attributes | ||
| 395 | * | ||
| 396 | * There are quite a few attributes (total is 43). The attribute layout can be | ||
| 397 | * in one of three categories: one value, an array, an enum forced to 8 bits. | ||
| 398 | * These macros help with their definitions. | ||
| 399 | */ | ||
| 400 | #define wlp_attr(type, name) \ | ||
| 401 | struct wlp_attr_##name { \ | ||
| 402 | struct wlp_attr_hdr hdr; \ | ||
| 403 | type name; \ | ||
| 404 | } __attribute__((packed)); | ||
| 405 | |||
| 406 | #define wlp_attr_array(type, name) \ | ||
| 407 | struct wlp_attr_##name { \ | ||
| 408 | struct wlp_attr_hdr hdr; \ | ||
| 409 | type name[]; \ | ||
| 410 | } __attribute__((packed)); | ||
| 411 | |||
| 412 | /** | ||
| 413 | * WLP association attribute fields | ||
| 414 | * WLP Draft 0.99 [6.6.1 Table 6] | ||
| 415 | * | ||
| 416 | * Attributes appear in same order as the Table in the spec | ||
| 417 | * FIXME Does not define all attributes yet | ||
| 418 | */ | ||
| 419 | |||
| 420 | /* Device name: Friendly name of sending device */ | ||
| 421 | wlp_attr_array(u8, dev_name) | ||
| 422 | |||
| 423 | /* Enrollee Nonce: Random number generated by enrollee for an enrollment | ||
| 424 | * session */ | ||
| 425 | wlp_attr(struct wlp_nonce, enonce) | ||
| 426 | |||
| 427 | /* Manufacturer name: Name of manufacturer of the sending device */ | ||
| 428 | wlp_attr_array(u8, manufacturer) | ||
| 429 | |||
| 430 | /* WLP Message Type */ | ||
| 431 | wlp_attr(u8, msg_type) | ||
| 432 | |||
| 433 | /* WLP Model name: Model name of sending device */ | ||
| 434 | wlp_attr_array(u8, model_name) | ||
| 435 | |||
| 436 | /* WLP Model number: Model number of sending device */ | ||
| 437 | wlp_attr_array(u8, model_nr) | ||
| 438 | |||
| 439 | /* Registrar Nonce: Random number generated by registrar for an enrollment | ||
| 440 | * session */ | ||
| 441 | wlp_attr(struct wlp_nonce, rnonce) | ||
| 442 | |||
| 443 | /* Serial number of device */ | ||
| 444 | wlp_attr_array(u8, serial) | ||
| 445 | |||
| 446 | /* UUID of enrollee */ | ||
| 447 | wlp_attr(struct wlp_uuid, uuid_e) | ||
| 448 | |||
| 449 | /* UUID of registrar */ | ||
| 450 | wlp_attr(struct wlp_uuid, uuid_r) | ||
| 451 | |||
| 452 | /* WLP Primary device type */ | ||
| 453 | wlp_attr(struct wlp_dev_type, prim_dev_type) | ||
| 454 | |||
| 455 | /* WLP Secondary device type */ | ||
| 456 | wlp_attr(struct wlp_dev_type, sec_dev_type) | ||
| 457 | |||
| 458 | /* WLP protocol version */ | ||
| 459 | wlp_attr(u8, version) | ||
| 460 | |||
| 461 | /* WLP service set identifier */ | ||
| 462 | wlp_attr(struct wlp_uuid, wssid) | ||
| 463 | |||
| 464 | /* WLP WSS name */ | ||
| 465 | wlp_attr_array(u8, wss_name) | ||
| 466 | |||
| 467 | /* WLP WSS Secure Status */ | ||
| 468 | wlp_attr(u8, wss_sec_status) | ||
| 469 | |||
| 470 | /* WSS Broadcast Address */ | ||
| 471 | wlp_attr(struct uwb_mac_addr, wss_bcast) | ||
| 472 | |||
| 473 | /* WLP Accepting Enrollment */ | ||
| 474 | wlp_attr(u8, accept_enrl) | ||
| 475 | |||
| 476 | /** | ||
| 477 | * WSS information attributes | ||
| 478 | * WLP Draft 0.99 [6.6.3 Table 15] | ||
| 479 | */ | ||
| 480 | struct wlp_wss_info { | ||
| 481 | struct wlp_attr_wssid wssid; | ||
| 482 | struct wlp_attr_wss_name name; | ||
| 483 | struct wlp_attr_accept_enrl accept; | ||
| 484 | struct wlp_attr_wss_sec_status sec_stat; | ||
| 485 | struct wlp_attr_wss_bcast bcast; | ||
| 486 | } __attribute__((packed)); | ||
| 487 | |||
| 488 | /* WLP WSS Information */ | ||
| 489 | wlp_attr_array(struct wlp_wss_info, wss_info) | ||
| 490 | |||
| 491 | /* WLP WSS Selection method */ | ||
| 492 | wlp_attr(u8, wss_sel_mthd) | ||
| 493 | |||
| 494 | /* WLP WSS tag */ | ||
| 495 | wlp_attr(u8, wss_tag) | ||
| 496 | |||
| 497 | /* WSS Virtual Address */ | ||
| 498 | wlp_attr(struct uwb_mac_addr, wss_virt) | ||
| 499 | |||
| 500 | /* WLP association error */ | ||
| 501 | wlp_attr(u8, wlp_assc_err) | ||
| 502 | |||
| 503 | /** | ||
| 504 | * WLP standard and abbreviated frames | ||
| 505 | * | ||
| 506 | * WLP Draft 0.99 [6.3] and [6.4] | ||
| 507 | * | ||
| 508 | * The difference between the WLP standard frame and the WLP | ||
| 509 | * abbreviated frame is that the standard frame includes the src | ||
| 510 | * and dest addresses from the Ethernet header, the abbreviated frame does | ||
| 511 | * not. | ||
| 512 | * The src/dest (as well as the type/length and client data) are already | ||
| 513 | * defined as part of the Ethernet header, we do not do this here. | ||
| 514 | * From this perspective the standard and abbreviated frames appear the | ||
| 515 | * same - they will be treated differently though. | ||
| 516 | * | ||
| 517 | * The size of this header is also captured in WLP_DATA_HLEN to enable | ||
| 518 | * interfaces to prepare their headroom. | ||
| 519 | */ | ||
| 520 | struct wlp_frame_std_abbrv_hdr { | ||
| 521 | struct wlp_frame_hdr hdr; | ||
| 522 | u8 tag; | ||
| 523 | } __attribute__((packed)); | ||
| 524 | |||
| 525 | /** | ||
| 526 | * WLP association frames | ||
| 527 | * | ||
| 528 | * WLP Draft 0.99 [6.6] | ||
| 529 | */ | ||
| 530 | struct wlp_frame_assoc { | ||
| 531 | struct wlp_frame_hdr hdr; | ||
| 532 | enum wlp_assoc_type type:8; | ||
| 533 | struct wlp_attr_version version; | ||
| 534 | struct wlp_attr_msg_type msg_type; | ||
| 535 | u8 attr[]; | ||
| 536 | } __attribute__((packed)); | ||
| 537 | |||
| 538 | /* Ethernet to dev address mapping */ | ||
| 539 | struct wlp_eda { | ||
| 540 | spinlock_t lock; | ||
| 541 | struct list_head cache; /* Eth<->Dev Addr cache */ | ||
| 542 | }; | ||
| 543 | |||
| 544 | /** | ||
| 545 | * WSS information temporary storage | ||
| 546 | * | ||
| 547 | * This information is only stored temporarily during discovery. It should | ||
| 548 | * not be stored unless the device is enrolled in the advertised WSS. This | ||
| 549 | * is done mainly because we follow the letter of the spec in this regard. | ||
| 550 | * See WLP 0.99 [7.2.3]. | ||
| 551 | * When the device does become enrolled in a WSS the WSS information will | ||
| 552 | * be stored as part of the more comprehensive struct wlp_wss. | ||
| 553 | */ | ||
| 554 | struct wlp_wss_tmp_info { | ||
| 555 | char name[WLP_WSS_NAME_SIZE]; | ||
| 556 | u8 accept_enroll; | ||
| 557 | u8 sec_status; | ||
| 558 | struct uwb_mac_addr bcast; | ||
| 559 | }; | ||
| 560 | |||
| 561 | struct wlp_wssid_e { | ||
| 562 | struct list_head node; | ||
| 563 | struct wlp_uuid wssid; | ||
| 564 | struct wlp_wss_tmp_info *info; | ||
| 565 | }; | ||
| 566 | |||
| 567 | /** | ||
| 568 | * A cache entry of WLP neighborhood | ||
| 569 | * | ||
| 570 | * @node: head of list is wlp->neighbors | ||
| 571 | * @wssid: list of wssids of this neighbor, element is wlp_wssid_e | ||
| 572 | * @info: temporary storage for information learned during discovery. This | ||
| 573 | * storage is used together with the wssid_e temporary storage | ||
| 574 | * during discovery. | ||
| 575 | */ | ||
| 576 | struct wlp_neighbor_e { | ||
| 577 | struct list_head node; | ||
| 578 | struct wlp_uuid uuid; | ||
| 579 | struct uwb_dev *uwb_dev; | ||
| 580 | struct list_head wssid; /* Elements are wlp_wssid_e */ | ||
| 581 | struct wlp_device_info *info; | ||
| 582 | }; | ||
| 583 | |||
| 584 | struct wlp; | ||
| 585 | /** | ||
| 586 | * Information for an association session in progress. | ||
| 587 | * | ||
| 588 | * @exp_message: The type of the expected message. Both this message and a | ||
| 589 | * F0 message (which can be sent in response to any | ||
| 590 | * association frame) will be accepted as a valid message for | ||
| 591 | * this session. | ||
| 592 | * @cb: The function that will be called upon receipt of this | ||
| 593 | * message. | ||
| 594 | * @cb_priv: Private data of callback | ||
| 595 | * @data: Data used in association process (always a sk_buff?) | ||
| 596 | * @neighbor: Address of neighbor with which association session is in | ||
| 597 | * progress. | ||
| 598 | */ | ||
| 599 | struct wlp_session { | ||
| 600 | enum wlp_assoc_type exp_message; | ||
| 601 | void (*cb)(struct wlp *); | ||
| 602 | void *cb_priv; | ||
| 603 | void *data; | ||
| 604 | struct uwb_dev_addr neighbor_addr; | ||
| 605 | }; | ||
| 606 | |||
| 607 | /** | ||
| 608 | * WLP Service Set | ||
| 609 | * | ||
| 610 | * @mutex: used to protect entire WSS structure. | ||
| 611 | * | ||
| 612 | * @name: The WSS name is set to 65 bytes, 1 byte larger than the maximum | ||
| 613 | * allowed by the WLP spec. This is to have a null terminated string | ||
| 614 | * for display to the user. A maximum of 64 bytes will still be used | ||
| 615 | * when placing the WSS name field in association frames. | ||
| 616 | * | ||
| 617 | * @accept_enroll: Accepting enrollment: Set to one if registrar is | ||
| 618 | * accepting enrollment in WSS, or zero otherwise. | ||
| 619 | * | ||
| 620 | * Global and local information for each WSS in which we are enrolled. | ||
| 621 | * WLP 0.99 Section 7.2.1 and Section 7.2.2 | ||
| 622 | */ | ||
| 623 | struct wlp_wss { | ||
| 624 | struct mutex mutex; | ||
| 625 | struct kobject kobj; | ||
| 626 | /* Global properties. */ | ||
| 627 | struct wlp_uuid wssid; | ||
| 628 | u8 hash; | ||
| 629 | char name[WLP_WSS_NAME_SIZE]; | ||
| 630 | struct uwb_mac_addr bcast; | ||
| 631 | u8 secure_status:1; | ||
| 632 | u8 master_key[16]; | ||
| 633 | /* Local properties. */ | ||
| 634 | u8 tag; | ||
| 635 | struct uwb_mac_addr virtual_addr; | ||
| 636 | /* Extra */ | ||
| 637 | u8 accept_enroll:1; | ||
| 638 | enum wlp_wss_state state; | ||
| 639 | }; | ||
| 640 | |||
| 641 | /** | ||
| 642 | * WLP main structure | ||
| 643 | * @mutex: protect changes to WLP structure. We only allow changes to the | ||
| 644 | * uuid, so currently this mutex only protects this field. | ||
| 645 | */ | ||
| 646 | struct wlp { | ||
| 647 | struct mutex mutex; | ||
| 648 | struct uwb_rc *rc; /* UWB radio controller */ | ||
| 649 | struct net_device *ndev; | ||
| 650 | struct uwb_pal pal; | ||
| 651 | struct wlp_eda eda; | ||
| 652 | struct wlp_uuid uuid; | ||
| 653 | struct wlp_session *session; | ||
| 654 | struct wlp_wss wss; | ||
| 655 | struct mutex nbmutex; /* Neighbor mutex protects neighbors list */ | ||
| 656 | struct list_head neighbors; /* Elements are wlp_neighbor_e */ | ||
| 657 | struct uwb_notifs_handler uwb_notifs_handler; | ||
| 658 | struct wlp_device_info *dev_info; | ||
| 659 | void (*fill_device_info)(struct wlp *wlp, struct wlp_device_info *info); | ||
| 660 | int (*xmit_frame)(struct wlp *, struct sk_buff *, | ||
| 661 | struct uwb_dev_addr *); | ||
| 662 | void (*stop_queue)(struct wlp *); | ||
| 663 | void (*start_queue)(struct wlp *); | ||
| 664 | }; | ||
| 665 | |||
| 666 | /* sysfs */ | ||
| 667 | |||
| 668 | |||
| 669 | struct wlp_wss_attribute { | ||
| 670 | struct attribute attr; | ||
| 671 | ssize_t (*show)(struct wlp_wss *wss, char *buf); | ||
| 672 | ssize_t (*store)(struct wlp_wss *wss, const char *buf, size_t count); | ||
| 673 | }; | ||
| 674 | |||
| 675 | #define WSS_ATTR(_name, _mode, _show, _store) \ | ||
| 676 | static struct wlp_wss_attribute wss_attr_##_name = __ATTR(_name, _mode, \ | ||
| 677 | _show, _store) | ||
| 678 | |||
| 679 | extern int wlp_setup(struct wlp *, struct uwb_rc *, struct net_device *ndev); | ||
| 680 | extern void wlp_remove(struct wlp *); | ||
| 681 | extern ssize_t wlp_neighborhood_show(struct wlp *, char *); | ||
| 682 | extern int wlp_wss_setup(struct net_device *, struct wlp_wss *); | ||
| 683 | extern void wlp_wss_remove(struct wlp_wss *); | ||
| 684 | extern ssize_t wlp_wss_activate_show(struct wlp_wss *, char *); | ||
| 685 | extern ssize_t wlp_wss_activate_store(struct wlp_wss *, const char *, size_t); | ||
| 686 | extern ssize_t wlp_eda_show(struct wlp *, char *); | ||
| 687 | extern ssize_t wlp_eda_store(struct wlp *, const char *, size_t); | ||
| 688 | extern ssize_t wlp_uuid_show(struct wlp *, char *); | ||
| 689 | extern ssize_t wlp_uuid_store(struct wlp *, const char *, size_t); | ||
| 690 | extern ssize_t wlp_dev_name_show(struct wlp *, char *); | ||
| 691 | extern ssize_t wlp_dev_name_store(struct wlp *, const char *, size_t); | ||
| 692 | extern ssize_t wlp_dev_manufacturer_show(struct wlp *, char *); | ||
| 693 | extern ssize_t wlp_dev_manufacturer_store(struct wlp *, const char *, size_t); | ||
| 694 | extern ssize_t wlp_dev_model_name_show(struct wlp *, char *); | ||
| 695 | extern ssize_t wlp_dev_model_name_store(struct wlp *, const char *, size_t); | ||
| 696 | extern ssize_t wlp_dev_model_nr_show(struct wlp *, char *); | ||
| 697 | extern ssize_t wlp_dev_model_nr_store(struct wlp *, const char *, size_t); | ||
| 698 | extern ssize_t wlp_dev_serial_show(struct wlp *, char *); | ||
| 699 | extern ssize_t wlp_dev_serial_store(struct wlp *, const char *, size_t); | ||
| 700 | extern ssize_t wlp_dev_prim_category_show(struct wlp *, char *); | ||
| 701 | extern ssize_t wlp_dev_prim_category_store(struct wlp *, const char *, | ||
| 702 | size_t); | ||
| 703 | extern ssize_t wlp_dev_prim_OUI_show(struct wlp *, char *); | ||
| 704 | extern ssize_t wlp_dev_prim_OUI_store(struct wlp *, const char *, size_t); | ||
| 705 | extern ssize_t wlp_dev_prim_OUI_sub_show(struct wlp *, char *); | ||
| 706 | extern ssize_t wlp_dev_prim_OUI_sub_store(struct wlp *, const char *, | ||
| 707 | size_t); | ||
| 708 | extern ssize_t wlp_dev_prim_subcat_show(struct wlp *, char *); | ||
| 709 | extern ssize_t wlp_dev_prim_subcat_store(struct wlp *, const char *, | ||
| 710 | size_t); | ||
| 711 | extern int wlp_receive_frame(struct device *, struct wlp *, struct sk_buff *, | ||
| 712 | struct uwb_dev_addr *); | ||
| 713 | extern int wlp_prepare_tx_frame(struct device *, struct wlp *, | ||
| 714 | struct sk_buff *, struct uwb_dev_addr *); | ||
| 715 | void wlp_reset_all(struct wlp *wlp); | ||
| 716 | |||
| 717 | /** | ||
| 718 | * Initialize WSS | ||
| 719 | */ | ||
| 720 | static inline | ||
| 721 | void wlp_wss_init(struct wlp_wss *wss) | ||
| 722 | { | ||
| 723 | mutex_init(&wss->mutex); | ||
| 724 | } | ||
| 725 | |||
| 726 | static inline | ||
| 727 | void wlp_init(struct wlp *wlp) | ||
| 728 | { | ||
| 729 | INIT_LIST_HEAD(&wlp->neighbors); | ||
| 730 | mutex_init(&wlp->mutex); | ||
| 731 | mutex_init(&wlp->nbmutex); | ||
| 732 | wlp_wss_init(&wlp->wss); | ||
| 733 | } | ||
| 734 | |||
| 735 | |||
| 736 | #endif /* #ifndef __LINUX__WLP_H_ */ | ||
diff --git a/include/linux/wm97xx_batt.h b/include/linux/wm97xx_batt.h deleted file mode 100644 index a1d6419c2ff8..000000000000 --- a/include/linux/wm97xx_batt.h +++ /dev/null | |||
| @@ -1,16 +0,0 @@ | |||
| 1 | #ifndef _LINUX_WM97XX_BAT_H | ||
| 2 | #define _LINUX_WM97XX_BAT_H | ||
| 3 | |||
| 4 | #include <linux/wm97xx.h> | ||
| 5 | |||
| 6 | #warning This file will be removed soon, use wm97xx.h instead! | ||
| 7 | |||
| 8 | #define wm97xx_batt_info wm97xx_batt_pdata | ||
| 9 | |||
| 10 | #ifdef CONFIG_BATTERY_WM97XX | ||
| 11 | void wm97xx_bat_set_pdata(struct wm97xx_batt_info *data); | ||
| 12 | #else | ||
| 13 | static inline void wm97xx_bat_set_pdata(struct wm97xx_batt_info *data) {} | ||
| 14 | #endif | ||
| 15 | |||
| 16 | #endif | ||
diff --git a/include/linux/workqueue.h b/include/linux/workqueue.h index 9466e860d8c2..0c0771f06bfa 100644 --- a/include/linux/workqueue.h +++ b/include/linux/workqueue.h | |||
| @@ -9,6 +9,7 @@ | |||
| 9 | #include <linux/linkage.h> | 9 | #include <linux/linkage.h> |
| 10 | #include <linux/bitops.h> | 10 | #include <linux/bitops.h> |
| 11 | #include <linux/lockdep.h> | 11 | #include <linux/lockdep.h> |
| 12 | #include <linux/threads.h> | ||
| 12 | #include <asm/atomic.h> | 13 | #include <asm/atomic.h> |
| 13 | 14 | ||
| 14 | struct workqueue_struct; | 15 | struct workqueue_struct; |
| @@ -22,12 +23,61 @@ typedef void (*work_func_t)(struct work_struct *work); | |||
| 22 | */ | 23 | */ |
| 23 | #define work_data_bits(work) ((unsigned long *)(&(work)->data)) | 24 | #define work_data_bits(work) ((unsigned long *)(&(work)->data)) |
| 24 | 25 | ||
| 26 | enum { | ||
| 27 | WORK_STRUCT_PENDING_BIT = 0, /* work item is pending execution */ | ||
| 28 | WORK_STRUCT_DELAYED_BIT = 1, /* work item is delayed */ | ||
| 29 | WORK_STRUCT_CWQ_BIT = 2, /* data points to cwq */ | ||
| 30 | WORK_STRUCT_LINKED_BIT = 3, /* next work is linked to this one */ | ||
| 31 | #ifdef CONFIG_DEBUG_OBJECTS_WORK | ||
| 32 | WORK_STRUCT_STATIC_BIT = 4, /* static initializer (debugobjects) */ | ||
| 33 | WORK_STRUCT_COLOR_SHIFT = 5, /* color for workqueue flushing */ | ||
| 34 | #else | ||
| 35 | WORK_STRUCT_COLOR_SHIFT = 4, /* color for workqueue flushing */ | ||
| 36 | #endif | ||
| 37 | |||
| 38 | WORK_STRUCT_COLOR_BITS = 4, | ||
| 39 | |||
| 40 | WORK_STRUCT_PENDING = 1 << WORK_STRUCT_PENDING_BIT, | ||
| 41 | WORK_STRUCT_DELAYED = 1 << WORK_STRUCT_DELAYED_BIT, | ||
| 42 | WORK_STRUCT_CWQ = 1 << WORK_STRUCT_CWQ_BIT, | ||
| 43 | WORK_STRUCT_LINKED = 1 << WORK_STRUCT_LINKED_BIT, | ||
| 44 | #ifdef CONFIG_DEBUG_OBJECTS_WORK | ||
| 45 | WORK_STRUCT_STATIC = 1 << WORK_STRUCT_STATIC_BIT, | ||
| 46 | #else | ||
| 47 | WORK_STRUCT_STATIC = 0, | ||
| 48 | #endif | ||
| 49 | |||
| 50 | /* | ||
| 51 | * The last color is no color used for works which don't | ||
| 52 | * participate in workqueue flushing. | ||
| 53 | */ | ||
| 54 | WORK_NR_COLORS = (1 << WORK_STRUCT_COLOR_BITS) - 1, | ||
| 55 | WORK_NO_COLOR = WORK_NR_COLORS, | ||
| 56 | |||
| 57 | /* special cpu IDs */ | ||
| 58 | WORK_CPU_UNBOUND = NR_CPUS, | ||
| 59 | WORK_CPU_NONE = NR_CPUS + 1, | ||
| 60 | WORK_CPU_LAST = WORK_CPU_NONE, | ||
| 61 | |||
| 62 | /* | ||
| 63 | * Reserve 7 bits off of cwq pointer w/ debugobjects turned | ||
| 64 | * off. This makes cwqs aligned to 256 bytes and allows 15 | ||
| 65 | * workqueue flush colors. | ||
| 66 | */ | ||
| 67 | WORK_STRUCT_FLAG_BITS = WORK_STRUCT_COLOR_SHIFT + | ||
| 68 | WORK_STRUCT_COLOR_BITS, | ||
| 69 | |||
| 70 | WORK_STRUCT_FLAG_MASK = (1UL << WORK_STRUCT_FLAG_BITS) - 1, | ||
| 71 | WORK_STRUCT_WQ_DATA_MASK = ~WORK_STRUCT_FLAG_MASK, | ||
| 72 | WORK_STRUCT_NO_CPU = WORK_CPU_NONE << WORK_STRUCT_FLAG_BITS, | ||
| 73 | |||
| 74 | /* bit mask for work_busy() return values */ | ||
| 75 | WORK_BUSY_PENDING = 1 << 0, | ||
| 76 | WORK_BUSY_RUNNING = 1 << 1, | ||
| 77 | }; | ||
| 78 | |||
| 25 | struct work_struct { | 79 | struct work_struct { |
| 26 | atomic_long_t data; | 80 | atomic_long_t data; |
| 27 | #define WORK_STRUCT_PENDING 0 /* T if work item pending execution */ | ||
| 28 | #define WORK_STRUCT_STATIC 1 /* static initializer (debugobjects) */ | ||
| 29 | #define WORK_STRUCT_FLAG_MASK (3UL) | ||
| 30 | #define WORK_STRUCT_WQ_DATA_MASK (~WORK_STRUCT_FLAG_MASK) | ||
| 31 | struct list_head entry; | 81 | struct list_head entry; |
| 32 | work_func_t func; | 82 | work_func_t func; |
| 33 | #ifdef CONFIG_LOCKDEP | 83 | #ifdef CONFIG_LOCKDEP |
| @@ -35,8 +85,9 @@ struct work_struct { | |||
| 35 | #endif | 85 | #endif |
| 36 | }; | 86 | }; |
| 37 | 87 | ||
| 38 | #define WORK_DATA_INIT() ATOMIC_LONG_INIT(0) | 88 | #define WORK_DATA_INIT() ATOMIC_LONG_INIT(WORK_STRUCT_NO_CPU) |
| 39 | #define WORK_DATA_STATIC_INIT() ATOMIC_LONG_INIT(2) | 89 | #define WORK_DATA_STATIC_INIT() \ |
| 90 | ATOMIC_LONG_INIT(WORK_STRUCT_NO_CPU | WORK_STRUCT_STATIC) | ||
| 40 | 91 | ||
| 41 | struct delayed_work { | 92 | struct delayed_work { |
| 42 | struct work_struct work; | 93 | struct work_struct work; |
| @@ -96,9 +147,14 @@ struct execute_work { | |||
| 96 | #ifdef CONFIG_DEBUG_OBJECTS_WORK | 147 | #ifdef CONFIG_DEBUG_OBJECTS_WORK |
| 97 | extern void __init_work(struct work_struct *work, int onstack); | 148 | extern void __init_work(struct work_struct *work, int onstack); |
| 98 | extern void destroy_work_on_stack(struct work_struct *work); | 149 | extern void destroy_work_on_stack(struct work_struct *work); |
| 150 | static inline unsigned int work_static(struct work_struct *work) | ||
| 151 | { | ||
| 152 | return *work_data_bits(work) & WORK_STRUCT_STATIC; | ||
| 153 | } | ||
| 99 | #else | 154 | #else |
| 100 | static inline void __init_work(struct work_struct *work, int onstack) { } | 155 | static inline void __init_work(struct work_struct *work, int onstack) { } |
| 101 | static inline void destroy_work_on_stack(struct work_struct *work) { } | 156 | static inline void destroy_work_on_stack(struct work_struct *work) { } |
| 157 | static inline unsigned int work_static(struct work_struct *work) { return 0; } | ||
| 102 | #endif | 158 | #endif |
| 103 | 159 | ||
| 104 | /* | 160 | /* |
| @@ -134,7 +190,7 @@ static inline void destroy_work_on_stack(struct work_struct *work) { } | |||
| 134 | __INIT_WORK((_work), (_func), 0); \ | 190 | __INIT_WORK((_work), (_func), 0); \ |
| 135 | } while (0) | 191 | } while (0) |
| 136 | 192 | ||
| 137 | #define INIT_WORK_ON_STACK(_work, _func) \ | 193 | #define INIT_WORK_ONSTACK(_work, _func) \ |
| 138 | do { \ | 194 | do { \ |
| 139 | __INIT_WORK((_work), (_func), 1); \ | 195 | __INIT_WORK((_work), (_func), 1); \ |
| 140 | } while (0) | 196 | } while (0) |
| @@ -145,9 +201,9 @@ static inline void destroy_work_on_stack(struct work_struct *work) { } | |||
| 145 | init_timer(&(_work)->timer); \ | 201 | init_timer(&(_work)->timer); \ |
| 146 | } while (0) | 202 | } while (0) |
| 147 | 203 | ||
| 148 | #define INIT_DELAYED_WORK_ON_STACK(_work, _func) \ | 204 | #define INIT_DELAYED_WORK_ONSTACK(_work, _func) \ |
| 149 | do { \ | 205 | do { \ |
| 150 | INIT_WORK_ON_STACK(&(_work)->work, (_func)); \ | 206 | INIT_WORK_ONSTACK(&(_work)->work, (_func)); \ |
| 151 | init_timer_on_stack(&(_work)->timer); \ | 207 | init_timer_on_stack(&(_work)->timer); \ |
| 152 | } while (0) | 208 | } while (0) |
| 153 | 209 | ||
| @@ -162,7 +218,7 @@ static inline void destroy_work_on_stack(struct work_struct *work) { } | |||
| 162 | * @work: The work item in question | 218 | * @work: The work item in question |
| 163 | */ | 219 | */ |
| 164 | #define work_pending(work) \ | 220 | #define work_pending(work) \ |
| 165 | test_bit(WORK_STRUCT_PENDING, work_data_bits(work)) | 221 | test_bit(WORK_STRUCT_PENDING_BIT, work_data_bits(work)) |
| 166 | 222 | ||
| 167 | /** | 223 | /** |
| 168 | * delayed_work_pending - Find out whether a delayable work item is currently | 224 | * delayed_work_pending - Find out whether a delayable work item is currently |
| @@ -177,16 +233,63 @@ static inline void destroy_work_on_stack(struct work_struct *work) { } | |||
| 177 | * @work: The work item in question | 233 | * @work: The work item in question |
| 178 | */ | 234 | */ |
| 179 | #define work_clear_pending(work) \ | 235 | #define work_clear_pending(work) \ |
| 180 | clear_bit(WORK_STRUCT_PENDING, work_data_bits(work)) | 236 | clear_bit(WORK_STRUCT_PENDING_BIT, work_data_bits(work)) |
| 181 | 237 | ||
| 238 | /* | ||
| 239 | * Workqueue flags and constants. For details, please refer to | ||
| 240 | * Documentation/workqueue.txt. | ||
| 241 | */ | ||
| 242 | enum { | ||
| 243 | WQ_NON_REENTRANT = 1 << 0, /* guarantee non-reentrance */ | ||
| 244 | WQ_UNBOUND = 1 << 1, /* not bound to any cpu */ | ||
| 245 | WQ_FREEZEABLE = 1 << 2, /* freeze during suspend */ | ||
| 246 | WQ_MEM_RECLAIM = 1 << 3, /* may be used for memory reclaim */ | ||
| 247 | WQ_HIGHPRI = 1 << 4, /* high priority */ | ||
| 248 | WQ_CPU_INTENSIVE = 1 << 5, /* cpu instensive workqueue */ | ||
| 249 | |||
| 250 | WQ_DYING = 1 << 6, /* internal: workqueue is dying */ | ||
| 251 | WQ_RESCUER = 1 << 7, /* internal: workqueue has rescuer */ | ||
| 252 | |||
| 253 | WQ_MAX_ACTIVE = 512, /* I like 512, better ideas? */ | ||
| 254 | WQ_MAX_UNBOUND_PER_CPU = 4, /* 4 * #cpus for unbound wq */ | ||
| 255 | WQ_DFL_ACTIVE = WQ_MAX_ACTIVE / 2, | ||
| 256 | }; | ||
| 257 | |||
| 258 | /* unbound wq's aren't per-cpu, scale max_active according to #cpus */ | ||
| 259 | #define WQ_UNBOUND_MAX_ACTIVE \ | ||
| 260 | max_t(int, WQ_MAX_ACTIVE, num_possible_cpus() * WQ_MAX_UNBOUND_PER_CPU) | ||
| 261 | |||
| 262 | /* | ||
| 263 | * System-wide workqueues which are always present. | ||
| 264 | * | ||
| 265 | * system_wq is the one used by schedule[_delayed]_work[_on](). | ||
| 266 | * Multi-CPU multi-threaded. There are users which expect relatively | ||
| 267 | * short queue flush time. Don't queue works which can run for too | ||
| 268 | * long. | ||
| 269 | * | ||
| 270 | * system_long_wq is similar to system_wq but may host long running | ||
| 271 | * works. Queue flushing might take relatively long. | ||
| 272 | * | ||
| 273 | * system_nrt_wq is non-reentrant and guarantees that any given work | ||
| 274 | * item is never executed in parallel by multiple CPUs. Queue | ||
| 275 | * flushing might take relatively long. | ||
| 276 | * | ||
| 277 | * system_unbound_wq is unbound workqueue. Workers are not bound to | ||
| 278 | * any specific CPU, not concurrency managed, and all queued works are | ||
| 279 | * executed immediately as long as max_active limit is not reached and | ||
| 280 | * resources are available. | ||
| 281 | */ | ||
| 282 | extern struct workqueue_struct *system_wq; | ||
| 283 | extern struct workqueue_struct *system_long_wq; | ||
| 284 | extern struct workqueue_struct *system_nrt_wq; | ||
| 285 | extern struct workqueue_struct *system_unbound_wq; | ||
| 182 | 286 | ||
| 183 | extern struct workqueue_struct * | 287 | extern struct workqueue_struct * |
| 184 | __create_workqueue_key(const char *name, int singlethread, | 288 | __alloc_workqueue_key(const char *name, unsigned int flags, int max_active, |
| 185 | int freezeable, int rt, struct lock_class_key *key, | 289 | struct lock_class_key *key, const char *lock_name); |
| 186 | const char *lock_name); | ||
| 187 | 290 | ||
| 188 | #ifdef CONFIG_LOCKDEP | 291 | #ifdef CONFIG_LOCKDEP |
| 189 | #define __create_workqueue(name, singlethread, freezeable, rt) \ | 292 | #define alloc_workqueue(name, flags, max_active) \ |
| 190 | ({ \ | 293 | ({ \ |
| 191 | static struct lock_class_key __key; \ | 294 | static struct lock_class_key __key; \ |
| 192 | const char *__lock_name; \ | 295 | const char *__lock_name; \ |
| @@ -196,20 +299,38 @@ __create_workqueue_key(const char *name, int singlethread, | |||
| 196 | else \ | 299 | else \ |
| 197 | __lock_name = #name; \ | 300 | __lock_name = #name; \ |
| 198 | \ | 301 | \ |
| 199 | __create_workqueue_key((name), (singlethread), \ | 302 | __alloc_workqueue_key((name), (flags), (max_active), \ |
| 200 | (freezeable), (rt), &__key, \ | 303 | &__key, __lock_name); \ |
| 201 | __lock_name); \ | ||
| 202 | }) | 304 | }) |
| 203 | #else | 305 | #else |
| 204 | #define __create_workqueue(name, singlethread, freezeable, rt) \ | 306 | #define alloc_workqueue(name, flags, max_active) \ |
| 205 | __create_workqueue_key((name), (singlethread), (freezeable), (rt), \ | 307 | __alloc_workqueue_key((name), (flags), (max_active), NULL, NULL) |
| 206 | NULL, NULL) | ||
| 207 | #endif | 308 | #endif |
| 208 | 309 | ||
| 209 | #define create_workqueue(name) __create_workqueue((name), 0, 0, 0) | 310 | /** |
| 210 | #define create_rt_workqueue(name) __create_workqueue((name), 0, 0, 1) | 311 | * alloc_ordered_workqueue - allocate an ordered workqueue |
| 211 | #define create_freezeable_workqueue(name) __create_workqueue((name), 1, 1, 0) | 312 | * @name: name of the workqueue |
| 212 | #define create_singlethread_workqueue(name) __create_workqueue((name), 1, 0, 0) | 313 | * @flags: WQ_* flags (only WQ_FREEZEABLE and WQ_MEM_RECLAIM are meaningful) |
| 314 | * | ||
| 315 | * Allocate an ordered workqueue. An ordered workqueue executes at | ||
| 316 | * most one work item at any given time in the queued order. They are | ||
| 317 | * implemented as unbound workqueues with @max_active of one. | ||
| 318 | * | ||
| 319 | * RETURNS: | ||
| 320 | * Pointer to the allocated workqueue on success, %NULL on failure. | ||
| 321 | */ | ||
| 322 | static inline struct workqueue_struct * | ||
| 323 | alloc_ordered_workqueue(const char *name, unsigned int flags) | ||
| 324 | { | ||
| 325 | return alloc_workqueue(name, WQ_UNBOUND | flags, 1); | ||
| 326 | } | ||
| 327 | |||
| 328 | #define create_workqueue(name) \ | ||
| 329 | alloc_workqueue((name), WQ_MEM_RECLAIM, 1) | ||
| 330 | #define create_freezeable_workqueue(name) \ | ||
| 331 | alloc_workqueue((name), WQ_FREEZEABLE | WQ_UNBOUND | WQ_MEM_RECLAIM, 1) | ||
| 332 | #define create_singlethread_workqueue(name) \ | ||
| 333 | alloc_workqueue((name), WQ_UNBOUND | WQ_MEM_RECLAIM, 1) | ||
| 213 | 334 | ||
| 214 | extern void destroy_workqueue(struct workqueue_struct *wq); | 335 | extern void destroy_workqueue(struct workqueue_struct *wq); |
| 215 | 336 | ||
| @@ -223,7 +344,6 @@ extern int queue_delayed_work_on(int cpu, struct workqueue_struct *wq, | |||
| 223 | 344 | ||
| 224 | extern void flush_workqueue(struct workqueue_struct *wq); | 345 | extern void flush_workqueue(struct workqueue_struct *wq); |
| 225 | extern void flush_scheduled_work(void); | 346 | extern void flush_scheduled_work(void); |
| 226 | extern void flush_delayed_work(struct delayed_work *work); | ||
| 227 | 347 | ||
| 228 | extern int schedule_work(struct work_struct *work); | 348 | extern int schedule_work(struct work_struct *work); |
| 229 | extern int schedule_work_on(int cpu, struct work_struct *work); | 349 | extern int schedule_work_on(int cpu, struct work_struct *work); |
| @@ -231,15 +351,23 @@ extern int schedule_delayed_work(struct delayed_work *work, unsigned long delay) | |||
| 231 | extern int schedule_delayed_work_on(int cpu, struct delayed_work *work, | 351 | extern int schedule_delayed_work_on(int cpu, struct delayed_work *work, |
| 232 | unsigned long delay); | 352 | unsigned long delay); |
| 233 | extern int schedule_on_each_cpu(work_func_t func); | 353 | extern int schedule_on_each_cpu(work_func_t func); |
| 234 | extern int current_is_keventd(void); | ||
| 235 | extern int keventd_up(void); | 354 | extern int keventd_up(void); |
| 236 | 355 | ||
| 237 | extern void init_workqueues(void); | ||
| 238 | int execute_in_process_context(work_func_t fn, struct execute_work *); | 356 | int execute_in_process_context(work_func_t fn, struct execute_work *); |
| 239 | 357 | ||
| 240 | extern int flush_work(struct work_struct *work); | 358 | extern bool flush_work(struct work_struct *work); |
| 359 | extern bool flush_work_sync(struct work_struct *work); | ||
| 360 | extern bool cancel_work_sync(struct work_struct *work); | ||
| 241 | 361 | ||
| 242 | extern int cancel_work_sync(struct work_struct *work); | 362 | extern bool flush_delayed_work(struct delayed_work *dwork); |
| 363 | extern bool flush_delayed_work_sync(struct delayed_work *work); | ||
| 364 | extern bool cancel_delayed_work_sync(struct delayed_work *dwork); | ||
| 365 | |||
| 366 | extern void workqueue_set_max_active(struct workqueue_struct *wq, | ||
| 367 | int max_active); | ||
| 368 | extern bool workqueue_congested(unsigned int cpu, struct workqueue_struct *wq); | ||
| 369 | extern unsigned int work_cpu(struct work_struct *work); | ||
| 370 | extern unsigned int work_busy(struct work_struct *work); | ||
| 243 | 371 | ||
| 244 | /* | 372 | /* |
| 245 | * Kill off a pending schedule_delayed_work(). Note that the work callback | 373 | * Kill off a pending schedule_delayed_work(). Note that the work callback |
| @@ -247,9 +375,9 @@ extern int cancel_work_sync(struct work_struct *work); | |||
| 247 | * it returns 1 and the work doesn't re-arm itself. Run flush_workqueue() or | 375 | * it returns 1 and the work doesn't re-arm itself. Run flush_workqueue() or |
| 248 | * cancel_work_sync() to wait on it. | 376 | * cancel_work_sync() to wait on it. |
| 249 | */ | 377 | */ |
| 250 | static inline int cancel_delayed_work(struct delayed_work *work) | 378 | static inline bool cancel_delayed_work(struct delayed_work *work) |
| 251 | { | 379 | { |
| 252 | int ret; | 380 | bool ret; |
| 253 | 381 | ||
| 254 | ret = del_timer_sync(&work->timer); | 382 | ret = del_timer_sync(&work->timer); |
| 255 | if (ret) | 383 | if (ret) |
| @@ -262,9 +390,9 @@ static inline int cancel_delayed_work(struct delayed_work *work) | |||
| 262 | * if it returns 0 the timer function may be running and the queueing is in | 390 | * if it returns 0 the timer function may be running and the queueing is in |
| 263 | * progress. | 391 | * progress. |
| 264 | */ | 392 | */ |
| 265 | static inline int __cancel_delayed_work(struct delayed_work *work) | 393 | static inline bool __cancel_delayed_work(struct delayed_work *work) |
| 266 | { | 394 | { |
| 267 | int ret; | 395 | bool ret; |
| 268 | 396 | ||
| 269 | ret = del_timer(&work->timer); | 397 | ret = del_timer(&work->timer); |
| 270 | if (ret) | 398 | if (ret) |
| @@ -272,8 +400,6 @@ static inline int __cancel_delayed_work(struct delayed_work *work) | |||
| 272 | return ret; | 400 | return ret; |
| 273 | } | 401 | } |
| 274 | 402 | ||
| 275 | extern int cancel_delayed_work_sync(struct delayed_work *work); | ||
| 276 | |||
| 277 | /* Obsolete. use cancel_delayed_work_sync() */ | 403 | /* Obsolete. use cancel_delayed_work_sync() */ |
| 278 | static inline | 404 | static inline |
| 279 | void cancel_rearming_delayed_workqueue(struct workqueue_struct *wq, | 405 | void cancel_rearming_delayed_workqueue(struct workqueue_struct *wq, |
| @@ -297,4 +423,11 @@ static inline long work_on_cpu(unsigned int cpu, long (*fn)(void *), void *arg) | |||
| 297 | #else | 423 | #else |
| 298 | long work_on_cpu(unsigned int cpu, long (*fn)(void *), void *arg); | 424 | long work_on_cpu(unsigned int cpu, long (*fn)(void *), void *arg); |
| 299 | #endif /* CONFIG_SMP */ | 425 | #endif /* CONFIG_SMP */ |
| 426 | |||
| 427 | #ifdef CONFIG_FREEZER | ||
| 428 | extern void freeze_workqueues_begin(void); | ||
| 429 | extern bool freeze_workqueues_busy(void); | ||
| 430 | extern void thaw_workqueues(void); | ||
| 431 | #endif /* CONFIG_FREEZER */ | ||
| 432 | |||
| 300 | #endif | 433 | #endif |
diff --git a/include/linux/writeback.h b/include/linux/writeback.h index c24eca71e80c..09eec350054d 100644 --- a/include/linux/writeback.h +++ b/include/linux/writeback.h | |||
| @@ -10,8 +10,6 @@ | |||
| 10 | struct backing_dev_info; | 10 | struct backing_dev_info; |
| 11 | 11 | ||
| 12 | extern spinlock_t inode_lock; | 12 | extern spinlock_t inode_lock; |
| 13 | extern struct list_head inode_in_use; | ||
| 14 | extern struct list_head inode_unused; | ||
| 15 | 13 | ||
| 16 | /* | 14 | /* |
| 17 | * fs/fs-writeback.c | 15 | * fs/fs-writeback.c |
| @@ -124,8 +122,9 @@ struct ctl_table; | |||
| 124 | int dirty_writeback_centisecs_handler(struct ctl_table *, int, | 122 | int dirty_writeback_centisecs_handler(struct ctl_table *, int, |
| 125 | void __user *, size_t *, loff_t *); | 123 | void __user *, size_t *, loff_t *); |
| 126 | 124 | ||
| 127 | void get_dirty_limits(unsigned long *pbackground, unsigned long *pdirty, | 125 | void global_dirty_limits(unsigned long *pbackground, unsigned long *pdirty); |
| 128 | unsigned long *pbdi_dirty, struct backing_dev_info *bdi); | 126 | unsigned long bdi_dirty_limit(struct backing_dev_info *bdi, |
| 127 | unsigned long dirty); | ||
| 129 | 128 | ||
| 130 | void page_writeback_init(void); | 129 | void page_writeback_init(void); |
| 131 | void balance_dirty_pages_ratelimited_nr(struct address_space *mapping, | 130 | void balance_dirty_pages_ratelimited_nr(struct address_space *mapping, |
| @@ -142,12 +141,16 @@ typedef int (*writepage_t)(struct page *page, struct writeback_control *wbc, | |||
| 142 | 141 | ||
| 143 | int generic_writepages(struct address_space *mapping, | 142 | int generic_writepages(struct address_space *mapping, |
| 144 | struct writeback_control *wbc); | 143 | struct writeback_control *wbc); |
| 144 | void tag_pages_for_writeback(struct address_space *mapping, | ||
| 145 | pgoff_t start, pgoff_t end); | ||
| 145 | int write_cache_pages(struct address_space *mapping, | 146 | int write_cache_pages(struct address_space *mapping, |
| 146 | struct writeback_control *wbc, writepage_t writepage, | 147 | struct writeback_control *wbc, writepage_t writepage, |
| 147 | void *data); | 148 | void *data); |
| 148 | int do_writepages(struct address_space *mapping, struct writeback_control *wbc); | 149 | int do_writepages(struct address_space *mapping, struct writeback_control *wbc); |
| 149 | void set_page_dirty_balance(struct page *page, int page_mkwrite); | 150 | void set_page_dirty_balance(struct page *page, int page_mkwrite); |
| 150 | void writeback_set_ratelimit(void); | 151 | void writeback_set_ratelimit(void); |
| 152 | void tag_pages_for_writeback(struct address_space *mapping, | ||
| 153 | pgoff_t start, pgoff_t end); | ||
| 151 | 154 | ||
| 152 | /* pdflush.c */ | 155 | /* pdflush.c */ |
| 153 | extern int nr_pdflush_threads; /* Global so it can be exported to sysctl | 156 | extern int nr_pdflush_threads; /* Global so it can be exported to sysctl |
diff --git a/include/linux/xattr.h b/include/linux/xattr.h index 0cfa1e9c4cc1..f1e5bde4b35a 100644 --- a/include/linux/xattr.h +++ b/include/linux/xattr.h | |||
| @@ -33,6 +33,20 @@ | |||
| 33 | #define XATTR_USER_PREFIX "user." | 33 | #define XATTR_USER_PREFIX "user." |
| 34 | #define XATTR_USER_PREFIX_LEN (sizeof (XATTR_USER_PREFIX) - 1) | 34 | #define XATTR_USER_PREFIX_LEN (sizeof (XATTR_USER_PREFIX) - 1) |
| 35 | 35 | ||
| 36 | /* Security namespace */ | ||
| 37 | #define XATTR_SELINUX_SUFFIX "selinux" | ||
| 38 | #define XATTR_NAME_SELINUX XATTR_SECURITY_PREFIX XATTR_SELINUX_SUFFIX | ||
| 39 | |||
| 40 | #define XATTR_SMACK_SUFFIX "SMACK64" | ||
| 41 | #define XATTR_SMACK_IPIN "SMACK64IPIN" | ||
| 42 | #define XATTR_SMACK_IPOUT "SMACK64IPOUT" | ||
| 43 | #define XATTR_NAME_SMACK XATTR_SECURITY_PREFIX XATTR_SMACK_SUFFIX | ||
| 44 | #define XATTR_NAME_SMACKIPIN XATTR_SECURITY_PREFIX XATTR_SMACK_IPIN | ||
| 45 | #define XATTR_NAME_SMACKIPOUT XATTR_SECURITY_PREFIX XATTR_SMACK_IPOUT | ||
| 46 | |||
| 47 | #define XATTR_CAPS_SUFFIX "capability" | ||
| 48 | #define XATTR_NAME_CAPS XATTR_SECURITY_PREFIX XATTR_CAPS_SUFFIX | ||
| 49 | |||
| 36 | struct inode; | 50 | struct inode; |
| 37 | struct dentry; | 51 | struct dentry; |
| 38 | 52 | ||
